Как обработать лишний 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