-3

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.

Jonathan Hall
  • 75,165
  • 16
  • 143
  • 189
Abhinav
  • 975
  • 4
  • 18
  • 35
  • 2
    Setting headers after they have already been written has no effect. Either remove the WriteHeader call (it's redundant if called with 200), or call WriteHeader after all headers have been set. – Peter May 14 '19 at 13:39
  • 1
    Content-Length and chunked encoding are mutually exclusive. You can't do both. – Jonathan Hall May 14 '19 at 13:59
  • @Peter: Not entirely true... it _can_ have an effect, by setting footers. – Jonathan Hall May 14 '19 at 14:00

1 Answers1

1

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.
Adrian
  • 42,911
  • 6
  • 107
  • 99