We have written a service which sends some encoded data as chunked to a proxy service which need Content-Length header to be set so that it can send proper response to end point. Even if I set the Content-Length header still it get stripped as part of the response to the client. Below is the code which set the header
func HTTPSuccessResponse(rw http.ResponseWriter, bufferLen int, media []byte) {
rw.WriteHeader(http.StatusOK)
rw.Header().Set("Content-Type", "opus/ogg; audio/ogg; codec=opus")
length := strconv.Itoa(len(media));
rw.Header().Set("Content-Length", length)
rw.Write(media)
}
Below is the response I get when I try to the request using curl
bash-4.2# curl -v -X GET -k -H -i 'http://127.0.0.1:8090/preview'
* About to connect() to 127.0.0.1 port 8090 (#0)
* Trying 127.0.0.1...
* Connected to 127.0.0.1 (127.0.0.1) port 8090 (#0)
> GET /preview HTTP/1.1
> User-Agent: curl/7.29.0
> Host: 127.0.0.1:8090
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Tue, 14 May 2019 13:08:20 GMT
< Content-Type: text/plain; charset=utf-8
< Transfer-Encoding: chunked
<
I am using Gorrila Mux library for setting up HTTP server. Any thoughts how to make the header as part of the response.
Remove the WriteHeader
call at the top. You can only write headers to a response once. After you call WriteHeader
you can't set any more headers.
Per the ResponseWriter documentation:
// Changing the header map after a call to WriteHeader (or
// Write) has no effect unless the modified headers are
// trailers.
So you can't call it first; but you also don't need to call it at all - from the same docs:
// If WriteHeader is not called explicitly, the first call to Write
// will trigger an implicit WriteHeader(http.StatusOK).
// Thus explicit calls to WriteHeader are mainly used to
// send error codes.