Skip to content

Commit 893d686

Browse files
committed
net/http: update bundled http2, add h2 Transport.IdleConnTimeout tests
Updates bundled http2 to x/net git rev a333c53 for: http2: add Transport support for IdleConnTimeout https://golang.org/cl/30075 And add tests. The bundled http2 also includes a change adding a Ping method to http2.ClientConn, but that type isn't exposed in the standard library. Nevertheless, the code gets compiled and adds a dependency on "crypto/rand", requiring an update to go/build's dependency test. Because net/http already depends on crypto/tls, which uses crypto/rand, it's not really a new dependency. Fixes golang#16808 Change-Id: I1ec8666ea74762f27c70a6f30a366a6647f923f7 Reviewed-on: https://go-review.googlesource.com/30078 Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
1 parent 4415021 commit 893d686

File tree

4 files changed

+137
-16
lines changed

4 files changed

+137
-16
lines changed

src/go/build/deps_test.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -376,16 +376,21 @@ var pkgDeps = map[string][]string{
376376
// HTTP, kingpin of dependencies.
377377
"net/http": {
378378
"L4", "NET", "OS",
379-
"context", "compress/gzip", "container/list", "crypto/tls",
380-
"mime/multipart", "runtime/debug",
381-
"net/http/internal",
379+
"compress/gzip",
380+
"container/list",
381+
"context",
382+
"crypto/rand",
383+
"crypto/tls",
382384
"golang_org/x/net/http2/hpack",
383385
"golang_org/x/net/idna",
384386
"golang_org/x/net/lex/httplex",
385387
"golang_org/x/text/unicode/norm",
386388
"golang_org/x/text/width",
387389
"internal/nettrace",
390+
"mime/multipart",
388391
"net/http/httptrace",
392+
"net/http/internal",
393+
"runtime/debug",
389394
},
390395
"net/http/internal": {"L4"},
391396
"net/http/httptrace": {"context", "internal/nettrace", "net", "reflect", "time"},

src/net/http/export_test.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,24 @@ func (t *Transport) IdleConnStrsForTesting() []string {
100100
return ret
101101
}
102102

103+
func (t *Transport) IdleConnStrsForTesting_h2() []string {
104+
var ret []string
105+
noDialPool := t.h2transport.ConnPool.(http2noDialClientConnPool)
106+
pool := noDialPool.http2clientConnPool
107+
108+
pool.mu.Lock()
109+
defer pool.mu.Unlock()
110+
111+
for k, cc := range pool.conns {
112+
for range cc {
113+
ret = append(ret, k)
114+
}
115+
}
116+
117+
sort.Strings(ret)
118+
return ret
119+
}
120+
103121
func (t *Transport) IdleConnCountForTesting(cacheKey string) int {
104122
t.idleMu.Lock()
105123
defer t.idleMu.Unlock()

src/net/http/h2_bundle.go

Lines changed: 91 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/net/http/transport_test.go

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3481,27 +3481,36 @@ func TestTransportMaxIdleConns(t *testing.T) {
34813481
}
34823482
}
34833483

3484-
func TestTransportIdleConnTimeout(t *testing.T) {
3484+
func TestTransportIdleConnTimeout_h1(t *testing.T) { testTransportIdleConnTimeout(t, h1Mode) }
3485+
func TestTransportIdleConnTimeout_h2(t *testing.T) { testTransportIdleConnTimeout(t, h2Mode) }
3486+
func testTransportIdleConnTimeout(t *testing.T, h2 bool) {
34853487
if testing.Short() {
34863488
t.Skip("skipping in short mode")
34873489
}
34883490
defer afterTest(t)
34893491

3490-
ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
3492+
const timeout = 1 * time.Second
3493+
3494+
cst := newClientServerTest(t, h2, HandlerFunc(func(w ResponseWriter, r *Request) {
34913495
// No body for convenience.
34923496
}))
3493-
defer ts.Close()
3494-
3495-
const timeout = 1 * time.Second
3496-
tr := &Transport{
3497-
IdleConnTimeout: timeout,
3498-
}
3497+
defer cst.close()
3498+
tr := cst.tr
3499+
tr.IdleConnTimeout = timeout
34993500
defer tr.CloseIdleConnections()
35003501
c := &Client{Transport: tr}
35013502

3503+
idleConns := func() []string {
3504+
if h2 {
3505+
return tr.IdleConnStrsForTesting_h2()
3506+
} else {
3507+
return tr.IdleConnStrsForTesting()
3508+
}
3509+
}
3510+
35023511
var conn string
35033512
doReq := func(n int) {
3504-
req, _ := NewRequest("GET", ts.URL, nil)
3513+
req, _ := NewRequest("GET", cst.ts.URL, nil)
35053514
req = req.WithContext(httptrace.WithClientTrace(context.Background(), &httptrace.ClientTrace{
35063515
PutIdleConn: func(err error) {
35073516
if err != nil {
@@ -3514,7 +3523,7 @@ func TestTransportIdleConnTimeout(t *testing.T) {
35143523
t.Fatal(err)
35153524
}
35163525
res.Body.Close()
3517-
conns := tr.IdleConnStrsForTesting()
3526+
conns := idleConns()
35183527
if len(conns) != 1 {
35193528
t.Fatalf("req %v: unexpected number of idle conns: %q", n, conns)
35203529
}
@@ -3530,7 +3539,7 @@ func TestTransportIdleConnTimeout(t *testing.T) {
35303539
time.Sleep(timeout / 2)
35313540
}
35323541
time.Sleep(timeout * 3 / 2)
3533-
if got := tr.IdleConnStrsForTesting(); len(got) != 0 {
3542+
if got := idleConns(); len(got) != 0 {
35343543
t.Errorf("idle conns = %q; want none", got)
35353544
}
35363545
}

0 commit comments

Comments
 (0)