@@ -2290,6 +2290,60 @@ func TestTransportReadHeadResponse(t *testing.T) {
2290
2290
ct .run ()
2291
2291
}
2292
2292
2293
+ func TestTransportReadHeadResponseWithBody (t * testing.T ) {
2294
+ response := "redirecting to /elsewhere"
2295
+ ct := newClientTester (t )
2296
+ clientDone := make (chan struct {})
2297
+ ct .client = func () error {
2298
+ defer close (clientDone )
2299
+ req , _ := http .NewRequest ("HEAD" , "https://dummy.tld/" , nil )
2300
+ res , err := ct .tr .RoundTrip (req )
2301
+ if err != nil {
2302
+ return err
2303
+ }
2304
+ if res .ContentLength != int64 (len (response )) {
2305
+ return fmt .Errorf ("Content-Length = %d; want %d" , res .ContentLength , len (response ))
2306
+ }
2307
+ slurp , err := ioutil .ReadAll (res .Body )
2308
+ if err != nil {
2309
+ return fmt .Errorf ("ReadAll: %v" , err )
2310
+ }
2311
+ if len (slurp ) > 0 {
2312
+ return fmt .Errorf ("Unexpected non-empty ReadAll body: %q" , slurp )
2313
+ }
2314
+ return nil
2315
+ }
2316
+ ct .server = func () error {
2317
+ ct .greet ()
2318
+ for {
2319
+ f , err := ct .fr .ReadFrame ()
2320
+ if err != nil {
2321
+ t .Logf ("ReadFrame: %v" , err )
2322
+ return nil
2323
+ }
2324
+ hf , ok := f .(* HeadersFrame )
2325
+ if ! ok {
2326
+ continue
2327
+ }
2328
+ var buf bytes.Buffer
2329
+ enc := hpack .NewEncoder (& buf )
2330
+ enc .WriteField (hpack.HeaderField {Name : ":status" , Value : "200" })
2331
+ enc .WriteField (hpack.HeaderField {Name : "content-length" , Value : strconv .Itoa (len (response ))})
2332
+ ct .fr .WriteHeaders (HeadersFrameParam {
2333
+ StreamID : hf .StreamID ,
2334
+ EndHeaders : true ,
2335
+ EndStream : false ,
2336
+ BlockFragment : buf .Bytes (),
2337
+ })
2338
+ ct .fr .WriteData (hf .StreamID , true , []byte (response ))
2339
+
2340
+ <- clientDone
2341
+ return nil
2342
+ }
2343
+ }
2344
+ ct .run ()
2345
+ }
2346
+
2293
2347
type neverEnding byte
2294
2348
2295
2349
func (b neverEnding ) Read (p []byte ) (int , error ) {
0 commit comments