]> Cypherpunks repositories - gostls13.git/commitdiff
net/http: log handler panic before closing HTTP connection
authorBrad Fitzpatrick <bradfitz@golang.org>
Thu, 19 Jan 2012 22:19:59 +0000 (14:19 -0800)
committerBrad Fitzpatrick <bradfitz@golang.org>
Thu, 19 Jan 2012 22:19:59 +0000 (14:19 -0800)
Fix originally from rogpeppe in 5414048 but was rolled
back due to test breakage.

This CL makes the test more robust to order of operations.

Fixes #2480 again.

R=golang-dev, gri
CC=golang-dev
https://golang.org/cl/5536072

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

index 9aff467eedb8e91d0640f03b487ad65393299dee..147c216ec78744a1dd1036a3fed0fb676806a519 100644 (file)
@@ -904,17 +904,13 @@ func testHandlerPanic(t *testing.T, withHijack bool) {
                panic("intentional death for testing")
        }))
        defer ts.Close()
-       _, err := Get(ts.URL)
-       if err == nil {
-               t.Logf("expected an error")
-       }
 
        // Do a blocking read on the log output pipe so its logging
        // doesn't bleed into the next test.  But wait only 5 seconds
        // for it.
-       done := make(chan bool)
+       done := make(chan bool, 1)
        go func() {
-               buf := make([]byte, 1024)
+               buf := make([]byte, 4<<10)
                _, err := pr.Read(buf)
                pr.Close()
                if err != nil {
@@ -922,6 +918,12 @@ func testHandlerPanic(t *testing.T, withHijack bool) {
                }
                done <- true
        }()
+
+       _, err := Get(ts.URL)
+       if err == nil {
+               t.Logf("expected an error")
+       }
+
        select {
        case <-done:
                return
index 22ea8e31720026f3e2d21e9e8690a82c9cc078ab..bad3bcb28969c17d65e776897b00380a3d27cd89 100644 (file)
@@ -569,14 +569,15 @@ func (c *conn) serve() {
                if err == nil {
                        return
                }
-               if c.rwc != nil { // may be nil if connection hijacked
-                       c.rwc.Close()
-               }
 
                var buf bytes.Buffer
                fmt.Fprintf(&buf, "http: panic serving %v: %v\n", c.remoteAddr, err)
                buf.Write(debug.Stack())
                log.Print(buf.String())
+
+               if c.rwc != nil { // may be nil if connection hijacked
+                       c.rwc.Close()
+               }
        }()
 
        if tlsConn, ok := c.rwc.(*tls.Conn); ok {