@@ -2026,6 +2026,60 @@ func TestTransportReadHeadResponse(t *testing.T) {
2026
2026
ct .run ()
2027
2027
}
2028
2028
2029
+ func TestTransportReadHeadResponseWithBody (t * testing.T ) {
2030
+ response := "redirecting to /elsewhere"
2031
+ ct := newClientTester (t )
2032
+ clientDone := make (chan struct {})
2033
+ ct .client = func () error {
2034
+ defer close (clientDone )
2035
+ req , _ := http .NewRequest ("HEAD" , "https://dummy.tld/" , nil )
2036
+ res , err := ct .tr .RoundTrip (req )
2037
+ if err != nil {
2038
+ return err
2039
+ }
2040
+ if res .ContentLength != int64 (len (response )) {
2041
+ return fmt .Errorf ("Content-Length = %d; want %d" , res .ContentLength , len (response ))
2042
+ }
2043
+ slurp , err := ioutil .ReadAll (res .Body )
2044
+ if err != nil {
2045
+ return fmt .Errorf ("ReadAll: %v" , err )
2046
+ }
2047
+ if len (slurp ) > 0 {
2048
+ return fmt .Errorf ("Unexpected non-empty ReadAll body: %q" , slurp )
2049
+ }
2050
+ return nil
2051
+ }
2052
+ ct .server = func () error {
2053
+ ct .greet ()
2054
+ for {
2055
+ f , err := ct .fr .ReadFrame ()
2056
+ if err != nil {
2057
+ t .Logf ("ReadFrame: %v" , err )
2058
+ return nil
2059
+ }
2060
+ hf , ok := f .(* HeadersFrame )
2061
+ if ! ok {
2062
+ continue
2063
+ }
2064
+ var buf bytes.Buffer
2065
+ enc := hpack .NewEncoder (& buf )
2066
+ enc .WriteField (hpack.HeaderField {Name : ":status" , Value : "200" })
2067
+ enc .WriteField (hpack.HeaderField {Name : "content-length" , Value : strconv .Itoa (len (response ))})
2068
+ ct .fr .WriteHeaders (HeadersFrameParam {
2069
+ StreamID : hf .StreamID ,
2070
+ EndHeaders : true ,
2071
+ EndStream : false ,
2072
+ BlockFragment : buf .Bytes (),
2073
+ })
2074
+ ct .fr .WriteData (hf .StreamID , true , []byte (response ))
2075
+
2076
+ <- clientDone
2077
+ return nil
2078
+ }
2079
+ }
2080
+ ct .run ()
2081
+ }
2082
+
2029
2083
type neverEnding byte
2030
2084
2031
2085
func (b neverEnding ) Read (p []byte ) (int , error ) {
0 commit comments