用在win上用telnet测试发现连接可以长达10分钟保持不断,再次输入http请求仍然可以响应,实际上可不止10分钟,因为我只测试了10分钟,这种长连接会在某些情况下导致服务器问题。怎样强行中断连接?

在数据量大的时候也是以Transfer-Encoding: chunked传输的,实际上下面的代码数据量并不大,w.Write([]byte("hehe"))却又不是chunked。  如果我们的程序不支持chunked响应,要怎么办?

package main

import (
	"encoding/json"
	"fmt"
	"log"
	"net/http"
	"os"
)

func getData() []byte {
	var data = map[string]interface{}{
		"args": os.Args,
		"env":  os.Environ(),
	}
	bts, err := json.MarshalIndent(data, "", "  ")
	if err != nil {
		panic(err)
	}
	return bts
}

/*
telnet测试
GET / HTTP/1.1
Host: 192.168.58.142:8888
Connection: keep-alive
*/
func main() {
	// 此代码在telnet中是长连接的
	// 因为没有设置内容长度,传输会变成 Transfer-Encoding: chunked
	http.HandleFunc("/1", func(w http.ResponseWriter, r *http.Request) {
		w.Write(getData())
	})

	// 强行关闭长连接
	http.HandleFunc("/2", func(w http.ResponseWriter, r *http.Request) {
		w.Header().Set("Connection", "close")
		w.Write(getData())
	})

	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		bts := getData()
		// 因为设置了content-length,所以不再是 Transfer-Encoding: chunked
		// 响应头content-length会自动转换为规范的大小写
		w.Header().Set("ContenT-LeNgth", fmt.Sprintf("%d", len(bts)))
		w.Write(bts)
	})

	log.Fatal(http.ListenAndServe(":8888", nil))
}