@@ -1899,17 +1899,20 @@ func (srv *Server) ListenAndServe() error {
18991899 return srv .Serve (tcpKeepAliveListener {ln .(* net.TCPListener )})
19001900}
19011901
1902+ var testHookServerServe func (* Server , net.Listener ) // used if non-nil
1903+
19021904// Serve accepts incoming connections on the Listener l, creating a
19031905// new service goroutine for each. The service goroutines read requests and
19041906// then call srv.Handler to reply to them.
19051907// Serve always returns a non-nil error.
19061908func (srv * Server ) Serve (l net.Listener ) error {
19071909 defer l .Close ()
1910+ if fn := testHookServerServe ; fn != nil {
1911+ fn (srv , l )
1912+ }
19081913 var tempDelay time.Duration // how long to sleep on accept failure
1909- srv .nextProtoOnce .Do (srv .setNextProtoDefaults )
1910- if srv .nextProtoErr != nil {
1911- // Error from http2 ConfigureServer (e.g. bad ciphersuites)
1912- return srv .nextProtoErr
1914+ if err := srv .setupHTTP2 (); err != nil {
1915+ return err
19131916 }
19141917 for {
19151918 rw , e := l .Accept ()
@@ -2044,9 +2047,16 @@ func (srv *Server) ListenAndServeTLS(certFile, keyFile string) error {
20442047 if addr == "" {
20452048 addr = ":https"
20462049 }
2050+
2051+ // Setup HTTP/2 before srv.Serve, to initialize srv.TLSConfig
2052+ // before we clone it and create the TLS Listener.
2053+ if err := srv .setupHTTP2 (); err != nil {
2054+ return err
2055+ }
2056+
20472057 config := cloneTLSConfig (srv .TLSConfig )
2048- if config .NextProtos == nil {
2049- config .NextProtos = [] string { "http/1.1" }
2058+ if ! strSliceContains ( config .NextProtos , "http/1.1" ) {
2059+ config .NextProtos = append ( config . NextProtos , "http/1.1" )
20502060 }
20512061
20522062 if len (config .Certificates ) == 0 || certFile != "" || keyFile != "" {
@@ -2067,9 +2077,15 @@ func (srv *Server) ListenAndServeTLS(certFile, keyFile string) error {
20672077 return srv .Serve (tlsListener )
20682078}
20692079
2070- // setNextProtoDefaults configures HTTP/2.
2071- // It must only be called via srv.nextProtoOnce.
2072- func (srv * Server ) setNextProtoDefaults () {
2080+ func (srv * Server ) setupHTTP2 () error {
2081+ srv .nextProtoOnce .Do (srv .onceSetNextProtoDefaults )
2082+ return srv .nextProtoErr
2083+ }
2084+
2085+ // onceSetNextProtoDefaults configures HTTP/2, if the user hasn't
2086+ // configured otherwise. (by setting srv.TLSNextProto non-nil)
2087+ // It must only be called via srv.nextProtoOnce (use srv.setupHTTP2).
2088+ func (srv * Server ) onceSetNextProtoDefaults () {
20732089 // Enable HTTP/2 by default if the user hasn't otherwise
20742090 // configured their TLSNextProto map.
20752091 if srv .TLSNextProto == nil {
@@ -2304,3 +2320,12 @@ func numLeadingCRorLF(v []byte) (n int) {
23042320 return
23052321
23062322}
2323+
2324+ func strSliceContains (ss []string , s string ) bool {
2325+ for _ , v := range ss {
2326+ if v == s {
2327+ return true
2328+ }
2329+ }
2330+ return false
2331+ }
0 commit comments