Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 非常零星的Go HTTP错误:多个response.WriteHeader调用_Sockets_Http_Go - Fatal编程技术网

Sockets 非常零星的Go HTTP错误:多个response.WriteHeader调用

Sockets 非常零星的Go HTTP错误:多个response.WriteHeader调用,sockets,http,go,Sockets,Http,Go,我编写了一个开源的Kubernetes入口/API管理工具,对于大约1/200k请求,我收到以下致命错误: 2017/08/16 12:40:57 http: multiple response.WriteHeader calls {"level":"error","method":"GET","msg":"unknown error","time":"2017-08-16T12:40:57Z","uri":"/ommitted/path"} {"level":"fatal","msg":"wr

我编写了一个开源的Kubernetes入口/API管理工具,对于大约1/200k请求,我收到以下致命错误:

2017/08/16 12:40:57 http: multiple response.WriteHeader calls
{"level":"error","method":"GET","msg":"unknown error","time":"2017-08-16T12:40:57Z","uri":"/ommitted/path"}
{"level":"fatal","msg":"write tcp4 192.168.2.160:8443-\u003e192.168.4.0:54554: write: broken pipe","time":"2017-08-16T12:40:57Z"}
我真的很难复制它,但这里是相关的代码。Kanali是一个大型项目,但td;lr是指在执行第一个代码段之后,执行第二个被剪断的代码,该代码处理错误

func (step WriteResponseStep) Do(ctx context.Context, m *metrics.Metrics, c *controller.Controller, w http.ResponseWriter, r *http.Request, resp *http.Response, trace opentracing.Span) error {
    for k, v := range resp.Header {
        for _, value := range v {
            w.Header().Set(k, value)
        }
    }
    closer, str, err := utils.DupReaderAndString(resp.Body)
    if err != nil {
        logrus.Errorf("error copying response body, response may not be as expected: %s", err.Error())
    }
    trace.SetTag("http.status_code", resp.StatusCode)
    trace.SetTag("http.response_body", str)
    w.WriteHeader(resp.StatusCode)
    if _, err := io.Copy(w, closer); err != nil {
        return err
    }
    return nil
}
在代码的后面

if err != nil {

    w.Header().Set("Content-Type", "application/json")

    switch e := err.(type) {
    case utils.Error:
        logrus.WithFields(logrus.Fields{
            "method": r.Method,
            "uri":    r.RequestURI,
        }).Error(e.Error())

        errStatus, err := json.Marshal(utils.JSONErr{Code: e.Status(), Msg: e.Error()})
        if err != nil {
            logrus.Warnf("could not marsah request headers into JSON - tracing data maybe not be as expected")
        }
        w.WriteHeader(e.Status())
        if err := json.NewEncoder(w).Encode(utils.JSONErr{Code: e.Status(), Msg: e.Error()}); err != nil {
            logrus.Fatal(err.Error())
        }
    default:
        logrus.WithFields(logrus.Fields{
            "method": r.Method,
            "uri":    r.RequestURI,
        }).Error("unknown error")
        errStatus, err := json.Marshal(utils.JSONErr{Code: http.StatusInternalServerError, Msg: "unknown error"})
        if err != nil {
            logrus.Warnf("could not marsah request headers into JSON - tracing data maybe not be as expected")
        }
        w.WriteHeader(http.StatusInternalServerError)
        if err := json.NewEncoder(w).Encode(utils.JSONErr{Code: http.StatusInternalServerError, Msg: "unknown error"}); err != nil {
            logrus.Fatal(err.Error())
        }
    }
}

错误消息告诉您WriteHeader被调用不止一次(通过调用Write直接或间接)。标头只能写入网络一次。这两个代码段都有对WriteHeader的调用。

错误消息告诉您WriteHeader被多次调用(通过调用Write直接或间接)。标头只能写入网络一次。这两个代码段都有对WriteHeader的调用。

错误消息告诉您WriteHeader被多次调用(通过调用Write直接或间接地调用)。标头只能写入网络一次。这两个代码段都有对WriteHeader的调用…好吧,所以它如此零星的原因是只有在执行此操作时才会发生错误:@CeriseLimón如果您将您的评论转换为答案,我会将其标记为正确答案:)错误消息告诉您WriteHeader被多次调用(直接或间接地通过调用Write)标头只能写入网络一次。两个代码段都调用WriteHeader…好吧,所以它如此零散的原因是只有在执行此操作时才会发生错误:@CeriseLimón如果您将注释转换为答案,我会将其标记为正确答案:)