как избежать отправки заголовка Content-Length

#go

#Вперед

Вопрос:

Для конечной точки потокового http есть ли способ воздержаться от отправки длины?

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

Это то, что я получаю обратно.

 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
  

Сервер также выводит предупреждение.

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

Ответ №1:

Вы не должны вручную устанавливать Transfer-Encoding . Go сделает это за вас, а также Content-Length .

curl , http-клиент Go или любой стандартный http-клиент автоматически прочитает правильно фрагментированный или не фрагментированный http-ответ.

Небольшой пример фрагментированного сервера: 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)
        }
}
  

В случае изображения / jpeg вы можете либо делегировать фрагментированное решение Go, либо вручную отправить N байтов из изображения, а затем сбросить.

Комментарии:

1. Только что заметил двойное кодирование переноса в вашем примере. Просто удалите set transfert-encoding , content-length и он должен работать нормально 🙂

2. Чтобы уточнить: net / http будет по умолчанию отправлять Transfer-Encoding: chunked , как только вы вызываете методы WriteHeader или Write в ResponseWriter; если вы хотите, чтобы длина содержимого в ответе, отправляемом обработчиком, вы должны установить заголовок самостоятельно.