Index: net/spdy/buffered_spdy_framer.cc |
diff --git a/net/spdy/buffered_spdy_framer.cc b/net/spdy/buffered_spdy_framer.cc |
index 4dd34ceda536ea1bc9011d293f92cdea69ae8340..1d346e5a7ea1b20aa82714346bdd1c2cbecfae54 100644 |
--- a/net/spdy/buffered_spdy_framer.cc |
+++ b/net/spdy/buffered_spdy_framer.cc |
@@ -5,6 +5,7 @@ |
#include "net/spdy/buffered_spdy_framer.h" |
#include "base/logging.h" |
+#include "base/strings/string_util.h" |
namespace net { |
@@ -210,12 +211,50 @@ void BufferedSpdyFramer::OnStreamPadding(SpdyStreamId stream_id, size_t len) { |
SpdyHeadersHandlerInterface* BufferedSpdyFramer::OnHeaderFrameStart( |
SpdyStreamId stream_id) { |
- return visitor_->OnHeaderFrameStart(stream_id); |
+ coalescer_.reset(new HeaderCoalescer()); |
+ return coalescer_.get(); |
} |
void BufferedSpdyFramer::OnHeaderFrameEnd(SpdyStreamId stream_id, |
bool end_headers) { |
- visitor_->OnHeaderFrameEnd(stream_id, end_headers); |
+ if (coalescer_->error_seen()) { |
+ visitor_->OnStreamError(stream_id, |
+ "Could not parse Spdy Control Frame Header."); |
+ return; |
+ } |
+ DCHECK(control_frame_fields_.get()); |
+ switch (control_frame_fields_->type) { |
+ case SYN_STREAM: |
+ visitor_->OnSynStream( |
+ control_frame_fields_->stream_id, |
+ control_frame_fields_->associated_stream_id, |
+ control_frame_fields_->priority, control_frame_fields_->fin, |
+ control_frame_fields_->unidirectional, coalescer_->headers()); |
+ break; |
+ case SYN_REPLY: |
+ visitor_->OnSynReply(control_frame_fields_->stream_id, |
+ control_frame_fields_->fin, coalescer_->headers()); |
+ break; |
+ case HEADERS: |
+ visitor_->OnHeaders(control_frame_fields_->stream_id, |
+ control_frame_fields_->has_priority, |
+ control_frame_fields_->priority, |
+ control_frame_fields_->parent_stream_id, |
+ control_frame_fields_->exclusive, |
+ control_frame_fields_->fin, coalescer_->headers()); |
+ break; |
+ case PUSH_PROMISE: |
+ DCHECK_LT(SPDY3, protocol_version()); |
+ visitor_->OnPushPromise(control_frame_fields_->stream_id, |
+ control_frame_fields_->promised_stream_id, |
+ coalescer_->headers()); |
+ break; |
+ default: |
+ DCHECK(false) << "Unexpect control frame type: " |
+ << control_frame_fields_->type; |
+ break; |
+ } |
+ control_frame_fields_.reset(NULL); |
} |
void BufferedSpdyFramer::OnSettings(bool clear_persisted) { |