Golang HTTP检查是否已写入ResponseWriter

时间:2016-09-09 16:19:35

标签: http go httpresponse

使用Golang的net/http包,如何检查是否已写入ResponseWriter?我收到以下错误消息:

  

http:多个response.WriteHeader调用

当然我可以从我的函数中返回布尔值,这些函数表示我写的ResponseWriter带有重定向或其他东西的天气,我试过,但我当然可以检查ResponseWriter是否有在我用一种简单的方法写信之前写的。

我正在寻找一个类似下面的函数,我可以在写ResponseWriter之前使用它:

if w.Header().Get("Status-Code") == "" {
    http.Redirect(w, r, "/", http.StatusSeeOther)
} else {
    fmt.Println("Response Writer has already been written to.")
}

上面的代码似乎不起作用......任何人都知道如何检查是否已写入ResponseWriter

1 个答案:

答案 0 :(得分:1)

执行此操作的唯一方法是使用http.ResponseWriter的自定义实现:

type doneWriter struct {
    http.ResponseWriter
    done bool
}

func (w *doneWriter) WriteHeader(status int) {
    w.done = true
    w.ResponseWriter.WriteHeader(status)
}

func (w *doneWriter) Write(b []byte) (int, error) {
    w.done = true
    return w.ResponseWriter.Write(b)
}

func myMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        dw := &doneWriter{ResponseWriter: w}
        next.ServeHTTP(dw, r)
        if dw.done {
            // Something already wrote a response
            return
        }
        // Nothing else wrote a response
        w.WriteHeader(http.StatusOK)
        // Whatever you want here
    }
}

我还把a simple package聚集在一起为我处理这件事。如果你愿意,也可以随意使用它。