Почему request.URL.Host и Scheme пустые на сервере разработки? - PullRequest
31 голосов
/ 01 августа 2011

Я очень новичок в Go.Попробовал это первое hello, world из документации, и хотел прочитать Host и Scheme из запроса:

package hello

import (
    "fmt"
    "http"
)

func init() {
    http.HandleFunc("/", handler)
}

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprint(w, "Host: " + r.URL.Host + " Scheme: " + r.URL.Scheme)
}

Но их значения пустые.Почему?

1 Ответ

46 голосов
/ 02 августа 2011

По сути, поскольку вы обращаетесь к HTTP-серверу не через HTTP-прокси, браузер может выдавать относительный HTTP-запрос, например:

GET / HTTP/1.1
Host: localhost:8080

(Учитывая, что, конечно, сервер прослушивает локальный порт 8080).

Теперь, если вы обращались к указанному серверу с помощью прокси, прокси может использовать абсолютный URL:

GET http://localhost:8080/ HTTP/1.1
Host: localhost:8080

В обоих случаях, то, что вы получаете из Go http.Request.URL, является необработанным URL (как проанализировано библиотекой). В случае, если вы получаете, вы получаете доступ к URL из относительного пути, отсюда и отсутствие хоста или схемы в объекте URL.

Если вы хотите получить хост HTTP, вы можете обратиться к атрибуту Host структуры http.Request. Смотри http://golang.org/pkg/http/#Request

Вы можете проверить это, используя netcat и соответствующим образом отформатированный HTTP-запрос (вы можете скопировать вышеупомянутые блоки, убедитесь, что в вашем файле есть завершающая пустая строка). Чтобы попробовать это:

cat my-http-request-file | nc localhost 8080

Кроме того, вы можете проверить в сервере / обработчике, получаете ли вы относительный или абсолютный URL в запросе, вызвав метод IsAbs():

isAbsoluteURL := r.URL.IsAbs()
...