15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/spdy/buffered_spdy_framer.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochSpdyMajorVersion NextProtoToSpdyMajorVersion(NextProto next_proto) { 12558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch switch (next_proto) { 134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case kProtoDeprecatedSPDY2: 14558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return SPDY2; 15558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case kProtoSPDY3: 16558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case kProtoSPDY31: 17558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return SPDY3; 18a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch case kProtoSPDY4: 19558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return SPDY4; 20558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case kProtoUnknown: 21558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case kProtoHTTP11: 22558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case kProtoQUIC1SPDY3: 23558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch break; 24558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 25558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch NOTREACHED(); 26558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return SPDY2; 27558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 28558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 2990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)BufferedSpdyFramer::BufferedSpdyFramer(SpdyMajorVersion version, 3090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool enable_compression) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : spdy_framer_(version), 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visitor_(NULL), 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) header_buffer_used_(0), 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) header_buffer_valid_(false), 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) header_stream_id_(SpdyFramer::kInvalidStream), 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frames_received_(0) { 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) spdy_framer_.set_enable_compression(enable_compression); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(header_buffer_, 0, sizeof(header_buffer_)); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BufferedSpdyFramer::~BufferedSpdyFramer() { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BufferedSpdyFramer::set_visitor( 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BufferedSpdyFramerVisitorInterface* visitor) { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visitor_ = visitor; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) spdy_framer_.set_visitor(this); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BufferedSpdyFramer::set_debug_visitor( 517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SpdyFramerDebugVisitorInterface* debug_visitor) { 527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch spdy_framer_.set_debug_visitor(debug_visitor); 537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BufferedSpdyFramer::OnError(SpdyFramer* spdy_framer) { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(spdy_framer); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visitor_->OnError(spdy_framer->error_code()); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BufferedSpdyFramer::OnSynStream(SpdyStreamId stream_id, 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpdyStreamId associated_stream_id, 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpdyPriority priority, 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool fin, 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool unidirectional) { 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frames_received_++; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!control_frame_fields_.get()); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) control_frame_fields_.reset(new ControlFrameFields()); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) control_frame_fields_->type = SYN_STREAM; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) control_frame_fields_->stream_id = stream_id; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) control_frame_fields_->associated_stream_id = associated_stream_id; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) control_frame_fields_->priority = priority; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) control_frame_fields_->fin = fin; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) control_frame_fields_->unidirectional = unidirectional; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitHeaderStreaming(stream_id); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BufferedSpdyFramer::OnHeaders(SpdyStreamId stream_id, 79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool fin, 80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool end) { 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frames_received_++; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!control_frame_fields_.get()); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) control_frame_fields_.reset(new ControlFrameFields()); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) control_frame_fields_->type = HEADERS; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) control_frame_fields_->stream_id = stream_id; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) control_frame_fields_->fin = fin; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitHeaderStreaming(stream_id); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BufferedSpdyFramer::OnSynReply(SpdyStreamId stream_id, 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool fin) { 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frames_received_++; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!control_frame_fields_.get()); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) control_frame_fields_.reset(new ControlFrameFields()); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) control_frame_fields_->type = SYN_REPLY; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) control_frame_fields_->stream_id = stream_id; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) control_frame_fields_->fin = fin; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitHeaderStreaming(stream_id); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BufferedSpdyFramer::OnControlFrameHeaderData(SpdyStreamId stream_id, 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* header_data, 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t len) { 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK_EQ(header_stream_id_, stream_id); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (len == 0) { 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Indicates end-of-header-block. 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(header_buffer_valid_); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpdyHeaderBlock headers; 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t parsed_len = spdy_framer_.ParseHeaderBlockInBuffer( 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) header_buffer_, header_buffer_used_, &headers); 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(rch): this really should be checking parsed_len != len, 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // but a bunch of tests fail. Need to figure out why. 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (parsed_len == 0) { 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visitor_->OnStreamError( 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stream_id, "Could not parse Spdy Control Frame Header."); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(control_frame_fields_.get()); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (control_frame_fields_->type) { 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SYN_STREAM: 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visitor_->OnSynStream(control_frame_fields_->stream_id, 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) control_frame_fields_->associated_stream_id, 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) control_frame_fields_->priority, 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) control_frame_fields_->fin, 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) control_frame_fields_->unidirectional, 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SYN_REPLY: 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visitor_->OnSynReply(control_frame_fields_->stream_id, 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) control_frame_fields_->fin, 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case HEADERS: 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visitor_->OnHeaders(control_frame_fields_->stream_id, 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) control_frame_fields_->fin, 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case PUSH_PROMISE: 143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK_LT(SPDY3, protocol_version()); 144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) visitor_->OnPushPromise(control_frame_fields_->stream_id, 145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) control_frame_fields_->promised_stream_id, 146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) headers); 147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) break; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(false) << "Unexpect control frame type: " 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << control_frame_fields_->type; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) control_frame_fields_.reset(NULL); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t available = kHeaderBufferSize - header_buffer_used_; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (len > available) { 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) header_buffer_valid_ = false; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visitor_->OnStreamError( 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stream_id, "Received more data than the allocated size."); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(header_buffer_ + header_buffer_used_, header_data, len); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) header_buffer_used_ += len; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BufferedSpdyFramer::OnDataFrameHeader(SpdyStreamId stream_id, 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t length, 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool fin) { 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frames_received_++; 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) header_stream_id_ = stream_id; 174a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) visitor_->OnDataFrameHeader(stream_id, length, fin); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BufferedSpdyFramer::OnStreamFrameData(SpdyStreamId stream_id, 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* data, 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t len, 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool fin) { 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) visitor_->OnStreamFrameData(stream_id, data, len, fin); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void BufferedSpdyFramer::OnSettings(bool clear_persisted) { 185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) visitor_->OnSettings(clear_persisted); 186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BufferedSpdyFramer::OnSetting(SpdySettingsIds id, 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 flags, 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 value) { 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visitor_->OnSetting(id, flags, value); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 194a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void BufferedSpdyFramer::OnSettingsAck() { 195a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) visitor_->OnSettingsAck(); 196a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 197a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 198a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void BufferedSpdyFramer::OnSettingsEnd() { 199a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) visitor_->OnSettingsEnd(); 200a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 201a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 202a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void BufferedSpdyFramer::OnPing(SpdyPingId unique_id, bool is_ack) { 203a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) visitor_->OnPing(unique_id, is_ack); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BufferedSpdyFramer::OnRstStream(SpdyStreamId stream_id, 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SpdyRstStreamStatus status) { 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visitor_->OnRstStream(stream_id, status); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BufferedSpdyFramer::OnGoAway(SpdyStreamId last_accepted_stream_id, 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpdyGoAwayStatus status) { 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visitor_->OnGoAway(last_accepted_stream_id, status); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BufferedSpdyFramer::OnWindowUpdate(SpdyStreamId stream_id, 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32 delta_window_size) { 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visitor_->OnWindowUpdate(stream_id, delta_window_size); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BufferedSpdyFramer::OnPushPromise(SpdyStreamId stream_id, 221a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SpdyStreamId promised_stream_id, 222a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool end) { 223cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK_LT(SPDY3, protocol_version()); 224cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) frames_received_++; 225cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK(!control_frame_fields_.get()); 226cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) control_frame_fields_.reset(new ControlFrameFields()); 227cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) control_frame_fields_->type = PUSH_PROMISE; 228cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) control_frame_fields_->stream_id = stream_id; 229cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) control_frame_fields_->promised_stream_id = promised_stream_id; 230cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 231cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) InitHeaderStreaming(stream_id); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 234a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void BufferedSpdyFramer::OnContinuation(SpdyStreamId stream_id, bool end) { 235a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 236a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 23703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)bool BufferedSpdyFramer::OnUnknownFrame(SpdyStreamId stream_id, 23803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) int frame_type) { 23903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return visitor_->OnUnknownFrame(stream_id, frame_type); 24003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 24103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 242f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)SpdyMajorVersion BufferedSpdyFramer::protocol_version() { 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return spdy_framer_.protocol_version(); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)size_t BufferedSpdyFramer::ProcessInput(const char* data, size_t len) { 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return spdy_framer_.ProcessInput(data, len); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BufferedSpdyFramer::Reset() { 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) spdy_framer_.Reset(); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SpdyFramer::SpdyError BufferedSpdyFramer::error_code() const { 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return spdy_framer_.error_code(); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SpdyFramer::SpdyState BufferedSpdyFramer::state() const { 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return spdy_framer_.state(); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BufferedSpdyFramer::MessageFullyRead() { 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return state() == SpdyFramer::SPDY_AUTO_RESET; 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BufferedSpdyFramer::HasError() { 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return spdy_framer_.HasError(); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// TODO(jgraettinger): Eliminate uses of this method (prefer 2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// SpdySynStreamIR). 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SpdyFrame* BufferedSpdyFramer::CreateSynStream( 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpdyStreamId stream_id, 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpdyStreamId associated_stream_id, 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpdyPriority priority, 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpdyControlFlags flags, 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SpdyHeaderBlock* headers) { 2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SpdySynStreamIR syn_stream(stream_id); 2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) syn_stream.set_associated_to_stream_id(associated_stream_id); 2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) syn_stream.set_priority(priority); 2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) syn_stream.set_fin((flags & CONTROL_FLAG_FIN) != 0); 2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) syn_stream.set_unidirectional((flags & CONTROL_FLAG_UNIDIRECTIONAL) != 0); 2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(hkhalil): Avoid copy here. 2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) syn_stream.set_name_value_block(*headers); 2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return spdy_framer_.SerializeSynStream(syn_stream); 2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// TODO(jgraettinger): Eliminate uses of this method (prefer 2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// SpdySynReplyIR). 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SpdyFrame* BufferedSpdyFramer::CreateSynReply( 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpdyStreamId stream_id, 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpdyControlFlags flags, 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SpdyHeaderBlock* headers) { 2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SpdySynReplyIR syn_reply(stream_id); 2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) syn_reply.set_fin(flags & CONTROL_FLAG_FIN); 2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(hkhalil): Avoid copy here. 2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) syn_reply.set_name_value_block(*headers); 2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return spdy_framer_.SerializeSynReply(syn_reply); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// TODO(jgraettinger): Eliminate uses of this method (prefer 3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// SpdyRstStreamIR). 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SpdyFrame* BufferedSpdyFramer::CreateRstStream( 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpdyStreamId stream_id, 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SpdyRstStreamStatus status) const { 30646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // RST_STREAM payloads are not part of any SPDY spec. 30746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // SpdyFramer will accept them, but don't create them. 30846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SpdyRstStreamIR rst_ir(stream_id, status, ""); 3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return spdy_framer_.SerializeRstStream(rst_ir); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// TODO(jgraettinger): Eliminate uses of this method (prefer 3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// SpdySettingsIR). 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SpdyFrame* BufferedSpdyFramer::CreateSettings( 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SettingsMap& values) const { 3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SpdySettingsIR settings_ir; 3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (SettingsMap::const_iterator it = values.begin(); 3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) it != values.end(); 3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++it) { 3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) settings_ir.AddSetting( 3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) it->first, 3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) (it->second.first & SETTINGS_FLAG_PLEASE_PERSIST) != 0, 3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) (it->second.first & SETTINGS_FLAG_PERSISTED) != 0, 3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) it->second.second); 3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return spdy_framer_.SerializeSettings(settings_ir); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// TODO(jgraettinger): Eliminate uses of this method (prefer SpdyPingIR). 330a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)SpdyFrame* BufferedSpdyFramer::CreatePingFrame(uint32 unique_id, 331a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool is_ack) const { 3325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SpdyPingIR ping_ir(unique_id); 333a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ping_ir.set_is_ack(is_ack); 3345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return spdy_framer_.SerializePing(ping_ir); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// TODO(jgraettinger): Eliminate uses of this method (prefer SpdyGoAwayIR). 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SpdyFrame* BufferedSpdyFramer::CreateGoAway( 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpdyStreamId last_accepted_stream_id, 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpdyGoAwayStatus status) const { 3415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SpdyGoAwayIR go_ir(last_accepted_stream_id, status, ""); 3425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return spdy_framer_.SerializeGoAway(go_ir); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// TODO(jgraettinger): Eliminate uses of this method (prefer SpdyHeadersIR). 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SpdyFrame* BufferedSpdyFramer::CreateHeaders( 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpdyStreamId stream_id, 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpdyControlFlags flags, 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SpdyHeaderBlock* headers) { 3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SpdyHeadersIR headers_ir(stream_id); 3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) headers_ir.set_fin((flags & CONTROL_FLAG_FIN) != 0); 3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) headers_ir.set_name_value_block(*headers); 3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return spdy_framer_.SerializeHeaders(headers_ir); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// TODO(jgraettinger): Eliminate uses of this method (prefer 3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// SpdyWindowUpdateIR). 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SpdyFrame* BufferedSpdyFramer::CreateWindowUpdate( 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpdyStreamId stream_id, 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 delta_window_size) const { 3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SpdyWindowUpdateIR update_ir(stream_id, delta_window_size); 3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return spdy_framer_.SerializeWindowUpdate(update_ir); 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// TODO(jgraettinger): Eliminate uses of this method (prefer SpdyDataIR). 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SpdyFrame* BufferedSpdyFramer::CreateDataFrame(SpdyStreamId stream_id, 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* data, 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32 len, 3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SpdyDataFlags flags) { 3705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SpdyDataIR data_ir(stream_id, 3715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::StringPiece(data, len)); 3725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) data_ir.set_fin((flags & DATA_FLAG_FIN) != 0); 3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return spdy_framer_.SerializeData(data_ir); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 376cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// TODO(jgraettinger): Eliminate uses of this method (prefer SpdyPushPromiseIR). 377cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)SpdyFrame* BufferedSpdyFramer::CreatePushPromise( 378cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SpdyStreamId stream_id, 379cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SpdyStreamId promised_stream_id, 380cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const SpdyHeaderBlock* headers) { 381cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SpdyPushPromiseIR push_promise_ir(stream_id, promised_stream_id); 382cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) push_promise_ir.set_name_value_block(*headers); 383cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return spdy_framer_.SerializePushPromise(push_promise_ir); 384cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 385cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SpdyPriority BufferedSpdyFramer::GetHighestPriority() const { 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return spdy_framer_.GetHighestPriority(); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BufferedSpdyFramer::InitHeaderStreaming(SpdyStreamId stream_id) { 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(header_buffer_, 0, kHeaderBufferSize); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) header_buffer_used_ = 0; 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) header_buffer_valid_ = true; 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) header_stream_id_ = stream_id; 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_NE(header_stream_id_, SpdyFramer::kInvalidStream); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 399