Простой HTTPS-запрос: Golang возвращает 505, Python и Chrome - PullRequest
0 голосов
/ 21 сентября 2018

Я пытаюсь выполнить HTTP-передачу по TLS, используя простейший код golang и получая ответ 505 от сервера (версия HTTP не поддерживается).Дело в том, что с простым Python запросы. Получить тот же запрос работает.Кроме того, я могу использовать Chrome и успешно выполнить тот же запрос.

Любые идеи, которые отличают запрос golang от других, которые заставили бы сервер вернуть 505?

Я понимаю, что этот ответ является серверомконкретный.HTTPS к google.com с тем же кодом golang работает.Я попытался устранить неполадки с Wireshark, но TLS делает это трудно.Кажется, это должно быть что-то простое!Сервер nginx 1.9.3.

Код Голанга:

package main

import (
        "fmt"
        "net/http"
        "time"
)

func main() {
        url := "https://non-public-address/page"
        tr := &http.Transport{
                MaxIdleConns:       10,
                IdleConnTimeout:    30 * time.Second,
                DisableCompression: false,
        }
        client := &http.Client{Transport: tr}
        resp, _ := client.Get(url)
        fmt.Println(resp)
}

Python:

r = requests.get("https://non-public-address/page")
print(r)

Ответы [ 2 ]

0 голосов
/ 23 сентября 2018

Я выяснил проблему в конечном итоге, расшифровав трафик в Wireshark.URL в моей реализации Go содержит пробелы, и при использовании http.Get URL не кодирует пробелы до% 20.С пробелами в GET-запросе сервер неверно истолковал запрос.

Извлеченный урок: http.Get в Go не использует URL для кодирования символов, и вы должны сделать это самостоятельно.

0 голосов
/ 21 сентября 2018

505. HTTP-версия не поддерживается.

Вы не установили HTTP-версию на Transport, а

DefaultTransport поддерживает HTTP / 2.

- Go net/http пакет документов

Поддержка протокола HTTP / 2 была введена в Nginx 1.9.5.

Поскольку вы не делали 'Если бы вы не указали HTTP / 2, я бы подумал, что связь вернется к 1.1, если 2 не будет поддерживаться на сервере, но статус в ответе и версии HTTP, поддерживаемые с обеих сторон, являются подозрительными.

Transport можно настроить на использование HTTP / 1.1.

В качестве альтернативы, не используйте пользовательские Transport:

resp, err := http.Get("https://non-public-address/page")

Из net/http документов / источника:

Клиент - это клиент HTTP.Его нулевое значение (DefaultClient) является используемым клиентом, который использует DefaultTransport .... DefaultClient является клиентом по умолчанию и используется Get, Head и Post.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...