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