Как обработать лишний 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")
}
}
Ответ #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 потребуют действий.
-
10
-
2
-
5
-
23
-
4
-
15
-
1
-
10
-
9
-
5
-
5
-
7
-
14
-
2
-
10
-
6
-
9
-
6
-
5
-
8
-
6
-
3
-
11
-
1
-
2
-
1
-
2
-
2
-
4
-
11
-
5
-
4
-
2
-
2
-
6
-
5
-
9
-
6
-
5
-
2
-
4
-
12
-
4
-
2
-
5
-
6
-
4
-
2
-
3
-
5