提问者:小点点

Go语言代理中的分块传输编码


如果直接向: 9098发出请求,我看到响应头传输编码被分块。知道如何调整我的代码以正确解析来自服务器的响应正文并将其发送回客户端吗?

func httpHandler(w http.ResponseWriter, req *http.Request) {
    reqURL := fmt.Sprint(req.URL)
    newUrl = "http://localhost:9098" + reqURL

    //forward request
    client := http.Client{}
    freq, reqerror := http.NewRequest(req.Method, newUrl, nil)
    if reqerror != nil {
        log.Fatalln(reqerror)
    }
    freq.Header = req.Header
    freq.Body = req.Body

    resp, resperr := client.Do(freq)
    if resperr != nil {
        log.Println(resperr)
        fmt.Fprintf(w, "Error. No response")
        return
    }

    defer resp.Body.Close()

    body, ioerr := io.ReadAll(resp.Body)
    if ioerr != nil {
        log.Println(ioerr)
        fmt.Fprintf(w, "IO Error (Response body)")
        return
    }

    w.Header().Set("Content-Type", resp.Header.Get("Content-Type"))
    w.WriteHeader(resp.StatusCode)

    fmt.Fprintf(w, string(body))
}

共1个答案

匿名用户

现在设法解决了这个问题!感谢Steffen Ullrich指出问题可能是“关于压缩内容”。删除此处提到的Accept-Encode标头非常有用。

...
// if you manually set the Accept-Encoding request header, than gzipped response will not automatically decompressed
req.Header.Del("Accept-Encoding")

freq.Header = req.Header
...