AJcodez
AJcodez

Reputation: 34146

how to avoid sending Content-Length header

For a streaming http endpoint is there a way to refrain from sending the length?

  w.Header().Set("Content-Type", "image/jpeg")
  w.Header().Set("Transfer-Encoding", "chunked")
  w.Header().Del("Content-Length")

This is what I get back.

HTTP/1.1 200 OK
Content-Length: 0
Content-Type: image/jpeg
Date: Mon, 23 Jun 2014 10:00:59 GMT
Transfer-Encoding: chunked
Transfer-Encoding: chunked

The server prints a warning as well.

2014/06/23 06:04:03 http: WriteHeader called with both Transfer-Encoding of "chunked" and a Content-Length of 0

Upvotes: 4

Views: 3979

Answers (1)

creack
creack

Reputation: 121442

You should not manually set the Transfer-Encoding. Go is going to do that for you, as well as the Content-Length.

curl, the Go http client or any standard http client will automatically read correctly chunked or non-chunked http response.

Small exmaple of chunked server: http://play.golang.org/p/miEV7URi8P

package main

import (
        "io"
        "log"
        "net/http"
)

// hello world, the web server
func HelloServer(w http.ResponseWriter, req *http.Request) {
        w.WriteHeader(200)
        for i := 0; i < 5; i++ {
                io.WriteString(w, "hello, world!\n")
                w.(http.Flusher).Flush()
        }
}

func main() {
        http.HandleFunc("/", HelloServer)
        err := http.ListenAndServe(":8080", nil)
        if err != nil {
                log.Fatal("ListenAndServe: ", err)
        }
}

In a case of an image/jpeg, you can either delegate the chunked decision to Go or manually send N bytes from the image then flush.

Upvotes: 6

Related Questions