| // Copyright 2024 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| //go:build go1.24 |
| |
| package http2 |
| |
| import ( |
| "net/http" |
| "testing" |
| "time" |
| ) |
| |
| func TestConfigServerSettings(t *testing.T) { |
| config := &http.HTTP2Config{ |
| MaxConcurrentStreams: 1, |
| MaxDecoderHeaderTableSize: 1<<20 + 2, |
| MaxEncoderHeaderTableSize: 1<<20 + 3, |
| MaxReadFrameSize: 1<<20 + 4, |
| MaxReceiveBufferPerConnection: 64<<10 + 5, |
| MaxReceiveBufferPerStream: 64<<10 + 6, |
| } |
| const maxHeaderBytes = 4096 + 7 |
| st := newServerTester(t, nil, func(s *http.Server) { |
| s.MaxHeaderBytes = maxHeaderBytes |
| s.HTTP2 = config |
| }) |
| st.writePreface() |
| st.writeSettings() |
| st.wantSettings(map[SettingID]uint32{ |
| SettingMaxConcurrentStreams: uint32(config.MaxConcurrentStreams), |
| SettingHeaderTableSize: uint32(config.MaxDecoderHeaderTableSize), |
| SettingInitialWindowSize: uint32(config.MaxReceiveBufferPerStream), |
| SettingMaxFrameSize: uint32(config.MaxReadFrameSize), |
| SettingMaxHeaderListSize: maxHeaderBytes + (32 * 10), |
| }) |
| } |
| |
| func TestConfigTransportSettings(t *testing.T) { |
| config := &http.HTTP2Config{ |
| MaxConcurrentStreams: 1, // ignored by Transport |
| MaxDecoderHeaderTableSize: 1<<20 + 2, |
| MaxEncoderHeaderTableSize: 1<<20 + 3, |
| MaxReadFrameSize: 1<<20 + 4, |
| MaxReceiveBufferPerConnection: 64<<10 + 5, |
| MaxReceiveBufferPerStream: 64<<10 + 6, |
| } |
| const maxHeaderBytes = 4096 + 7 |
| tc := newTestClientConn(t, func(tr *http.Transport) { |
| tr.HTTP2 = config |
| tr.MaxResponseHeaderBytes = maxHeaderBytes |
| }) |
| tc.wantSettings(map[SettingID]uint32{ |
| SettingHeaderTableSize: uint32(config.MaxDecoderHeaderTableSize), |
| SettingInitialWindowSize: uint32(config.MaxReceiveBufferPerStream), |
| SettingMaxFrameSize: uint32(config.MaxReadFrameSize), |
| SettingMaxHeaderListSize: maxHeaderBytes + (32 * 10), |
| }) |
| tc.wantWindowUpdate(0, uint32(config.MaxReceiveBufferPerConnection)) |
| } |
| |
| func TestConfigPingTimeoutServer(t *testing.T) { |
| st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { |
| }, func(s *Server) { |
| s.ReadIdleTimeout = 2 * time.Second |
| s.PingTimeout = 3 * time.Second |
| }) |
| st.greet() |
| |
| st.advance(2 * time.Second) |
| _ = readFrame[*PingFrame](t, st) |
| st.advance(3 * time.Second) |
| st.wantClosed() |
| } |
| |
| func TestConfigPingTimeoutTransport(t *testing.T) { |
| tc := newTestClientConn(t, func(tr *Transport) { |
| tr.ReadIdleTimeout = 2 * time.Second |
| tr.PingTimeout = 3 * time.Second |
| }) |
| tc.greet() |
| |
| req, _ := http.NewRequest("GET", "https://dummy.tld/", nil) |
| rt := tc.roundTrip(req) |
| tc.wantFrameType(FrameHeaders) |
| |
| tc.advance(2 * time.Second) |
| tc.wantFrameType(FramePing) |
| tc.advance(3 * time.Second) |
| err := rt.err() |
| if err == nil { |
| t.Fatalf("expected connection to close") |
| } |
| } |