Merge pull request #608 from menghanl/better_http2_header_newline_error

Use ErrorDetail() to provide better error msg for malformed HTTP2
This commit is contained in:
Qi Zhao
2016-03-28 13:17:04 -07:00
4 changed files with 10 additions and 5 deletions

View File

@ -325,7 +325,7 @@ type rpcError struct {
}
func (e rpcError) Error() string {
return fmt.Sprintf("rpc error: code = %d desc = %q", e.code, e.desc)
return fmt.Sprintf("rpc error: code = %d desc = %s", e.code, e.desc)
}
// Code returns the error code for err if it was produced by the rpc system.

View File

@ -721,14 +721,14 @@ func (t *http2Client) operateHeaders(frame *http2.MetaHeadersFrame) {
s.write(recvMsg{err: io.EOF})
}
func handleMalformedHTTP2(s *Stream, err http2.StreamError) {
func handleMalformedHTTP2(s *Stream, err error) {
s.mu.Lock()
if !s.headerDone {
close(s.headerChan)
s.headerDone = true
}
s.mu.Unlock()
s.write(recvMsg{err: StreamErrorf(http2ErrConvTab[err.Code], "%v", err)})
s.write(recvMsg{err: err})
}
// reader runs as a separate goroutine in charge of reading data from network
@ -763,7 +763,8 @@ func (t *http2Client) reader() {
s := t.activeStreams[se.StreamID]
t.mu.Unlock()
if s != nil {
handleMalformedHTTP2(s, se)
// use error detail to provide better err message
handleMalformedHTTP2(s, StreamErrorf(http2ErrConvTab[se.Code], "%v", t.framer.errorDetail()))
}
continue
} else {

View File

@ -404,3 +404,7 @@ func (f *framer) flushWrite() error {
func (f *framer) readFrame() (http2.Frame, error) {
return f.fr.ReadFrame()
}
func (f *framer) errorDetail() error {
return f.fr.ErrorDetail()
}

View File

@ -681,7 +681,7 @@ func TestMalformedStatus(t *testing.T) {
t.Fatalf("Failed to write the request: %v", err)
}
p := make([]byte, http2MaxFrameLen)
expectedErr := StreamErrorf(codes.Internal, "stream error: stream ID 1; PROTOCOL_ERROR")
expectedErr := StreamErrorf(codes.Internal, "invalid header field value \"\\n\"")
if _, err = s.dec.Read(p); err != expectedErr {
t.Fatalf("Read the err %v, want %v", err, expectedErr)
}