Как обработать лишний response.WriteHeader, чтобы вернуть 500

Мне известно, что метод WriteHeader для http.ResponseWriter может быть 9X_golang вызван только один раз для каждого ответа 9X_go-language HTTP, может иметь только один код состояния 9X_go ответа и может отправлять заголовки только 9X_go один раз. Все в порядке.

Вопрос в том, как 9X_golang мне провести рефакторинг моего кода, чтобы 9X_go-language переопределить 201 и вернуть 500, если http.ResponseWriter.Write возвращает 9X_go-language ошибку? Как вы можете видеть ниже, я специально 9X_golang вызываю панику, чтобы увидеть, как httprouter.Router.PanicHandler справится 9X_golang с этим. Как и ожидалось, в журналах отображается 9X_golang http: superfluous response.WriteHeader call from ..., а ответ - 201, потому что, как описано выше, уже 9X_golang слишком поздно.

package server import ( "github.com/julienschmidt/httprouter" "log" "net/http" ) func Serve() { rtr := httprouter.New() rtr.GET("/", home.Welcome) handle500(rtr) err := http.ListenAndServe(":8080", rtr) if err != nil { log.Fatalf("server crash") } } func handle500(r *httprouter.Router) { r.PanicHandler = func(res http.ResponseWriter, req *http.Request, err interface{}) { res.WriteHeader(http.StatusInternalServerError) // http: superfluous response.WriteHeader call from line above } } 
package home import ( "github.com/julienschmidt/httprouter" "net/http" ) func Welcome(res http.ResponseWriter, _ *http.Request, _ httprouter.Params) { // doing a few bits and building the body res.Header().Set("Content-Type", "application/json") res.WriteHeader(201) _, err := res.Write("body goes here") if err == nil { // I am doing this deliberately to test 500 panic("assume that something has gone wrong with res.Write and an error occurred") } } 

15
0
1
Общее количество ответов: 1

Ответ #1

Ответ на вопрос: Как обработать лишний response.WriteHeader, чтобы вернуть 500

Невозможно «переопределить» код состояния, поскольку 9X_go он немедленно отправляется браузеру.

Вы проверяете 9X_golang возвращаемое значение http.ResponseWriter.Write(). Я не уверен, что 9X_golang это хорошая стратегия. Если написать ответ 9X_go не удалось, то велика вероятность, что и 9X_go-language написать больше тоже не удастся.

Регистрация 9X_go сбоя кажется более подходящей, но я ожидаю, что 9X_go большинство сбоев будет связано с обрывом 9X_golang соединений и другими ошибками, которые не 9X_golang потребуют действий.

16
0