| Index: net/spdy/spdy_framer.cc
|
| diff --git a/net/spdy/spdy_framer.cc b/net/spdy/spdy_framer.cc
|
| index 82a063b8eeeb9305eb12108c3345a0c32d6610f3..53070f23061b2aebf6bf627aab92c4c6f95bed2e 100644
|
| --- a/net/spdy/spdy_framer.cc
|
| +++ b/net/spdy/spdy_framer.cc
|
| @@ -1005,20 +1005,30 @@ size_t SpdyFramer::ProcessControlFrameBeforeHeaderBlock(const char* data,
|
| size_t SpdyFramer::ProcessControlFrameHeaderBlock(const char* data,
|
| size_t data_len) {
|
| DCHECK_EQ(SPDY_CONTROL_FRAME_HEADER_BLOCK, state_);
|
| - SpdyControlFrame control_frame(current_frame_buffer_.get(), false);
|
| + const SpdyControlFrame control_frame(current_frame_buffer_.get(), false);
|
|
|
| bool processed_successfully = true;
|
| - DCHECK(control_frame.type() == SYN_STREAM ||
|
| - control_frame.type() == SYN_REPLY ||
|
| - control_frame.type() == HEADERS);
|
| + SpdyStreamId stream_id = kInvalidStream;
|
| + if (control_frame.type() == SYN_STREAM) {
|
| + stream_id = reinterpret_cast<const SpdySynStreamControlFrame*>(
|
| + &control_frame)->stream_id();
|
| + } else if (control_frame.type() == SYN_REPLY) {
|
| + stream_id = reinterpret_cast<const SpdySynReplyControlFrame*>(
|
| + &control_frame)->stream_id();
|
| + } else if (control_frame.type() == HEADERS) {
|
| + stream_id = reinterpret_cast<const SpdyHeadersControlFrame*>(
|
| + &control_frame)->stream_id();
|
| + } else {
|
| + LOG(DFATAL) << "Unhandled frame type in ProcessControlFrameHeaderBlock.";
|
| + }
|
| size_t process_bytes = std::min(data_len, remaining_control_payload_);
|
| if (process_bytes > 0) {
|
| if (enable_compression_) {
|
| processed_successfully = IncrementallyDecompressControlFrameHeaderData(
|
| - &control_frame, data, process_bytes);
|
| + stream_id, data, process_bytes);
|
| } else {
|
| processed_successfully = IncrementallyDeliverControlFrameHeaderData(
|
| - &control_frame, data, process_bytes);
|
| + stream_id, data, process_bytes);
|
| }
|
|
|
| remaining_control_payload_ -= process_bytes;
|
| @@ -1029,13 +1039,11 @@ size_t SpdyFramer::ProcessControlFrameHeaderBlock(const char* data,
|
| if (remaining_control_payload_ == 0 && processed_successfully) {
|
| // The complete header block has been delivered. We send a zero-length
|
| // OnControlFrameHeaderData() to indicate this.
|
| - visitor_->OnControlFrameHeaderData(
|
| - GetControlFrameStreamId(&control_frame), NULL, 0);
|
| + visitor_->OnControlFrameHeaderData(stream_id, NULL, 0);
|
|
|
| // If this is a FIN, tell the caller.
|
| if (control_frame.flags() & CONTROL_FLAG_FIN) {
|
| - visitor_->OnStreamFrameData(GetControlFrameStreamId(&control_frame),
|
| - NULL, 0, DATA_FLAG_FIN);
|
| + visitor_->OnStreamFrameData(stream_id, NULL, 0, DATA_FLAG_FIN);
|
| }
|
|
|
| CHANGE_STATE(SPDY_AUTO_RESET);
|
| @@ -1912,7 +1920,7 @@ SpdyControlFrame* SpdyFramer::CompressControlFrame(
|
| // indicates that it cannot process any more data, or (more commonly) we
|
| // run out of data to deliver.
|
| bool SpdyFramer::IncrementallyDecompressControlFrameHeaderData(
|
| - const SpdyControlFrame* control_frame,
|
| + SpdyStreamId stream_id,
|
| const char* data,
|
| size_t len) {
|
| // Get a decompressor or set error.
|
| @@ -1928,7 +1936,6 @@ bool SpdyFramer::IncrementallyDecompressControlFrameHeaderData(
|
|
|
| decomp->next_in = reinterpret_cast<Bytef*>(const_cast<char*>(data));
|
| decomp->avail_in = len;
|
| - const SpdyStreamId stream_id = GetControlFrameStreamId(control_frame);
|
| DCHECK_LT(0u, stream_id);
|
| while (decomp->avail_in > 0 && processed_successfully) {
|
| decomp->next_out = reinterpret_cast<Bytef*>(buffer);
|
| @@ -1982,9 +1989,8 @@ bool SpdyFramer::IncrementallyDecompressControlFrameHeaderData(
|
| }
|
|
|
| bool SpdyFramer::IncrementallyDeliverControlFrameHeaderData(
|
| - const SpdyControlFrame* control_frame, const char* data, size_t len) {
|
| + SpdyStreamId stream_id, const char* data, size_t len) {
|
| bool read_successfully = true;
|
| - const SpdyStreamId stream_id = GetControlFrameStreamId(control_frame);
|
| while (read_successfully && len > 0) {
|
| size_t bytes_to_deliver = std::min(len, kHeaderDataChunkMaxSize);
|
| read_successfully = visitor_->OnControlFrameHeaderData(stream_id, data,
|
| @@ -2023,48 +2029,6 @@ bool SpdyFramer::IsCompressible(const SpdyFrame& frame) const {
|
| return false;
|
| }
|
|
|
| -/* static */
|
| -SpdyStreamId SpdyFramer::GetControlFrameStreamId(
|
| - const SpdyControlFrame* control_frame) {
|
| - SpdyStreamId stream_id = kInvalidStream;
|
| - if (control_frame != NULL) {
|
| - switch (control_frame->type()) {
|
| - case SYN_STREAM:
|
| - stream_id = reinterpret_cast<const SpdySynStreamControlFrame*>(
|
| - control_frame)->stream_id();
|
| - break;
|
| - case SYN_REPLY:
|
| - stream_id = reinterpret_cast<const SpdySynReplyControlFrame*>(
|
| - control_frame)->stream_id();
|
| - break;
|
| - case HEADERS:
|
| - stream_id = reinterpret_cast<const SpdyHeadersControlFrame*>(
|
| - control_frame)->stream_id();
|
| - break;
|
| - case RST_STREAM:
|
| - stream_id = reinterpret_cast<const SpdyRstStreamControlFrame*>(
|
| - control_frame)->stream_id();
|
| - break;
|
| - case WINDOW_UPDATE:
|
| - stream_id = reinterpret_cast<const SpdyWindowUpdateControlFrame*>(
|
| - control_frame)->stream_id();
|
| - break;
|
| - // All of the following types are not part of a particular stream.
|
| - // They all fall through to the invalid control frame type case.
|
| - // (The default case isn't used so that the compile will break if a new
|
| - // control frame type is added but not included here.)
|
| - case SETTINGS:
|
| - case NOOP:
|
| - case PING:
|
| - case GOAWAY:
|
| - case CREDENTIAL:
|
| - case NUM_CONTROL_FRAME_TYPES: // makes compiler happy
|
| - break;
|
| - }
|
| - }
|
| - return stream_id;
|
| -}
|
| -
|
| void SpdyFramer::SerializeNameValueBlock(
|
| SpdyFrameBuilder* builder,
|
| const SpdyFrameWithNameValueBlockIR& frame) const {
|
|
|