如何使用 Server.TLSNextProto 禁用 HTTP/2

我有一个处理 https 请求的 Go 服务器:


package main

import (

        "fmt"

        "net/http"

        "log"

)

const (

        port       = "5966"

        cert       = "/tmp/cert.pem"

        key        = "/tmp/key.pem"

)

func main() {


        listen_at := ":" + port

        fmt.Println("Listening at", listen_at)

        go http.HandleFunc("/job_handler/", job_handler)

        log.Fatal(http.ListenAndServeTLS(listen_at, cert, key, nil))

}

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

       // do somework

}

事实证明,在 https 模式下,Go 对 HTTP/2 协议有透明的支持。我们有一些客户端在 HTTP/2 中行为明显错误,因此我们需要在服务器端禁用 HTTP/2。


不幸的是,我无法使用 ENV 变量GODEBUG=http2server=0来禁用 HTTP/2。剩下的内容Server.TLSNextProto如此处记录的那样。


如何Server.TLSNextProto在我的服务器代码上使用上面的代码来禁用 https/2?


临摹微笑
浏览 142回答 1
1回答

隔江千里

禁用 HTTP/2 的最简单设置是package mainimport (    "log"    "net/http"    "crypto/tls")func main() {    m := http.NewServeMux()    srv := &http.Server{        Handler:      m,        Addr:         "127.0.0.1:8080",        TLSNextProto: make(map[string]func(*http.Server, *tls.Conn, http.Handler)),    }    log.Fatal(srv.ListenAndServe())}您可以通过以下方式验证支持curl -v --http2-prior-knowledge http://localhost:8080
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go