]> Cypherpunks repositories - gostls13.git/commitdiff
http: fix TLS handshake blocking server accept loop
authorBrad Fitzpatrick <bradfitz@golang.org>
Tue, 20 Sep 2011 02:56:51 +0000 (19:56 -0700)
committerBrad Fitzpatrick <bradfitz@golang.org>
Tue, 20 Sep 2011 02:56:51 +0000 (19:56 -0700)
Fixes #2263

R=golang-dev, adg
CC=golang-dev
https://golang.org/cl/5076042

src/pkg/http/serve_test.go
src/pkg/http/server.go

index 17439110f06a745cbf7339d4ad5fc66eda83ce6c..86653216fca024847757dce0e7a6c4a7f60f9120 100644 (file)
@@ -545,6 +545,19 @@ func TestTLSServer(t *testing.T) {
                }
        }))
        defer ts.Close()
+
+       // Connect an idle TCP connection to this server before we run
+       // our real tests.  This idle connection used to block forever
+       // in the TLS handshake, preventing future connections from
+       // being accepted. It may prevent future accidental blocking
+       // in newConn.
+       idleConn, err := net.Dial("tcp", ts.Listener.Addr().String())
+       if err != nil {
+               t.Fatalf("Dial: %v", err)
+       }
+       defer idleConn.Close()
+       time.AfterFunc(10e9, func() { t.Fatalf("Timeout") })
+
        if !strings.HasPrefix(ts.URL, "https://") {
                t.Fatalf("expected test TLS server to start with https://, got %q", ts.URL)
        }
index 654af378a1b3573348bf336fdc3ff7028df7772c..6be3611f0f5c7c94d9b057f8195439cc72f78fd7 100644 (file)
@@ -178,13 +178,6 @@ func (srv *Server) newConn(rwc net.Conn) (c *conn, err os.Error) {
        br := bufio.NewReader(c.lr)
        bw := bufio.NewWriter(rwc)
        c.buf = bufio.NewReadWriter(br, bw)
-
-       if tlsConn, ok := rwc.(*tls.Conn); ok {
-               tlsConn.Handshake()
-               c.tlsState = new(tls.ConnectionState)
-               *c.tlsState = tlsConn.ConnectionState()
-       }
-
        return c, nil
 }
 
@@ -562,6 +555,12 @@ func (c *conn) serve() {
                log.Print(buf.String())
        }()
 
+       if tlsConn, ok := c.rwc.(*tls.Conn); ok {
+               tlsConn.Handshake()
+               c.tlsState = new(tls.ConnectionState)
+               *c.tlsState = tlsConn.ConnectionState()
+       }
+
        for {
                w, err := c.readRequest()
                if err != nil {