Есть ли способ настроить статус ответа HTTP в Golang? - PullRequest
0 голосов
/ 19 июня 2019

Мне нужно настроить статус HTTP в обработчике на моем веб-сервере, но я обнаружил, что golang, похоже, не поддерживает полностью настраиваемый HTTP-ответ. Например:

w.WriteHeader(999)

здесьcurl результат:

$ curl -vk -i localhost:9898/hello

*   Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 9898 (#0)
> GET /hello HTTP/1.1
> Host: localhost:9898
> User-Agent: curl/7.54.0
> Accept: */*
> 
< HTTP/1.1 999 status code 999
HTTP/1.1 999 status code 999
< Date: Wed, 19 Jun 2019 02:01:09 GMT
Date: Wed, 19 Jun 2019 02:01:09 GMT
< Content-Length: 0
Content-Length: 0

кажется, что status code в результате не может быть изменен ... но я хочу определить свой собственный статус, например Bad Request: xxx.

Есть ли хорошие идеи?Большое спасибо!

Ответы [ 2 ]

6 голосов
/ 19 июня 2019

Я не думаю, что вы пытаетесь в настоящее время поддерживается.

Согласно официальной документации net/http.ResponseWriter.WriteHeader:

Предоставленный код должен быть действительным кодом состояния HTTP 1xx-5xx. Можно написать только один заголовок. Go в настоящее время не поддерживает отправку определенных пользователем заголовков 1xx, за исключением заголовка ответа 100-continue, который Сервер отправляет автоматически при чтении Request.Body.

3 голосов
/ 19 июня 2019

Эта функция обрабатывается в net / http / server.go :

func writeStatusLine(bw *bufio.Writer, is11 bool, code int, scratch []byte) {
    if is11 {
        bw.WriteString("HTTP/1.1 ")
    } else {
        bw.WriteString("HTTP/1.0 ")
    }
    if text, ok := statusText[code]; ok {
        bw.Write(strconv.AppendInt(scratch[:0], int64(code), 10))
        bw.WriteByte(' ')
        bw.WriteString(text)
        bw.WriteString("\r\n")
    } else {
        // don't worry about performance
        fmt.Fprintf(bw, "%03d status code %d\r\n", code, code)
    }
}

Из этого вы можете видеть, что описательный текст взят из внутреннего списка кодов состояния стандартной библиотеки., то же самое предоставляется функцией StatusText .

Если нет известного текста, используется заполнитель «код состояния», без возможности изменить это поведение.

То есть со стандартной библиотекой http, нет способа сделать то, что вы хотите.Вы можете выбрать и / или повторно реализовать эту функцию в своем собственном пакете или (возможно, в долгосрочной перспективе) отправить запрос функции в восходящем направлении, чтобы изменить эту функцию.

Если эта функциональность действительно необходима дляпо какой-то причине, последний отчаянный подход может заключаться в написании какого-либо прокси-сервера, который перехватывает вывод HTTP и преобразует текст «кода состояния» для вас.Вы могли бы сделать это, написав свою собственную реализацию / оболочку net.Listener, которую вы затем передаете http.Serve.Это не будет очень эффективным и крайне не рекомендуется, если у вас нет абсолютно никакой другой возможности.

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