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