Index: net/spdy/spdy_framer.cc |
diff --git a/net/spdy/spdy_framer.cc b/net/spdy/spdy_framer.cc |
index 321c31a027899ad009c2ca3ecfb2186979201c24..378c64002ec084f14792a2b915722061e85f0a32 100644 |
--- a/net/spdy/spdy_framer.cc |
+++ b/net/spdy/spdy_framer.cc |
@@ -564,15 +564,20 @@ size_t SpdyFramer::ProcessInput(const char* data, size_t len) { |
break; |
} |
- case SPDY_IGNORE_REMAINING_PAYLOAD: |
- // control frame has too-large payload |
- // intentional fallthrough |
+ case SPDY_IGNORE_REMAINING_PAYLOAD: { |
+ size_t bytes_read = ProcessIgnoredControlFramePayload(/*data,*/ len); |
+ len -= bytes_read; |
+ data += bytes_read; |
+ break; |
+ } |
+ |
case SPDY_FORWARD_STREAM_FRAME: { |
size_t bytes_read = ProcessDataFramePayload(data, len); |
len -= bytes_read; |
data += bytes_read; |
break; |
} |
+ |
default: |
LOG(DFATAL) << "Invalid value for " << display_protocol_ |
<< " framer state: " << state_; |
@@ -1908,15 +1913,15 @@ size_t SpdyFramer::ProcessFramePadding(const char* data, size_t len) { |
len -= amount_to_discard; |
remaining_padding_payload_length_ -= amount_to_discard; |
remaining_data_length_ -= amount_to_discard; |
+ } |
- // If the FIN flag is set, and there is no more data in this data |
- // frame, inform the visitor of EOF via a 0-length data frame. |
- if (!remaining_data_length_ && current_frame_flags_ & DATA_FLAG_FIN) { |
+ if (remaining_data_length_ == 0) { |
+ // If the FIN flag is set, and there is no more data in this data frame, |
+ // inform the visitor of EOF via a 0-length data frame. |
+ if (current_frame_flags_ & DATA_FLAG_FIN) { |
visitor_->OnStreamFrameData(current_frame_stream_id_, NULL, 0, true); |
} |
- } |
- if (remaining_data_length_ == 0) { |
CHANGE_STATE(SPDY_AUTO_RESET); |
} |
return original_len - len; |
@@ -1937,12 +1942,6 @@ size_t SpdyFramer::ProcessDataFramePayload(const char* data, size_t len) { |
data += amount_to_forward; |
len -= amount_to_forward; |
remaining_data_length_ -= amount_to_forward; |
- |
- // If the FIN flag is set, and there is no more data in this data |
- // frame, inform the visitor of EOF via a 0-length data frame. |
- if (!remaining_data_length_ && current_frame_flags_ & DATA_FLAG_FIN) { |
- visitor_->OnStreamFrameData(current_frame_stream_id_, NULL, 0, true); |
- } |
} |
if (remaining_data_length_ == remaining_padding_payload_length_) { |
@@ -1951,6 +1950,21 @@ size_t SpdyFramer::ProcessDataFramePayload(const char* data, size_t len) { |
return original_len - len; |
} |
+size_t SpdyFramer::ProcessIgnoredControlFramePayload(/*const char* data,*/ |
+ size_t len) { |
+ size_t original_len = len; |
+ if (remaining_data_length_ > 0) { |
+ size_t amount_to_ignore = std::min(remaining_data_length_, len); |
+ len -= amount_to_ignore; |
+ remaining_data_length_ -= amount_to_ignore; |
+ } |
+ |
+ if (remaining_data_length_ == 0) { |
+ CHANGE_STATE(SPDY_AUTO_RESET); |
+ } |
+ return original_len - len; |
+} |
+ |
size_t SpdyFramer::ParseHeaderBlockInBuffer(const char* header_data, |
size_t header_length, |
SpdyHeaderBlock* block) const { |