From 0d61832bf393f7e34f21687a20a7a7835d80a59c Mon Sep 17 00:00:00 2001 From: Carl Lerche Date: Thu, 10 Aug 2017 16:13:36 -0700 Subject: [PATCH] Extra log output --- src/frame/headers.rs | 18 ++++++++++++++++-- src/hpack/decoder.rs | 8 ++++++++ src/proto/framed_read.rs | 2 ++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/frame/headers.rs b/src/frame/headers.rs index 94e2495..f10144a 100644 --- a/src/frame/headers.rs +++ b/src/frame/headers.rs @@ -128,9 +128,17 @@ impl Headers { { let flags = HeadersFlag(head.flag()); + trace!("loading headers; flags={:?}", flags); + // Read the padding length if flags.is_padded() { let pad = src.get_u8() as usize; + let len = src.get_ref().len(); + + if pad >= len { + trace!("too much padding"); + return Err(Error::TooMuchPadding); + } // Truncate the last `pad` bytes. let len = src.get_ref().len() - pad; @@ -178,7 +186,7 @@ impl Headers { // priority. // // TODO: Provide a way to abort decoding if an error is hit. - try!(decoder.decode(src, |header| { + let res = decoder.decode(src, |header| { use hpack::Header::*; match header { @@ -191,9 +199,15 @@ impl Headers { Path(v) => set_pseudo!(path, v), Status(v) => set_pseudo!(status, v), } - })); + }); + + if let Err(e) = res { + trace!("hpack decoding error; err={:?}", e); + return Err(e.into()); + } if err { + trace!("repeated pseudo"); return Err(hpack::DecoderError::RepeatedPseudo.into()); } diff --git a/src/hpack/decoder.rs b/src/hpack/decoder.rs index 70e3212..cc16130 100644 --- a/src/hpack/decoder.rs +++ b/src/hpack/decoder.rs @@ -171,16 +171,20 @@ impl Decoder { self.last_max_update = size; } + trace!("decode"); + while src.has_remaining() { // At this point we are always at the beginning of the next block // within the HPACK data. The type of the block can always be // determined from the first byte. match try!(Representation::load(peek_u8(src))) { Indexed => { + trace!(" Indexed; rem={:?}", src.remaining()); can_resize = false; f(try!(self.decode_indexed(src))); } LiteralWithIndexing => { + trace!(" LiteralWithIndexing; rem={:?}", src.remaining()); can_resize = false; let entry = try!(self.decode_literal(src, true)); @@ -190,11 +194,13 @@ impl Decoder { f(entry); } LiteralWithoutIndexing => { + trace!(" LiteralWithoutIndexing; rem={:?}", src.remaining()); can_resize = false; let entry = try!(self.decode_literal(src, false)); f(entry); } LiteralNeverIndexed => { + trace!(" LiteralNeverIndexed; rem={:?}", src.remaining()); can_resize = false; let entry = try!(self.decode_literal(src, false)); @@ -203,6 +209,7 @@ impl Decoder { f(entry); } SizeUpdate => { + trace!(" SizeUpdate; rem={:?}", src.remaining()); if !can_resize { return Err(DecoderError::InvalidMaxDynamicSize); } @@ -277,6 +284,7 @@ impl Decoder { let len = try!(decode_int(buf, 7)); if len > buf.remaining() { + trace!("decode_string underflow; len={}; remaining={}", len, buf.remaining()); return Err(DecoderError::StringUnderflow); } diff --git a/src/proto/framed_read.rs b/src/proto/framed_read.rs index 1b2d3b5..1691eed 100644 --- a/src/proto/framed_read.rs +++ b/src/proto/framed_read.rs @@ -50,6 +50,8 @@ impl FramedRead { let kind = head.kind(); + trace!(" -> kind={:?}", kind); + let frame = match kind { Kind::Settings => { frame::Settings::load(head, &bytes[frame::HEADER_LEN..])?.into()