bug fix: processing header fields regardless in order to keep HPACK tables consistent

This commit is contained in:
iamqizhao
2015-04-14 18:50:32 -07:00
parent 9bca4bbd23
commit b8cfe25c6e
3 changed files with 17 additions and 14 deletions

View File

@ -593,7 +593,11 @@ func (t *http2Client) operateHeaders(hDec *hpackDecoder, s *Stream, frame header
hDec.state = decodeState{} hDec.state = decodeState{}
} }
}() }()
endHeaders, err := hDec.decodeClientHTTP2Headers(s, frame) endHeaders, err := hDec.decodeClientHTTP2Headers(frame)
if s == nil {
// s has been closed.
return nil
}
if err != nil { if err != nil {
s.write(recvMsg{err: err}) s.write(recvMsg{err: err})
// Something wrong. Stops reading even when there is remaining. // Something wrong. Stops reading even when there is remaining.
@ -659,16 +663,13 @@ func (t *http2Client) reader() {
} }
switch frame := frame.(type) { switch frame := frame.(type) {
case *http2.HeadersFrame: case *http2.HeadersFrame:
var ok bool // operateHeaders has to be invoked regardless the value of curStream
if curStream, ok = t.getStream(frame); !ok { // because the HPACK decoder needs to be updated using the received
continue // headers.
} curStream, _ = t.getStream(frame)
endStream := frame.Header().Flags.Has(http2.FlagHeadersEndStream) endStream := frame.Header().Flags.Has(http2.FlagHeadersEndStream)
curStream = t.operateHeaders(hDec, curStream, frame, endStream) curStream = t.operateHeaders(hDec, curStream, frame, endStream)
case *http2.ContinuationFrame: case *http2.ContinuationFrame:
if curStream == nil {
continue
}
curStream = t.operateHeaders(hDec, curStream, frame, false) curStream = t.operateHeaders(hDec, curStream, frame, false)
case *http2.DataFrame: case *http2.DataFrame:
t.handleData(frame) t.handleData(frame)

View File

@ -143,7 +143,11 @@ func (t *http2Server) operateHeaders(hDec *hpackDecoder, s *Stream, frame header
hDec.state = decodeState{} hDec.state = decodeState{}
} }
}() }()
endHeaders, err := hDec.decodeServerHTTP2Headers(s, frame) endHeaders, err := hDec.decodeServerHTTP2Headers(frame)
if s == nil {
// s has been closed.
return nil
}
if err != nil { if err != nil {
log.Printf("transport: http2Server.operateHeader found %v", err) log.Printf("transport: http2Server.operateHeader found %v", err)
if se, ok := err.(StreamError); ok { if se, ok := err.(StreamError); ok {
@ -266,9 +270,6 @@ func (t *http2Server) HandleStreams(handle func(*Stream)) {
endStream := frame.Header().Flags.Has(http2.FlagHeadersEndStream) endStream := frame.Header().Flags.Has(http2.FlagHeadersEndStream)
curStream = t.operateHeaders(hDec, curStream, frame, endStream, handle, &wg) curStream = t.operateHeaders(hDec, curStream, frame, endStream, handle, &wg)
case *http2.ContinuationFrame: case *http2.ContinuationFrame:
if curStream == nil {
continue
}
curStream = t.operateHeaders(hDec, curStream, frame, false, handle, &wg) curStream = t.operateHeaders(hDec, curStream, frame, false, handle, &wg)
case *http2.DataFrame: case *http2.DataFrame:
t.handleData(frame) t.handleData(frame)
@ -483,6 +484,7 @@ func (t *http2Server) WriteStatus(s *Stream, statusCode codes.Code, statusDesc s
t.hEnc.WriteField(hpack.HeaderField{Name: k, Value: v}) t.hEnc.WriteField(hpack.HeaderField{Name: k, Value: v})
} }
if err := t.writeHeaders(s, t.hBuf, true); err != nil { if err := t.writeHeaders(s, t.hBuf, true); err != nil {
t.Close()
return err return err
} }
t.closeStream(s) t.closeStream(s)

View File

@ -176,7 +176,7 @@ func newHPACKDecoder() *hpackDecoder {
return d return d
} }
func (d *hpackDecoder) decodeClientHTTP2Headers(s *Stream, frame headerFrame) (endHeaders bool, err error) { func (d *hpackDecoder) decodeClientHTTP2Headers(frame headerFrame) (endHeaders bool, err error) {
d.err = nil d.err = nil
_, err = d.h.Write(frame.HeaderBlockFragment()) _, err = d.h.Write(frame.HeaderBlockFragment())
if err != nil { if err != nil {
@ -196,7 +196,7 @@ func (d *hpackDecoder) decodeClientHTTP2Headers(s *Stream, frame headerFrame) (e
return return
} }
func (d *hpackDecoder) decodeServerHTTP2Headers(s *Stream, frame headerFrame) (endHeaders bool, err error) { func (d *hpackDecoder) decodeServerHTTP2Headers(frame headerFrame) (endHeaders bool, err error) {
d.err = nil d.err = nil
_, err = d.h.Write(frame.HeaderBlockFragment()) _, err = d.h.Write(frame.HeaderBlockFragment())
if err != nil { if err != nil {