12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/spdy/spdy_protocol.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace net {
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SpdyFrameWithNameValueBlockIR::SpdyFrameWithNameValueBlockIR(
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SpdyStreamId stream_id) : SpdyFrameWithFinIR(stream_id) {}
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SpdyFrameWithNameValueBlockIR::~SpdyFrameWithNameValueBlockIR() {}
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SpdyDataIR::SpdyDataIR(SpdyStreamId stream_id, const base::StringPiece& data)
154ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    : SpdyFrameWithFinIR(stream_id),
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      padded_(false),
174ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      padding_payload_len_(0) {
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetDataDeep(data);
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SpdyDataIR::SpdyDataIR(SpdyStreamId stream_id)
224ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    : SpdyFrameWithFinIR(stream_id),
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      padded_(false),
244ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      padding_payload_len_(0) {}
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SpdyDataIR::~SpdyDataIR() {}
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
284ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdochbool SpdyConstants::IsValidFrameType(SpdyMajorVersion version,
294ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch                                     int frame_type_field) {
304ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  switch (version) {
314ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    case SPDY2:
324ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    case SPDY3:
334ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      // SYN_STREAM is the first valid frame.
344ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      if (frame_type_field < SerializeFrameType(version, SYN_STREAM)) {
354ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        return false;
364ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      }
374ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
384ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      // WINDOW_UPDATE is the last valid frame.
394ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      if (frame_type_field > SerializeFrameType(version, WINDOW_UPDATE)) {
404ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        return false;
414ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      }
424ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
434ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      return true;
444ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    case SPDY4:
455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SPDY5:
4603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      // Check for recognized extensions.
4703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      if (frame_type_field == SerializeFrameType(version, ALTSVC) ||
4803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          frame_type_field == SerializeFrameType(version, BLOCKED)) {
4903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        return true;
5003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      }
5103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
524ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      // DATA is the first valid frame.
534ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      if (frame_type_field < SerializeFrameType(version, DATA)) {
544ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        return false;
554ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      }
564ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
5703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      // CONTINUATION is the last valid frame.
5803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      if (frame_type_field > SerializeFrameType(version, CONTINUATION)) {
594ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        return false;
604ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      }
614ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
624ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      return true;
634ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  }
644ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
654ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  LOG(DFATAL) << "Unhandled SPDY version " << version;
664ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  return false;
674ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch}
684ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
694ad1aa43a48567659193a298fad74f55e00b3dd9Ben MurdochSpdyFrameType SpdyConstants::ParseFrameType(SpdyMajorVersion version,
704ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch                                            int frame_type_field) {
714ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  switch (version) {
724ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    case SPDY2:
734ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    case SPDY3:
744ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      switch (frame_type_field) {
754ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case 1:
764ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return SYN_STREAM;
774ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case 2:
784ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return SYN_REPLY;
794ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case 3:
804ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return RST_STREAM;
814ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case 4:
824ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return SETTINGS;
834ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case 6:
844ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return PING;
854ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case 7:
864ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return GOAWAY;
874ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case 8:
884ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return HEADERS;
894ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case 9:
904ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return WINDOW_UPDATE;
914ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      }
924ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      break;
934ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    case SPDY4:
945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SPDY5:
954ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      switch (frame_type_field) {
964ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case 0:
974ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return DATA;
984ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case 1:
994ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return HEADERS;
100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        case 2:
101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          return PRIORITY;
1024ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case 3:
1034ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return RST_STREAM;
1044ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case 4:
1054ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return SETTINGS;
1064ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case 5:
1074ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return PUSH_PROMISE;
1084ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case 6:
1094ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return PING;
1104ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case 7:
1114ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return GOAWAY;
1124ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case 8:
1134ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return WINDOW_UPDATE;
1144ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case 9:
1154ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return CONTINUATION;
1164ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case 10:
117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          return ALTSVC;
118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        case 11:
1194ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return BLOCKED;
1204ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      }
1214ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      break;
1224ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  }
1234ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
1244ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  LOG(DFATAL) << "Unhandled frame type " << frame_type_field;
1254ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  return DATA;
1264ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch}
1274ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
1284ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdochint SpdyConstants::SerializeFrameType(SpdyMajorVersion version,
1294ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch                                      SpdyFrameType frame_type) {
1304ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  switch (version) {
1314ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    case SPDY2:
1324ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    case SPDY3:
1334ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      switch (frame_type) {
1344ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case SYN_STREAM:
1354ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return 1;
1364ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case SYN_REPLY:
1374ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return 2;
1384ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case RST_STREAM:
1394ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return 3;
1404ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case SETTINGS:
1414ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return 4;
1424ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case PING:
1434ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return 6;
1444ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case GOAWAY:
1454ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return 7;
1464ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case HEADERS:
1474ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return 8;
1484ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case WINDOW_UPDATE:
1494ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return 9;
1504ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        default:
1514ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          LOG(DFATAL) << "Serializing unhandled frame type " << frame_type;
1524ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return -1;
1534ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      }
1544ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    case SPDY4:
1555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SPDY5:
1564ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      switch (frame_type) {
1574ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case DATA:
1584ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return 0;
1594ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case HEADERS:
1604ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return 1;
161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        case PRIORITY:
162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          return 2;
1634ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case RST_STREAM:
1644ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return 3;
1654ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case SETTINGS:
1664ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return 4;
1674ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case PUSH_PROMISE:
1684ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return 5;
1694ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case PING:
1704ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return 6;
1714ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case GOAWAY:
1724ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return 7;
1734ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case WINDOW_UPDATE:
1744ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return 8;
1754ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case CONTINUATION:
1764ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return 9;
17703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        // ALTSVC and BLOCKED are extensions.
178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        case ALTSVC:
1794ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return 10;
180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        case BLOCKED:
181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          return 11;
1824ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        default:
1834ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          LOG(DFATAL) << "Serializing unhandled frame type " << frame_type;
1844ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return -1;
1854ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      }
1864ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  }
1874ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
1884ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  LOG(DFATAL) << "Unhandled SPDY version " << version;
1894ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  return -1;
1904ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch}
1914ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
192116680a4aac90f2aa7413d9095a592090648e557Ben Murdochint SpdyConstants::DataFrameType(SpdyMajorVersion version) {
193116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  switch (version) {
194116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case SPDY2:
195116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case SPDY3:
196116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      return 0;
197116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case SPDY4:
198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case SPDY5:
199116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      return SerializeFrameType(version, DATA);
200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
201116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
202116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  LOG(DFATAL) << "Unhandled SPDY version " << version;
203116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return 0;
204116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
205116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2064ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdochbool SpdyConstants::IsValidSettingId(SpdyMajorVersion version,
2074ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch                                     int setting_id_field) {
2084ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  switch (version) {
2094ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    case SPDY2:
2104ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    case SPDY3:
2114ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      // UPLOAD_BANDWIDTH is the first valid setting id.
2124ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      if (setting_id_field <
2134ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          SerializeSettingId(version, SETTINGS_UPLOAD_BANDWIDTH)) {
2144ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        return false;
2154ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      }
2164ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
2174ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      // INITIAL_WINDOW_SIZE is the last valid setting id.
2184ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      if (setting_id_field >
2194ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          SerializeSettingId(version, SETTINGS_INITIAL_WINDOW_SIZE)) {
2204ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        return false;
2214ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      }
2224ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
2234ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      return true;
2244ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    case SPDY4:
2255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SPDY5:
2264ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      // HEADER_TABLE_SIZE is the first valid setting id.
2274ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      if (setting_id_field <
2284ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          SerializeSettingId(version, SETTINGS_HEADER_TABLE_SIZE)) {
2294ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        return false;
2304ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      }
2314ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
23203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      // MAX_HEADER_LIST_SIZE is the last valid setting id.
2334ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      if (setting_id_field >
23403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          SerializeSettingId(version, SETTINGS_MAX_HEADER_LIST_SIZE)) {
2354ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        return false;
2364ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      }
2374ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
2384ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      return true;
2394ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  }
2404ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
2414ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  LOG(DFATAL) << "Unhandled SPDY version " << version;
2424ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  return false;
2434ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch}
2444ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
2454ad1aa43a48567659193a298fad74f55e00b3dd9Ben MurdochSpdySettingsIds SpdyConstants::ParseSettingId(SpdyMajorVersion version,
2464ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch                                              int setting_id_field) {
2474ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  switch (version) {
2484ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    case SPDY2:
2494ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    case SPDY3:
2504ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      switch (setting_id_field) {
2514ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case 1:
2524ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return SETTINGS_UPLOAD_BANDWIDTH;
2534ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case 2:
2544ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return SETTINGS_DOWNLOAD_BANDWIDTH;
2554ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case 3:
2564ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return SETTINGS_ROUND_TRIP_TIME;
2574ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case 4:
2584ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return SETTINGS_MAX_CONCURRENT_STREAMS;
2594ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case 5:
2604ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return SETTINGS_CURRENT_CWND;
2614ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case 6:
2624ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return SETTINGS_DOWNLOAD_RETRANS_RATE;
2634ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case 7:
2644ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return SETTINGS_INITIAL_WINDOW_SIZE;
2654ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      }
2664ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      break;
2674ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    case SPDY4:
2685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SPDY5:
2694ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      switch (setting_id_field) {
2704ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case 1:
2714ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return SETTINGS_HEADER_TABLE_SIZE;
2724ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case 2:
2734ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return SETTINGS_ENABLE_PUSH;
2744ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case 3:
2754ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return SETTINGS_MAX_CONCURRENT_STREAMS;
2764ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case 4:
2774ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return SETTINGS_INITIAL_WINDOW_SIZE;
27803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        case 5:
27903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          return SETTINGS_MAX_FRAME_SIZE;
28003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        case 6:
28103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          return SETTINGS_MAX_HEADER_LIST_SIZE;
2824ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      }
2834ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      break;
2844ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  }
2854ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
2864ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  LOG(DFATAL) << "Unhandled setting ID " << setting_id_field;
2874ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  return SETTINGS_UPLOAD_BANDWIDTH;
2884ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch}
2894ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
2904ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdochint SpdyConstants::SerializeSettingId(SpdyMajorVersion version,
2914ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch                                       SpdySettingsIds id) {
2924ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  switch (version) {
2934ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    case SPDY2:
2944ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    case SPDY3:
2954ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      switch (id) {
2964ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case SETTINGS_UPLOAD_BANDWIDTH:
2974ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return 1;
2984ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case SETTINGS_DOWNLOAD_BANDWIDTH:
2994ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return 2;
3004ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case SETTINGS_ROUND_TRIP_TIME:
3014ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return 3;
3024ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case SETTINGS_MAX_CONCURRENT_STREAMS:
3034ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return 4;
3044ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case SETTINGS_CURRENT_CWND:
3054ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return 5;
3064ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case SETTINGS_DOWNLOAD_RETRANS_RATE:
3074ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return 6;
3084ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case SETTINGS_INITIAL_WINDOW_SIZE:
3094ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return 7;
3104ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        default:
3114ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          LOG(DFATAL) << "Serializing unhandled setting id " << id;
3124ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return -1;
3134ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      }
3144ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    case SPDY4:
3155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SPDY5:
3164ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      switch (id) {
3174ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case SETTINGS_HEADER_TABLE_SIZE:
3184ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return 1;
3194ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case SETTINGS_ENABLE_PUSH:
3204ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return 2;
3214ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case SETTINGS_MAX_CONCURRENT_STREAMS:
3224ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return 3;
3234ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case SETTINGS_INITIAL_WINDOW_SIZE:
3244ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return 4;
32503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        case SETTINGS_MAX_FRAME_SIZE:
32603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          return 5;
32703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        case SETTINGS_MAX_HEADER_LIST_SIZE:
32803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          return 6;
3294ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        default:
3304ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          LOG(DFATAL) << "Serializing unhandled setting id " << id;
3314ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return -1;
3324ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      }
3334ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  }
3344ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  LOG(DFATAL) << "Unhandled SPDY version " << version;
3354ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  return -1;
3364ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch}
3374ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
3385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool SpdyConstants::IsValidRstStreamStatus(SpdyMajorVersion version,
3395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                           int rst_stream_status_field) {
3405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  switch (version) {
3415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SPDY2:
3425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SPDY3:
3435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      // PROTOCOL_ERROR is the valid first status code.
3445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      if (rst_stream_status_field <
3455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          SerializeRstStreamStatus(version, RST_STREAM_PROTOCOL_ERROR)) {
3465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        return false;
3475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      }
3485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
3495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      // FRAME_TOO_LARGE is the valid last status code.
3505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      if (rst_stream_status_field >
3515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          SerializeRstStreamStatus(version, RST_STREAM_FRAME_TOO_LARGE)) {
3525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        return false;
3535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      }
3545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
3555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return true;
3565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SPDY4:
3575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SPDY5:
3585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      // NO_ERROR is the first valid status code.
3595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      if (rst_stream_status_field <
3605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          SerializeRstStreamStatus(version, RST_STREAM_PROTOCOL_ERROR)) {
3615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        return false;
3625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      }
3635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
3645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      // TODO(hkhalil): Omit COMPRESSION_ERROR and SETTINGS_TIMEOUT
3655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      /*
3665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      // This works because GOAWAY and RST_STREAM share a namespace.
3675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      if (rst_stream_status_field ==
3685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          SerializeGoAwayStatus(version, GOAWAY_COMPRESSION_ERROR) ||
3695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          rst_stream_status_field ==
3705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          SerializeGoAwayStatus(version, GOAWAY_SETTINGS_TIMEOUT)) {
3715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        return false;
3725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      }
3735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      */
3745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
3755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      // ENHANCE_YOUR_CALM is the last valid status code.
3765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      if (rst_stream_status_field >
3775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          SerializeRstStreamStatus(version, RST_STREAM_ENHANCE_YOUR_CALM)) {
3785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        return false;
3795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      }
3805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
3815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return true;
3825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
3835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  LOG(DFATAL) << "Unhandled SPDY version " << version;
3845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return false;
3855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
3865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
3875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuSpdyRstStreamStatus SpdyConstants::ParseRstStreamStatus(
3885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    SpdyMajorVersion version,
3895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    int rst_stream_status_field) {
3905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  switch (version) {
3915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SPDY2:
3925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SPDY3:
3935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      switch (rst_stream_status_field) {
3945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case 1:
3955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return RST_STREAM_PROTOCOL_ERROR;
3965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case 2:
3975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return RST_STREAM_INVALID_STREAM;
3985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case 3:
3995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return RST_STREAM_REFUSED_STREAM;
4005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case 4:
4015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return RST_STREAM_UNSUPPORTED_VERSION;
4025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case 5:
4035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return RST_STREAM_CANCEL;
4045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case 6:
4055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return RST_STREAM_INTERNAL_ERROR;
4065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case 7:
4075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return RST_STREAM_FLOW_CONTROL_ERROR;
4085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case 8:
4095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return RST_STREAM_STREAM_IN_USE;
4105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case 9:
4115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return RST_STREAM_STREAM_ALREADY_CLOSED;
4125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case 10:
4135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return RST_STREAM_INVALID_CREDENTIALS;
4145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case 11:
4155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return RST_STREAM_FRAME_TOO_LARGE;
4165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      }
4175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      break;
4185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SPDY4:
4195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SPDY5:
4205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      switch (rst_stream_status_field) {
4215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case 1:
4225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return RST_STREAM_PROTOCOL_ERROR;
4235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case 2:
4245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return RST_STREAM_INTERNAL_ERROR;
4255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case 3:
4265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return RST_STREAM_FLOW_CONTROL_ERROR;
4275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case 5:
4285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return RST_STREAM_STREAM_CLOSED;
4295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case 6:
4305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return RST_STREAM_FRAME_SIZE_ERROR;
4315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case 7:
4325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return RST_STREAM_REFUSED_STREAM;
4335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case 8:
4345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return RST_STREAM_CANCEL;
4355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case 10:
4365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return RST_STREAM_CONNECT_ERROR;
4375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case 11:
4385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return RST_STREAM_ENHANCE_YOUR_CALM;
4395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      }
4405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      break;
4415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
4425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  LOG(DFATAL) << "Invalid RST_STREAM status " << rst_stream_status_field;
4445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return RST_STREAM_PROTOCOL_ERROR;
4455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
4465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuint SpdyConstants::SerializeRstStreamStatus(
4485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    SpdyMajorVersion version,
4495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    SpdyRstStreamStatus rst_stream_status) {
4505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  switch (version) {
4515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SPDY2:
4525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SPDY3:
4535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      switch (rst_stream_status) {
4545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case RST_STREAM_PROTOCOL_ERROR:
4555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return 1;
4565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case RST_STREAM_INVALID_STREAM:
4575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return 2;
4585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case RST_STREAM_REFUSED_STREAM:
4595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return 3;
4605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case RST_STREAM_UNSUPPORTED_VERSION:
4615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return 4;
4625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case RST_STREAM_CANCEL:
4635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return 5;
4645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case RST_STREAM_INTERNAL_ERROR:
4655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return 6;
4665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case RST_STREAM_FLOW_CONTROL_ERROR:
4675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return 7;
4685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case RST_STREAM_STREAM_IN_USE:
4695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return 8;
4705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case RST_STREAM_STREAM_ALREADY_CLOSED:
4715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return 9;
4725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case RST_STREAM_INVALID_CREDENTIALS:
4735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return 10;
4745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case RST_STREAM_FRAME_TOO_LARGE:
4755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return 11;
4765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        default:
4775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          LOG(DFATAL) << "Unhandled RST_STREAM status "
4785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      << rst_stream_status;
4795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return -1;
4805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      }
4815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SPDY4:
4825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SPDY5:
4835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      switch (rst_stream_status) {
4845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case RST_STREAM_PROTOCOL_ERROR:
4855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return 1;
4865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case RST_STREAM_INTERNAL_ERROR:
4875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return 2;
4885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case RST_STREAM_FLOW_CONTROL_ERROR:
4895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return 3;
4905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case RST_STREAM_STREAM_CLOSED:
4915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return 5;
4925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case RST_STREAM_FRAME_SIZE_ERROR:
4935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return 6;
4945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case RST_STREAM_REFUSED_STREAM:
4955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return 7;
4965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case RST_STREAM_CANCEL:
4975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return 8;
4985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case RST_STREAM_CONNECT_ERROR:
4995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return 10;
5005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case RST_STREAM_ENHANCE_YOUR_CALM:
5015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return 11;
5025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        default:
5035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          LOG(DFATAL) << "Unhandled RST_STREAM status "
5045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      << rst_stream_status;
5055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return -1;
5065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      }
5075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
5085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  LOG(DFATAL) << "Unhandled SPDY version " << version;
5095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return -1;
5105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
5115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
5125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool SpdyConstants::IsValidGoAwayStatus(SpdyMajorVersion version,
5135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                        int goaway_status_field) {
5145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  switch (version) {
5155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SPDY2:
5165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SPDY3:
5175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      // GOAWAY_OK is the first valid status.
5185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      if (goaway_status_field < SerializeGoAwayStatus(version, GOAWAY_OK)) {
5195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        return false;
5205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      }
5215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
5225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      // GOAWAY_INTERNAL_ERROR is the last valid status.
5235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      if (goaway_status_field > SerializeGoAwayStatus(version,
5245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                                      GOAWAY_INTERNAL_ERROR)) {
5255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        return false;
5265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      }
5275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
5285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return true;
5295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SPDY4:
5305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SPDY5:
5315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      // GOAWAY_NO_ERROR is the first valid status.
5325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      if (goaway_status_field < SerializeGoAwayStatus(version,
5335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                                      GOAWAY_NO_ERROR)) {
5345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        return false;
5355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      }
5365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
5375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      // GOAWAY_INADEQUATE_SECURITY is the last valid status.
5385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      if (goaway_status_field >
5395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          SerializeGoAwayStatus(version, GOAWAY_INADEQUATE_SECURITY)) {
5405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        return false;
5415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      }
5425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
5435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return true;
5445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
5455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  LOG(DFATAL) << "Unknown SpdyMajorVersion " << version;
5465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return false;
5475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
5485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
5495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuSpdyGoAwayStatus SpdyConstants::ParseGoAwayStatus(SpdyMajorVersion version,
5505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                                  int goaway_status_field) {
5515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  switch (version) {
5525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SPDY2:
5535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SPDY3:
5545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      switch (goaway_status_field) {
5555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case 0:
5565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return GOAWAY_OK;
5575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case 1:
5585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return GOAWAY_PROTOCOL_ERROR;
5595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case 2:
5605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return GOAWAY_INTERNAL_ERROR;
5615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      }
5625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      break;
5635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SPDY4:
5645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SPDY5:
5655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      switch (goaway_status_field) {
5665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case 0:
5675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return GOAWAY_NO_ERROR;
5685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case 1:
5695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return GOAWAY_PROTOCOL_ERROR;
5705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case 2:
5715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return GOAWAY_INTERNAL_ERROR;
5725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case 3:
5735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return GOAWAY_FLOW_CONTROL_ERROR;
5745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case 4:
5755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return GOAWAY_SETTINGS_TIMEOUT;
5765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case 5:
5775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return GOAWAY_STREAM_CLOSED;
5785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case 6:
5795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return GOAWAY_FRAME_SIZE_ERROR;
5805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case 7:
5815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return GOAWAY_REFUSED_STREAM;
5825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case 8:
5835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return GOAWAY_CANCEL;
5845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case 9:
5855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return GOAWAY_COMPRESSION_ERROR;
5865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case 10:
5875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return GOAWAY_CONNECT_ERROR;
5885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case 11:
5895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return GOAWAY_ENHANCE_YOUR_CALM;
5905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case 12:
5915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return GOAWAY_INADEQUATE_SECURITY;
5925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      }
5935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      break;
5945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
5955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
5965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  LOG(DFATAL) << "Unhandled GOAWAY status " << goaway_status_field;
5975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return GOAWAY_PROTOCOL_ERROR;
5985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
5995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
6005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuSpdyMajorVersion SpdyConstants::ParseMajorVersion(int version_number) {
6015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  switch (version_number) {
6025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case 2:
6035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return SPDY2;
6045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case 3:
6055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return SPDY3;
6065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case 4:
6075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return SPDY4;
6085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case 5:
6095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return SPDY5;
6105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    default:
6115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      LOG(DFATAL) << "Unsupported SPDY version number: " << version_number;
6125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return SPDY3;
6135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
6145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
6155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
6165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuint SpdyConstants::SerializeMajorVersion(SpdyMajorVersion version) {
6175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  switch (version) {
6185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SPDY2:
6195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return 2;
6205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SPDY3:
6215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return 3;
6225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SPDY4:
6235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return 4;
6245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SPDY5:
6255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return 5;
6265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    default:
6275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      LOG(DFATAL) << "Unsupported SPDY major version: " << version;
6285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return -1;
6295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
6305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
6315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
6325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustd::string SpdyConstants::GetVersionString(SpdyMajorVersion version) {
6335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  switch (version) {
6345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SPDY2:
6355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return "spdy/2";
6365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SPDY3:
6375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return "spdy/3";
6385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SPDY4:
6395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return "spdy/4";
6405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SPDY5:
6415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return "spdy/5";
6425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    default:
6435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      LOG(DFATAL) << "Unsupported SPDY major version: " << version;
6445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return "spdy/3";
6455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
6465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
6475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
6485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuint SpdyConstants::SerializeGoAwayStatus(SpdyMajorVersion version,
6495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                         SpdyGoAwayStatus status) {
6505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  switch (version) {
6515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SPDY2:
6525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SPDY3:
653f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      // TODO(jgraettinger): Merge this back to server-side.
6545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      switch (status) {
655f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        case GOAWAY_NO_ERROR:
6565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return 0;
6575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case GOAWAY_PROTOCOL_ERROR:
6585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case GOAWAY_INTERNAL_ERROR:
659f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        case GOAWAY_FLOW_CONTROL_ERROR:
660f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        case GOAWAY_SETTINGS_TIMEOUT:
661f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        case GOAWAY_STREAM_CLOSED:
662f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        case GOAWAY_FRAME_SIZE_ERROR:
663f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        case GOAWAY_REFUSED_STREAM:
664f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        case GOAWAY_CANCEL:
665f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        case GOAWAY_COMPRESSION_ERROR:
666f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        case GOAWAY_CONNECT_ERROR:
667f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        case GOAWAY_ENHANCE_YOUR_CALM:
668f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        case GOAWAY_INADEQUATE_SECURITY:
669f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          return 1;  // PROTOCOL_ERROR.
6705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        default:
6715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          LOG(DFATAL) << "Serializing unhandled GOAWAY status " << status;
6725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return -1;
6735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      }
6745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SPDY4:
6755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SPDY5:
6765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      switch (status) {
6775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case GOAWAY_NO_ERROR:
6785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return 0;
6795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case GOAWAY_PROTOCOL_ERROR:
6805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return 1;
6815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case GOAWAY_INTERNAL_ERROR:
6825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return 2;
6835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case GOAWAY_FLOW_CONTROL_ERROR:
6845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return 3;
6855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case GOAWAY_SETTINGS_TIMEOUT:
6865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return 4;
6875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case GOAWAY_STREAM_CLOSED:
6885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return 5;
6895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case GOAWAY_FRAME_SIZE_ERROR:
6905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return 6;
6915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case GOAWAY_REFUSED_STREAM:
6925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return 7;
6935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case GOAWAY_CANCEL:
6945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return 8;
6955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case GOAWAY_COMPRESSION_ERROR:
6965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return 9;
6975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case GOAWAY_CONNECT_ERROR:
6985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return 10;
6995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case GOAWAY_ENHANCE_YOUR_CALM:
7005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return 11;
7015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case GOAWAY_INADEQUATE_SECURITY:
7025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return 12;
7035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        default:
7045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          LOG(DFATAL) << "Serializing unhandled GOAWAY status " << status;
7055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          return -1;
7065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      }
7075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
7085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  LOG(DFATAL) << "Unknown SpdyMajorVersion " << version;
7095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return -1;
7105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
7115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
71203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)size_t SpdyConstants::GetDataFrameMinimumSize(SpdyMajorVersion version) {
71303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  switch (version) {
71403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    case SPDY2:
71503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    case SPDY3:
71603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      return 8;
71703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    case SPDY4:
71803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    case SPDY5:
71903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      return 9;
72003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
72103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  LOG(DFATAL) << "Unhandled SPDY version.";
72203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return 0;
7235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
7245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
7255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liusize_t SpdyConstants::GetControlFrameHeaderSize(SpdyMajorVersion version) {
7265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  switch (version) {
7275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SPDY2:
7285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SPDY3:
72903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      return 8;
7305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SPDY4:
7315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SPDY5:
73203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      return 9;
7335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
7345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  LOG(DFATAL) << "Unhandled SPDY version.";
7355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return 0;
7365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
7375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
7385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liusize_t SpdyConstants::GetPrefixLength(SpdyFrameType type,
7395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                      SpdyMajorVersion version) {
7405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (type != DATA) {
7415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu     return GetControlFrameHeaderSize(version);
7425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  } else {
74303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)     return GetDataFrameMinimumSize(version);
7445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
7455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
7465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
7475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liusize_t SpdyConstants::GetFrameMaximumSize(SpdyMajorVersion version) {
7485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (version < SPDY4) {
7495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    // 24-bit length field plus eight-byte frame header.
7505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return ((1<<24) - 1) + 8;
7515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  } else {
75203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    // Max payload of 2^14 plus nine-byte frame header.
75303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    // TODO(mlavan): In HTTP/2 this is actually not a constant;
75403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    // payload size can be set using the MAX_FRAME_SIZE setting to
75503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    // anything between 1 << 14 and (1 << 24) - 1
75603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return (1 << 14) + 9;
7575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
7585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
7595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
760cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)size_t SpdyConstants::GetSizeOfSizeField(SpdyMajorVersion version) {
761cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return (version < SPDY3) ? sizeof(uint16) : sizeof(uint32);
762cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
763cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
764116680a4aac90f2aa7413d9095a592090648e557Ben Murdochsize_t SpdyConstants::GetSettingSize(SpdyMajorVersion version) {
765116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return version <= SPDY3 ? 8 : 6;
766116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
767116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
768eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid SpdyDataIR::Visit(SpdyFrameVisitor* visitor) const {
769eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return visitor->VisitData(*this);
770eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
771eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
772eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid SpdySynStreamIR::Visit(SpdyFrameVisitor* visitor) const {
773eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return visitor->VisitSynStream(*this);
774eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
775eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
776eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid SpdySynReplyIR::Visit(SpdyFrameVisitor* visitor) const {
777eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return visitor->VisitSynReply(*this);
778eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
779eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
7805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)SpdyRstStreamIR::SpdyRstStreamIR(SpdyStreamId stream_id,
7815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 SpdyRstStreamStatus status,
7825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 base::StringPiece description)
7835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : SpdyFrameWithStreamIdIR(stream_id),
7845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      description_(description) {
7855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  set_status(status);
7865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
7875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)SpdyRstStreamIR::~SpdyRstStreamIR() {}
7895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
790eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid SpdyRstStreamIR::Visit(SpdyFrameVisitor* visitor) const {
791eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return visitor->VisitRstStream(*this);
792eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
793eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
794a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)SpdySettingsIR::SpdySettingsIR()
795a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    : clear_settings_(false),
796a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      is_ack_(false) {}
7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SpdySettingsIR::~SpdySettingsIR() {}
7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
800eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid SpdySettingsIR::Visit(SpdyFrameVisitor* visitor) const {
801eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return visitor->VisitSettings(*this);
802eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
803eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
804eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid SpdyPingIR::Visit(SpdyFrameVisitor* visitor) const {
805eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return visitor->VisitPing(*this);
806eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
807eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
8085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)SpdyGoAwayIR::SpdyGoAwayIR(SpdyStreamId last_good_stream_id,
8095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           SpdyGoAwayStatus status,
8105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           const base::StringPiece& description)
8115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : description_(description) {
8125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      set_last_good_stream_id(last_good_stream_id);
8135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  set_status(status);
8145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
8155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)SpdyGoAwayIR::~SpdyGoAwayIR() {}
8175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const base::StringPiece& SpdyGoAwayIR::description() const {
8195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return description_;
8205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
8215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
822eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid SpdyGoAwayIR::Visit(SpdyFrameVisitor* visitor) const {
823eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return visitor->VisitGoAway(*this);
824eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
825eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
826eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid SpdyHeadersIR::Visit(SpdyFrameVisitor* visitor) const {
827eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return visitor->VisitHeaders(*this);
828eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
829eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
830eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid SpdyWindowUpdateIR::Visit(SpdyFrameVisitor* visitor) const {
831eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return visitor->VisitWindowUpdate(*this);
832eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
833eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
834eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid SpdyBlockedIR::Visit(SpdyFrameVisitor* visitor) const {
835eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return visitor->VisitBlocked(*this);
836eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
837eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
8387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid SpdyPushPromiseIR::Visit(SpdyFrameVisitor* visitor) const {
8397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return visitor->VisitPushPromise(*this);
8407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
8417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
842a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SpdyContinuationIR::Visit(SpdyFrameVisitor* visitor) const {
843a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return visitor->VisitContinuation(*this);
844a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
845a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
846cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)SpdyAltSvcIR::SpdyAltSvcIR(SpdyStreamId stream_id)
847cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    : SpdyFrameWithStreamIdIR(stream_id),
848cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      max_age_(0),
849cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      port_(0) {}
850cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
851cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void SpdyAltSvcIR::Visit(SpdyFrameVisitor* visitor) const {
852cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return visitor->VisitAltSvc(*this);
853cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
854cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
855116680a4aac90f2aa7413d9095a592090648e557Ben MurdochSpdyPriorityIR::SpdyPriorityIR(SpdyStreamId stream_id)
856116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    : SpdyFrameWithStreamIdIR(stream_id) {
857116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
858116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
859116680a4aac90f2aa7413d9095a592090648e557Ben MurdochSpdyPriorityIR::SpdyPriorityIR(SpdyStreamId stream_id,
860116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                               SpdyStreamId parent_stream_id,
861116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                               uint8 weight,
862116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                               bool exclusive)
863116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    : SpdyFrameWithStreamIdIR(stream_id),
864116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      parent_stream_id_(parent_stream_id),
865116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      weight_(weight),
866116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      exclusive_(exclusive) {
867116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
868116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
869116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid SpdyPriorityIR::Visit(SpdyFrameVisitor* visitor) const {
870116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return visitor->VisitPriority(*this);
871116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
872116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
8737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}  // namespace net
874