[Pkg-golang-commits] [SCM] Packaging for Google Go branch, debian-sid, updated. debian/2%1.0.1-1-12-g5bf837d
Michael Stapelberg
michael at stapelberg.de
Wed Aug 1 21:57:33 UTC 2012
The following commit has been merged in the debian-sid branch:
commit 5bf837d51aeadc214e1f079db55c977788dda348
Author: Michael Stapelberg <stapelberg at debian.org>
Date: Wed Aug 1 23:51:50 2012 +0200
cherry-pick r820ffde8c396 (net/http: non-keepalive connections close successfully) (Closes: #683421)
diff --git a/debian/patches/15-net-http-connection-close.patch b/debian/patches/15-net-http-connection-close.patch
new file mode 100644
index 0000000..847a9f9
--- /dev/null
+++ b/debian/patches/15-net-http-connection-close.patch
@@ -0,0 +1,164 @@
+Description: net/http: non-keepalive connections close successfully
+ Connections did not close if Request.Close or Response.Close was true. This
+ meant that if the user wanted the connection to close, or if the server
+ requested it via "Connection: close", the connection would not be closed.
+Author: James Gray <james at james4k.com>
+Bug-Debian: http://bugs.debian.org/683421
+Origin: upstream, http://code.google.com/p/go/source/detail?r=820ffde8c396
+Forwarded: not-needed
+Last-Update: 2012-08-01
+
+---
+
+--- golang-1.0.2.orig/src/pkg/net/http/transport.go
++++ golang-1.0.2/src/pkg/net/http/transport.go
+@@ -603,6 +603,10 @@ func (pc *persistConn) readLoop() {
+ // before we race and peek on the underlying bufio reader.
+ if waitForBodyRead != nil {
+ <-waitForBodyRead
++ } else if !alive {
++ // If waitForBodyRead is nil, and we're not alive, we
++ // must close the connection before we leave the loop.
++ pc.close()
+ }
+ }
+ }
+--- golang-1.0.2.orig/src/pkg/net/http/transport_test.go
++++ golang-1.0.2/src/pkg/net/http/transport_test.go
+@@ -13,6 +13,7 @@ import (
+ "fmt"
+ "io"
+ "io/ioutil"
++ "net"
+ . "net/http"
+ "net/http/httptest"
+ "net/url"
+@@ -20,6 +21,7 @@ import (
+ "runtime"
+ "strconv"
+ "strings"
++ "sync"
+ "testing"
+ "time"
+ )
+@@ -35,6 +37,64 @@ var hostPortHandler = HandlerFunc(func(w
+ w.Write([]byte(r.RemoteAddr))
+ })
+
++type testCloseConn struct {
++ net.Conn
++ set *testConnSet
++}
++
++func (conn *testCloseConn) Close() error {
++ conn.set.remove(conn)
++ return conn.Conn.Close()
++}
++
++type testConnSet struct {
++ set map[net.Conn]bool
++ mutex sync.Mutex
++}
++
++func (tcs *testConnSet) insert(c net.Conn) {
++ tcs.mutex.Lock()
++ defer tcs.mutex.Unlock()
++ tcs.set[c] = true
++}
++
++func (tcs *testConnSet) remove(c net.Conn) {
++ tcs.mutex.Lock()
++ defer tcs.mutex.Unlock()
++ // just change to false, so we have a full set of opened connections
++ tcs.set[c] = false
++}
++
++// some tests use this to manage raw tcp connections for later inspection
++func makeTestDial() (*testConnSet, func(n, addr string) (net.Conn, error)) {
++ connSet := &testConnSet{
++ set: make(map[net.Conn]bool),
++ }
++ dial := func(n, addr string) (net.Conn, error) {
++ c, err := net.Dial(n, addr)
++ if err != nil {
++ return nil, err
++ }
++ tc := &testCloseConn{c, connSet}
++ connSet.insert(tc)
++ return tc, nil
++ }
++ return connSet, dial
++}
++
++func (tcs *testConnSet) countClosed() (closed, total int) {
++ tcs.mutex.Lock()
++ defer tcs.mutex.Unlock()
++
++ total = len(tcs.set)
++ for _, open := range tcs.set {
++ if !open {
++ closed += 1
++ }
++ }
++ return
++}
++
+ // Two subsequent requests and verify their response is the same.
+ // The response from the server is our own IP:port
+ func TestTransportKeepAlives(t *testing.T) {
+@@ -72,8 +132,12 @@ func TestTransportConnectionCloseOnRespo
+ ts := httptest.NewServer(hostPortHandler)
+ defer ts.Close()
+
++ connSet, testDial := makeTestDial()
++
+ for _, connectionClose := range []bool{false, true} {
+- tr := &Transport{}
++ tr := &Transport{
++ Dial: testDial,
++ }
+ c := &Client{Transport: tr}
+
+ fetch := func(n int) string {
+@@ -107,6 +171,13 @@ func TestTransportConnectionCloseOnRespo
+ t.Errorf("error in connectionClose=%v. unexpected bodiesDiffer=%v; body1=%q; body2=%q",
+ connectionClose, bodiesDiffer, body1, body2)
+ }
++
++ tr.CloseIdleConnections()
++ }
++
++ closed, total := connSet.countClosed()
++ if closed < total {
++ t.Errorf("%d out of %d tcp connections were not closed", total-closed, total)
+ }
+ }
+
+@@ -114,8 +185,12 @@ func TestTransportConnectionCloseOnReque
+ ts := httptest.NewServer(hostPortHandler)
+ defer ts.Close()
+
++ connSet, testDial := makeTestDial()
++
+ for _, connectionClose := range []bool{false, true} {
+- tr := &Transport{}
++ tr := &Transport{
++ Dial: testDial,
++ }
+ c := &Client{Transport: tr}
+
+ fetch := func(n int) string {
+@@ -149,6 +224,13 @@ func TestTransportConnectionCloseOnReque
+ t.Errorf("error in connectionClose=%v. unexpected bodiesDiffer=%v; body1=%q; body2=%q",
+ connectionClose, bodiesDiffer, body1, body2)
+ }
++
++ tr.CloseIdleConnections()
++ }
++
++ closed, total := connSet.countClosed()
++ if closed < total {
++ t.Errorf("%d out of %d tcp connections were not closed", total-closed, total)
+ }
+ }
+
diff --git a/debian/patches/series b/debian/patches/series
index e63f933..2890fb2 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -9,3 +9,4 @@
#013-kFreeBSD-AI_MASK.patch
014-dont_fail_test_with_missing_homedir.patch
godoc-symlinks.diff
+15-net-http-connection-close.patch
--
Packaging for Google Go
More information about the pkg-golang-commits
mailing list