服务器关闭请求流时如何关闭HTTP / 2客户端流?

时间:2019-08-01 06:30:54

标签: go http2

使用net / http Go库创建HTTP / 2客户端和服务器程序,以流式传输客户端和服务器请求响应。取自代码https://github.com/golang/go/issues/13444#issuecomment-161115822

服务器代码

func handle_stream_request(w http.ResponseWriter, r *http.Request) {

    buf := make([]byte, 1024)
    i := 0
    for {
        i = i + 1
        if i == 10 {
            break
        }
        len, _ := r.Body.Read(buf)
        response_str := "Server ACK for: " + string(buf[:len])
        w.Write([]byte(response_str))
        if f, ok := w.(http.Flusher); ok {
            f.Flush()
        }
    }
}

客户代码


func send_stream_request(client *http.Client) {
    pr, pw := io.Pipe()
    req, _ := http.NewRequest("PUT", "https://localhost:8000/", ioutil.NopCloser(pr))
    var res *http.Response

    go func() {
        for {
            time.Sleep(2 * time.Second)
            s := "Client ping@" + get_time()
            pw.Write([]byte(s))
            if res != nil {
                buf := make([]byte, 1024)
                len, _ := res.Body.Read(buf)
                log.Printf("Response is: %s", string(buf[:len]))
            }
        }
    }()

    go func() {
        response, _ := client.Do(req)
        res = response
        log.Printf("\n Got: %#v", res)
    }()
    select {}
}

您期望看到什么?

客户端发出10个请求后,客户端程序应成功退出。

您看到了什么?

在服务器完成句柄功能后,由于没有读取器读取管道上的数据,因此客户端程序在管道“ pw.Write([] byte(s))”处写入阻塞。

我无法理解如何停止此类客户端程序的挂起。服务器向客户端发送的请求流已关闭的信号是什么,它不应尝试在管道上写入更多内容。

0 个答案:

没有答案