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:
@ -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.
|
||||
|
@ -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 {
|
||||
|
@ -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()
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
|
Reference in New Issue
Block a user