@@ -101,12 +101,50 @@ func resetHooks() {
101
101
testHookOnPanicMu .Unlock ()
102
102
}
103
103
104
+ func newTestServer (t testing.TB , handler http.HandlerFunc , opts ... interface {}) * httptest.Server {
105
+ ts := httptest .NewUnstartedServer (handler )
106
+ ts .EnableHTTP2 = true
107
+ ts .Config .ErrorLog = log .New (twriter {t : t }, "" , log .LstdFlags )
108
+ h2server := new (Server )
109
+ for _ , opt := range opts {
110
+ switch v := opt .(type ) {
111
+ case func (* httptest.Server ):
112
+ v (ts )
113
+ case func (* Server ):
114
+ v (h2server )
115
+ default :
116
+ t .Fatalf ("unknown newTestServer option type %T" , v )
117
+ }
118
+ }
119
+ ConfigureServer (ts .Config , h2server )
120
+
121
+ // ConfigureServer populates ts.Config.TLSConfig.
122
+ // Copy it to ts.TLS as well.
123
+ ts .TLS = ts .Config .TLSConfig
124
+
125
+ // Go 1.22 changes the default minimum TLS version to TLS 1.2,
126
+ // in order to properly test cases where we want to reject low
127
+ // TLS versions, we need to explicitly configure the minimum
128
+ // version here.
129
+ ts .Config .TLSConfig .MinVersion = tls .VersionTLS10
130
+
131
+ ts .StartTLS ()
132
+ t .Cleanup (func () {
133
+ ts .CloseClientConnections ()
134
+ ts .Close ()
135
+ })
136
+
137
+ return ts
138
+ }
139
+
104
140
type serverTesterOpt string
105
141
106
- var optOnlyServer = serverTesterOpt ("only_server" )
107
- var optQuiet = serverTesterOpt ("quiet_logging" )
108
142
var optFramerReuseFrames = serverTesterOpt ("frame_reuse_frames" )
109
143
144
+ var optQuiet = func (ts * httptest.Server ) {
145
+ ts .Config .ErrorLog = log .New (io .Discard , "" , 0 )
146
+ }
147
+
110
148
func newServerTester (t testing.TB , handler http.HandlerFunc , opts ... interface {}) * serverTester {
111
149
resetHooks ()
112
150
@@ -117,7 +155,7 @@ func newServerTester(t testing.TB, handler http.HandlerFunc, opts ...interface{}
117
155
NextProtos : []string {NextProtoTLS },
118
156
}
119
157
120
- var onlyServer , quiet , framerReuseFrames bool
158
+ var framerReuseFrames bool
121
159
h2server := new (Server )
122
160
for _ , opt := range opts {
123
161
switch v := opt .(type ) {
@@ -129,10 +167,6 @@ func newServerTester(t testing.TB, handler http.HandlerFunc, opts ...interface{}
129
167
v (h2server )
130
168
case serverTesterOpt :
131
169
switch v {
132
- case optOnlyServer :
133
- onlyServer = true
134
- case optQuiet :
135
- quiet = true
136
170
case optFramerReuseFrames :
137
171
framerReuseFrames = true
138
172
}
@@ -159,9 +193,7 @@ func newServerTester(t testing.TB, handler http.HandlerFunc, opts ...interface{}
159
193
st .hpackDec = hpack .NewDecoder (initialHeaderTableSize , st .onHeaderField )
160
194
161
195
ts .TLS = ts .Config .TLSConfig // the httptest.Server has its own copy of this TLS config
162
- if quiet {
163
- ts .Config .ErrorLog = log .New (ioutil .Discard , "" , 0 )
164
- } else {
196
+ if ts .Config .ErrorLog == nil {
165
197
ts .Config .ErrorLog = log .New (io .MultiWriter (stderrv (), twriter {t : t , st : st }, & st .serverLogBuf ), "" , log .LstdFlags )
166
198
}
167
199
ts .StartTLS ()
@@ -175,32 +207,30 @@ func newServerTester(t testing.TB, handler http.HandlerFunc, opts ...interface{}
175
207
st .sc = v
176
208
}
177
209
log .SetOutput (io .MultiWriter (stderrv (), twriter {t : t , st : st }))
178
- if ! onlyServer {
179
- cc , err := tls .Dial ("tcp" , ts .Listener .Addr ().String (), tlsConfig )
180
- if err != nil {
181
- t .Fatal (err )
210
+ cc , err := tls .Dial ("tcp" , ts .Listener .Addr ().String (), tlsConfig )
211
+ if err != nil {
212
+ t .Fatal (err )
213
+ }
214
+ st .cc = cc
215
+ st .fr = NewFramer (cc , cc )
216
+ if framerReuseFrames {
217
+ st .fr .SetReuseFrames ()
218
+ }
219
+ if ! logFrameReads && ! logFrameWrites {
220
+ st .fr .debugReadLoggerf = func (m string , v ... interface {}) {
221
+ m = time .Now ().Format ("2006-01-02 15:04:05.999999999 " ) + strings .TrimPrefix (m , "http2: " ) + "\n "
222
+ st .frameReadLogMu .Lock ()
223
+ fmt .Fprintf (& st .frameReadLogBuf , m , v ... )
224
+ st .frameReadLogMu .Unlock ()
182
225
}
183
- st .cc = cc
184
- st .fr = NewFramer (cc , cc )
185
- if framerReuseFrames {
186
- st .fr .SetReuseFrames ()
187
- }
188
- if ! logFrameReads && ! logFrameWrites {
189
- st .fr .debugReadLoggerf = func (m string , v ... interface {}) {
190
- m = time .Now ().Format ("2006-01-02 15:04:05.999999999 " ) + strings .TrimPrefix (m , "http2: " ) + "\n "
191
- st .frameReadLogMu .Lock ()
192
- fmt .Fprintf (& st .frameReadLogBuf , m , v ... )
193
- st .frameReadLogMu .Unlock ()
194
- }
195
- st .fr .debugWriteLoggerf = func (m string , v ... interface {}) {
196
- m = time .Now ().Format ("2006-01-02 15:04:05.999999999 " ) + strings .TrimPrefix (m , "http2: " ) + "\n "
197
- st .frameWriteLogMu .Lock ()
198
- fmt .Fprintf (& st .frameWriteLogBuf , m , v ... )
199
- st .frameWriteLogMu .Unlock ()
200
- }
201
- st .fr .logReads = true
202
- st .fr .logWrites = true
226
+ st .fr .debugWriteLoggerf = func (m string , v ... interface {}) {
227
+ m = time .Now ().Format ("2006-01-02 15:04:05.999999999 " ) + strings .TrimPrefix (m , "http2: " ) + "\n "
228
+ st .frameWriteLogMu .Lock ()
229
+ fmt .Fprintf (& st .frameWriteLogBuf , m , v ... )
230
+ st .frameWriteLogMu .Unlock ()
203
231
}
232
+ st .fr .logReads = true
233
+ st .fr .logWrites = true
204
234
}
205
235
return st
206
236
}
@@ -3067,16 +3097,15 @@ func testServerWritesTrailers(t *testing.T, withFlush bool) {
3067
3097
func TestServerWritesUndeclaredTrailers (t * testing.T ) {
3068
3098
const trailer = "Trailer-Header"
3069
3099
const value = "hi1"
3070
- st := newServerTester (t , func (w http.ResponseWriter , r * http.Request ) {
3100
+ ts := newTestServer (t , func (w http.ResponseWriter , r * http.Request ) {
3071
3101
w .Header ().Set (http .TrailerPrefix + trailer , value )
3072
- }, optOnlyServer )
3073
- defer st .Close ()
3102
+ })
3074
3103
3075
3104
tr := & Transport {TLSClientConfig : tlsConfigInsecure }
3076
3105
defer tr .CloseIdleConnections ()
3077
3106
3078
3107
cl := & http.Client {Transport : tr }
3079
- resp , err := cl .Get (st . ts .URL )
3108
+ resp , err := cl .Get (ts .URL )
3080
3109
if err != nil {
3081
3110
t .Fatal (err )
3082
3111
}
@@ -3731,7 +3760,7 @@ func TestExpect100ContinueAfterHandlerWrites(t *testing.T) {
3731
3760
doRead := make (chan bool , 1 )
3732
3761
defer close (doRead ) // fallback cleanup
3733
3762
3734
- st := newServerTester (t , func (w http.ResponseWriter , r * http.Request ) {
3763
+ ts := newTestServer (t , func (w http.ResponseWriter , r * http.Request ) {
3735
3764
io .WriteString (w , msg )
3736
3765
w .(http.Flusher ).Flush ()
3737
3766
@@ -3740,14 +3769,12 @@ func TestExpect100ContinueAfterHandlerWrites(t *testing.T) {
3740
3769
r .Body .Read (make ([]byte , 10 ))
3741
3770
3742
3771
io .WriteString (w , msg2 )
3743
-
3744
- }, optOnlyServer )
3745
- defer st .Close ()
3772
+ })
3746
3773
3747
3774
tr := & Transport {TLSClientConfig : tlsConfigInsecure }
3748
3775
defer tr .CloseIdleConnections ()
3749
3776
3750
- req , _ := http .NewRequest ("POST" , st . ts .URL , io .LimitReader (neverEnding ('A' ), 2 << 20 ))
3777
+ req , _ := http .NewRequest ("POST" , ts .URL , io .LimitReader (neverEnding ('A' ), 2 << 20 ))
3751
3778
req .Header .Set ("Expect" , "100-continue" )
3752
3779
3753
3780
res , err := tr .RoundTrip (req )
@@ -3808,14 +3835,13 @@ func TestUnreadFlowControlReturned_Server(t *testing.T) {
3808
3835
unblock := make (chan bool , 1 )
3809
3836
defer close (unblock )
3810
3837
3811
- st := newServerTester (t , func (w http.ResponseWriter , r * http.Request ) {
3838
+ ts := newTestServer (t , func (w http.ResponseWriter , r * http.Request ) {
3812
3839
// Don't read the 16KB request body. Wait until the client's
3813
3840
// done sending it and then return. This should cause the Server
3814
3841
// to then return those 16KB of flow control to the client.
3815
3842
tt .reqFn (r )
3816
3843
<- unblock
3817
- }, optOnlyServer )
3818
- defer st .Close ()
3844
+ })
3819
3845
3820
3846
tr := & Transport {TLSClientConfig : tlsConfigInsecure }
3821
3847
defer tr .CloseIdleConnections ()
@@ -3833,7 +3859,7 @@ func TestUnreadFlowControlReturned_Server(t *testing.T) {
3833
3859
return 0 , io .EOF
3834
3860
}),
3835
3861
)
3836
- req , _ := http .NewRequest ("POST" , st . ts .URL , body )
3862
+ req , _ := http .NewRequest ("POST" , ts .URL , body )
3837
3863
res , err := tr .RoundTrip (req )
3838
3864
if err != nil {
3839
3865
t .Fatal (tt .name , err )
@@ -3949,22 +3975,21 @@ func TestIssue20704Race(t *testing.T) {
3949
3975
itemCount = 100
3950
3976
)
3951
3977
3952
- st := newServerTester (t , func (w http.ResponseWriter , r * http.Request ) {
3978
+ ts := newTestServer (t , func (w http.ResponseWriter , r * http.Request ) {
3953
3979
for i := 0 ; i < itemCount ; i ++ {
3954
3980
_ , err := w .Write (make ([]byte , itemSize ))
3955
3981
if err != nil {
3956
3982
return
3957
3983
}
3958
3984
}
3959
- }, optOnlyServer )
3960
- defer st .Close ()
3985
+ })
3961
3986
3962
3987
tr := & Transport {TLSClientConfig : tlsConfigInsecure }
3963
3988
defer tr .CloseIdleConnections ()
3964
3989
cl := & http.Client {Transport : tr }
3965
3990
3966
3991
for i := 0 ; i < 1000 ; i ++ {
3967
- resp , err := cl .Get (st . ts .URL )
3992
+ resp , err := cl .Get (ts .URL )
3968
3993
if err != nil {
3969
3994
t .Fatal (err )
3970
3995
}
@@ -4241,26 +4266,25 @@ func TestContentEncodingNoSniffing(t *testing.T) {
4241
4266
4242
4267
for _ , tt := range resps {
4243
4268
t .Run (tt .name , func (t * testing.T ) {
4244
- st := newServerTester (t , func (w http.ResponseWriter , r * http.Request ) {
4269
+ ts := newTestServer (t , func (w http.ResponseWriter , r * http.Request ) {
4245
4270
if tt .contentEncoding != nil {
4246
4271
w .Header ().Set ("Content-Encoding" , tt .contentEncoding .(string ))
4247
4272
}
4248
4273
w .Write (tt .body )
4249
- }, optOnlyServer )
4250
- defer st .Close ()
4274
+ })
4251
4275
4252
4276
tr := & Transport {TLSClientConfig : tlsConfigInsecure }
4253
4277
defer tr .CloseIdleConnections ()
4254
4278
4255
- req , _ := http .NewRequest ("GET" , st . ts .URL , nil )
4279
+ req , _ := http .NewRequest ("GET" , ts .URL , nil )
4256
4280
res , err := tr .RoundTrip (req )
4257
4281
if err != nil {
4258
- t .Fatalf ("GET %s: %v" , st . ts .URL , err )
4282
+ t .Fatalf ("GET %s: %v" , ts .URL , err )
4259
4283
}
4260
4284
defer res .Body .Close ()
4261
4285
4262
4286
g := res .Header .Get ("Content-Encoding" )
4263
- t .Logf ("%s: Content-Encoding: %s" , st . ts .URL , g )
4287
+ t .Logf ("%s: Content-Encoding: %s" , ts .URL , g )
4264
4288
4265
4289
if w := tt .contentEncoding ; g != w {
4266
4290
if w != nil { // The case where contentEncoding was set explicitly.
@@ -4274,7 +4298,7 @@ func TestContentEncodingNoSniffing(t *testing.T) {
4274
4298
if w := tt .wantContentType ; g != w {
4275
4299
t .Errorf ("Content-Type mismatch\n \t got: %q\n \t want: %q" , g , w )
4276
4300
}
4277
- t .Logf ("%s: Content-Type: %s" , st . ts .URL , g )
4301
+ t .Logf ("%s: Content-Type: %s" , ts .URL , g )
4278
4302
})
4279
4303
}
4280
4304
}
@@ -4606,7 +4630,7 @@ func TestCanonicalHeaderCacheGrowth(t *testing.T) {
4606
4630
// We should not access the slice after this point.
4607
4631
func TestServerWriteDoesNotRetainBufferAfterReturn (t * testing.T ) {
4608
4632
donec := make (chan struct {})
4609
- st := newServerTester (t , func (w http.ResponseWriter , r * http.Request ) {
4633
+ ts := newTestServer (t , func (w http.ResponseWriter , r * http.Request ) {
4610
4634
defer close (donec )
4611
4635
buf := make ([]byte , 1 << 20 )
4612
4636
var i byte
@@ -4620,13 +4644,12 @@ func TestServerWriteDoesNotRetainBufferAfterReturn(t *testing.T) {
4620
4644
return
4621
4645
}
4622
4646
}
4623
- }, optOnlyServer )
4624
- defer st .Close ()
4647
+ })
4625
4648
4626
4649
tr := & Transport {TLSClientConfig : tlsConfigInsecure }
4627
4650
defer tr .CloseIdleConnections ()
4628
4651
4629
- req , _ := http .NewRequest ("GET" , st . ts .URL , nil )
4652
+ req , _ := http .NewRequest ("GET" , ts .URL , nil )
4630
4653
res , err := tr .RoundTrip (req )
4631
4654
if err != nil {
4632
4655
t .Fatal (err )
@@ -4642,7 +4665,7 @@ func TestServerWriteDoesNotRetainBufferAfterReturn(t *testing.T) {
4642
4665
// We should not access the slice after this point.
4643
4666
func TestServerWriteDoesNotRetainBufferAfterServerClose (t * testing.T ) {
4644
4667
donec := make (chan struct {}, 1 )
4645
- st := newServerTester (t , func (w http.ResponseWriter , r * http.Request ) {
4668
+ ts := newTestServer (t , func (w http.ResponseWriter , r * http.Request ) {
4646
4669
donec <- struct {}{}
4647
4670
defer close (donec )
4648
4671
buf := make ([]byte , 1 << 20 )
@@ -4657,20 +4680,19 @@ func TestServerWriteDoesNotRetainBufferAfterServerClose(t *testing.T) {
4657
4680
return
4658
4681
}
4659
4682
}
4660
- }, optOnlyServer )
4661
- defer st .Close ()
4683
+ })
4662
4684
4663
4685
tr := & Transport {TLSClientConfig : tlsConfigInsecure }
4664
4686
defer tr .CloseIdleConnections ()
4665
4687
4666
- req , _ := http .NewRequest ("GET" , st . ts .URL , nil )
4688
+ req , _ := http .NewRequest ("GET" , ts .URL , nil )
4667
4689
res , err := tr .RoundTrip (req )
4668
4690
if err != nil {
4669
4691
t .Fatal (err )
4670
4692
}
4671
4693
defer res .Body .Close ()
4672
4694
<- donec
4673
- st . ts .Config .Close ()
4695
+ ts .Config .Close ()
4674
4696
<- donec
4675
4697
}
4676
4698
0 commit comments