Ответ 1
В принципе, поскольку вы обращаетесь к 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()