@@ -1899,17 +1899,20 @@ func (srv *Server) ListenAndServe() error {
1899
1899
return srv .Serve (tcpKeepAliveListener {ln .(* net.TCPListener )})
1900
1900
}
1901
1901
1902
+ var testHookServerServe func (* Server , net.Listener ) // used if non-nil
1903
+
1902
1904
// Serve accepts incoming connections on the Listener l, creating a
1903
1905
// new service goroutine for each. The service goroutines read requests and
1904
1906
// then call srv.Handler to reply to them.
1905
1907
// Serve always returns a non-nil error.
1906
1908
func (srv * Server ) Serve (l net.Listener ) error {
1907
1909
defer l .Close ()
1910
+ if fn := testHookServerServe ; fn != nil {
1911
+ fn (srv , l )
1912
+ }
1908
1913
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
1913
1916
}
1914
1917
for {
1915
1918
rw , e := l .Accept ()
@@ -2044,9 +2047,16 @@ func (srv *Server) ListenAndServeTLS(certFile, keyFile string) error {
2044
2047
if addr == "" {
2045
2048
addr = ":https"
2046
2049
}
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
+
2047
2057
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" )
2050
2060
}
2051
2061
2052
2062
if len (config .Certificates ) == 0 || certFile != "" || keyFile != "" {
@@ -2067,9 +2077,15 @@ func (srv *Server) ListenAndServeTLS(certFile, keyFile string) error {
2067
2077
return srv .Serve (tlsListener )
2068
2078
}
2069
2079
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 () {
2073
2089
// Enable HTTP/2 by default if the user hasn't otherwise
2074
2090
// configured their TLSNextProto map.
2075
2091
if srv .TLSNextProto == nil {
@@ -2304,3 +2320,12 @@ func numLeadingCRorLF(v []byte) (n int) {
2304
2320
return
2305
2321
2306
2322
}
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