spdy_protocol.h revision 5c02ac1a9c1b504631c0a3d2b6e737b5d738bae1
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This file contains some protocol structures for use with SPDY 2 and 3
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The SPDY 2 spec can be found at:
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// http://dev.chromium.org/spdy/spdy-protocol/spdy-protocol-draft2
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The SPDY 3 spec can be found at:
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// http://dev.chromium.org/spdy/spdy-protocol/spdy-protocol-draft3
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NET_SPDY_SPDY_PROTOCOL_H_
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NET_SPDY_SPDY_PROTOCOL_H_
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <map>
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string>
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector>
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/compiler_specific.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/string_piece.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/sys_byteorder.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/net_export.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/spdy/spdy_bitmasks.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// The major versions of SPDY. Major version differences indicate
3090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// framer-layer incompatibility, as opposed to minor version numbers
315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// which indicate application-layer incompatibility. Do not rely on
325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// the mapping from enum value SPDYn to the integer n.
3390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)enum SpdyMajorVersion {
3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SPDY2 = 2,
3590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SPDY_MIN_VERSION = SPDY2,
3690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SPDY3 = 3,
3790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SPDY4 = 4,
385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  SPDY5 = 5,
395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  SPDY_MAX_VERSION = SPDY5
4090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A SPDY stream id is a 31 bit entity.
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef uint32 SpdyStreamId;
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Specifies the stream ID used to denote the current session (for
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// flow control).
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const SpdyStreamId kSessionFlowControlStreamId = 0;
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Initial window size for a Spdy stream in bytes.
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int32 kSpdyStreamInitialWindowSize = 64 * 1024;  // 64 KBytes
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Initial window size for a Spdy session in bytes.
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int32 kSpdySessionInitialWindowSize = 64 * 1024;  // 64 KBytes
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Maximum window size for a Spdy stream or session.
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int32 kSpdyMaximumWindowSize = 0x7FFFFFFF;  // Max signed 32bit int
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SPDY 2 dictionary.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is just a hacked dictionary to use for shrinking HTTP-like headers.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kV2Dictionary[] =
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "optionsgetheadpostputdeletetraceacceptaccept-charsetaccept-encodingaccept-"
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "languageauthorizationexpectfromhostif-modified-sinceif-matchif-none-matchi"
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "f-rangeif-unmodifiedsincemax-forwardsproxy-authorizationrangerefererteuser"
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "-agent10010120020120220320420520630030130230330430530630740040140240340440"
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "5406407408409410411412413414415416417500501502503504505accept-rangesageeta"
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "glocationproxy-authenticatepublicretry-afterservervarywarningwww-authentic"
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "ateallowcontent-basecontent-encodingcache-controlconnectiondatetrailertran"
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "sfer-encodingupgradeviawarningcontent-languagecontent-lengthcontent-locati"
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "oncontent-md5content-rangecontent-typeetagexpireslast-modifiedset-cookieMo"
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "ndayTuesdayWednesdayThursdayFridaySaturdaySundayJanFebMarAprMayJunJulAugSe"
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "pOctNovDecchunkedtext/htmlimage/pngimage/jpgimage/gifapplication/xmlapplic"
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "ation/xhtmltext/plainpublicmax-agecharset=iso-8859-1utf-8gzipdeflateHTTP/1"
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ".1statusversionurl";
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kV2DictionarySize = arraysize(kV2Dictionary);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SPDY 3 dictionary.
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kV3Dictionary[] = {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x00, 0x00, 0x07, 0x6f, 0x70, 0x74, 0x69,  // ....opti
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x6f, 0x6e, 0x73, 0x00, 0x00, 0x00, 0x04, 0x68,  // ons....h
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x65, 0x61, 0x64, 0x00, 0x00, 0x00, 0x04, 0x70,  // ead....p
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x6f, 0x73, 0x74, 0x00, 0x00, 0x00, 0x03, 0x70,  // ost....p
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x75, 0x74, 0x00, 0x00, 0x00, 0x06, 0x64, 0x65,  // ut....de
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x6c, 0x65, 0x74, 0x65, 0x00, 0x00, 0x00, 0x05,  // lete....
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x74, 0x72, 0x61, 0x63, 0x65, 0x00, 0x00, 0x00,  // trace...
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x06, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x00,  // .accept.
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x00, 0x0e, 0x61, 0x63, 0x63, 0x65, 0x70,  // ...accep
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x74, 0x2d, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65,  // t-charse
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x74, 0x00, 0x00, 0x00, 0x0f, 0x61, 0x63, 0x63,  // t....acc
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x65, 0x70, 0x74, 0x2d, 0x65, 0x6e, 0x63, 0x6f,  // ept-enco
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x64, 0x69, 0x6e, 0x67, 0x00, 0x00, 0x00, 0x0f,  // ding....
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x2d, 0x6c,  // accept-l
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x00,  // anguage.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x00, 0x0d, 0x61, 0x63, 0x63, 0x65, 0x70,  // ...accep
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x74, 0x2d, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x73,  // t-ranges
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x00, 0x00, 0x03, 0x61, 0x67, 0x65, 0x00,  // ....age.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x00, 0x05, 0x61, 0x6c, 0x6c, 0x6f, 0x77,  // ...allow
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x00, 0x00, 0x0d, 0x61, 0x75, 0x74, 0x68,  // ....auth
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f,  // orizatio
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x6e, 0x00, 0x00, 0x00, 0x0d, 0x63, 0x61, 0x63,  // n....cac
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x68, 0x65, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72,  // he-contr
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x6f, 0x6c, 0x00, 0x00, 0x00, 0x0a, 0x63, 0x6f,  // ol....co
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e,  // nnection
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x00, 0x00, 0x0c, 0x63, 0x6f, 0x6e, 0x74,  // ....cont
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x65, 0x6e, 0x74, 0x2d, 0x62, 0x61, 0x73, 0x65,  // ent-base
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x00, 0x00, 0x10, 0x63, 0x6f, 0x6e, 0x74,  // ....cont
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x65, 0x6e, 0x74, 0x2d, 0x65, 0x6e, 0x63, 0x6f,  // ent-enco
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x64, 0x69, 0x6e, 0x67, 0x00, 0x00, 0x00, 0x10,  // ding....
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d,  // content-
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65,  // language
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x00, 0x00, 0x0e, 0x63, 0x6f, 0x6e, 0x74,  // ....cont
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x65, 0x6e, 0x74, 0x2d, 0x6c, 0x65, 0x6e, 0x67,  // ent-leng
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x74, 0x68, 0x00, 0x00, 0x00, 0x10, 0x63, 0x6f,  // th....co
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x6c, 0x6f,  // ntent-lo
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00,  // cation..
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,  // ..conten
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x74, 0x2d, 0x6d, 0x64, 0x35, 0x00, 0x00, 0x00,  // t-md5...
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,  // .content
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x2d, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x00, 0x00,  // -range..
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,  // ..conten
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x00, 0x00,  // t-type..
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x04, 0x64, 0x61, 0x74, 0x65, 0x00, 0x00,  // ..date..
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x04, 0x65, 0x74, 0x61, 0x67, 0x00, 0x00,  // ..etag..
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x06, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74,  // ..expect
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x00, 0x00, 0x07, 0x65, 0x78, 0x70, 0x69,  // ....expi
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x72, 0x65, 0x73, 0x00, 0x00, 0x00, 0x04, 0x66,  // res....f
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x72, 0x6f, 0x6d, 0x00, 0x00, 0x00, 0x04, 0x68,  // rom....h
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x6f, 0x73, 0x74, 0x00, 0x00, 0x00, 0x08, 0x69,  // ost....i
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x66, 0x2d, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x00,  // f-match.
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x00, 0x11, 0x69, 0x66, 0x2d, 0x6d, 0x6f,  // ...if-mo
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x2d, 0x73,  // dified-s
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x69, 0x6e, 0x63, 0x65, 0x00, 0x00, 0x00, 0x0d,  // ince....
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x69, 0x66, 0x2d, 0x6e, 0x6f, 0x6e, 0x65, 0x2d,  // if-none-
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x6d, 0x61, 0x74, 0x63, 0x68, 0x00, 0x00, 0x00,  // match...
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x08, 0x69, 0x66, 0x2d, 0x72, 0x61, 0x6e, 0x67,  // .if-rang
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x65, 0x00, 0x00, 0x00, 0x13, 0x69, 0x66, 0x2d,  // e....if-
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x75, 0x6e, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69,  // unmodifi
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x65, 0x64, 0x2d, 0x73, 0x69, 0x6e, 0x63, 0x65,  // ed-since
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x00, 0x00, 0x0d, 0x6c, 0x61, 0x73, 0x74,  // ....last
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x2d, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65,  // -modifie
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x64, 0x00, 0x00, 0x00, 0x08, 0x6c, 0x6f, 0x63,  // d....loc
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x61, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x00,  // ation...
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x0c, 0x6d, 0x61, 0x78, 0x2d, 0x66, 0x6f, 0x72,  // .max-for
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x77, 0x61, 0x72, 0x64, 0x73, 0x00, 0x00, 0x00,  // wards...
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x06, 0x70, 0x72, 0x61, 0x67, 0x6d, 0x61, 0x00,  // .pragma.
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x00, 0x12, 0x70, 0x72, 0x6f, 0x78, 0x79,  // ...proxy
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x2d, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74,  // -authent
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x69, 0x63, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00,  // icate...
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x13, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2d, 0x61,  // .proxy-a
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61,  // uthoriza
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x00, 0x05,  // tion....
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x72, 0x61, 0x6e, 0x67, 0x65, 0x00, 0x00, 0x00,  // range...
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x07, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x72,  // .referer
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x00, 0x00, 0x0b, 0x72, 0x65, 0x74, 0x72,  // ....retr
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x79, 0x2d, 0x61, 0x66, 0x74, 0x65, 0x72, 0x00,  // y-after.
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x00, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65,  // ...serve
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x72, 0x00, 0x00, 0x00, 0x02, 0x74, 0x65, 0x00,  // r....te.
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x00, 0x07, 0x74, 0x72, 0x61, 0x69, 0x6c,  // ...trail
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x65, 0x72, 0x00, 0x00, 0x00, 0x11, 0x74, 0x72,  // er....tr
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x2d, 0x65,  // ansfer-e
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x00,  // ncoding.
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x00, 0x07, 0x75, 0x70, 0x67, 0x72, 0x61,  // ...upgra
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x64, 0x65, 0x00, 0x00, 0x00, 0x0a, 0x75, 0x73,  // de....us
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x65, 0x72, 0x2d, 0x61, 0x67, 0x65, 0x6e, 0x74,  // er-agent
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x00, 0x00, 0x04, 0x76, 0x61, 0x72, 0x79,  // ....vary
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x00, 0x00, 0x03, 0x76, 0x69, 0x61, 0x00,  // ....via.
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x00, 0x07, 0x77, 0x61, 0x72, 0x6e, 0x69,  // ...warni
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x6e, 0x67, 0x00, 0x00, 0x00, 0x10, 0x77, 0x77,  // ng....ww
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x77, 0x2d, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e,  // w-authen
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x00, 0x00,  // ticate..
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64,  // ..method
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x00, 0x00, 0x03, 0x67, 0x65, 0x74, 0x00,  // ....get.
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x00, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75,  // ...statu
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x73, 0x00, 0x00, 0x00, 0x06, 0x32, 0x30, 0x30,  // s....200
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x20, 0x4f, 0x4b, 0x00, 0x00, 0x00, 0x07, 0x76,  // .OK....v
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x00, 0x00,  // ersion..
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x08, 0x48, 0x54, 0x54, 0x50, 0x2f, 0x31,  // ..HTTP.1
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x2e, 0x31, 0x00, 0x00, 0x00, 0x03, 0x75, 0x72,  // .1....ur
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x6c, 0x00, 0x00, 0x00, 0x06, 0x70, 0x75, 0x62,  // l....pub
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x6c, 0x69, 0x63, 0x00, 0x00, 0x00, 0x0a, 0x73,  // lic....s
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x65, 0x74, 0x2d, 0x63, 0x6f, 0x6f, 0x6b, 0x69,  // et-cooki
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x65, 0x00, 0x00, 0x00, 0x0a, 0x6b, 0x65, 0x65,  // e....kee
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x70, 0x2d, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x00,  // p-alive.
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x00, 0x06, 0x6f, 0x72, 0x69, 0x67, 0x69,  // ...origi
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x6e, 0x31, 0x30, 0x30, 0x31, 0x30, 0x31, 0x32,  // n1001012
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x30, 0x31, 0x32, 0x30, 0x32, 0x32, 0x30, 0x35,  // 01202205
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x32, 0x30, 0x36, 0x33, 0x30, 0x30, 0x33, 0x30,  // 20630030
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x32, 0x33, 0x30, 0x33, 0x33, 0x30, 0x34, 0x33,  // 23033043
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x30, 0x35, 0x33, 0x30, 0x36, 0x33, 0x30, 0x37,  // 05306307
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x34, 0x30, 0x32, 0x34, 0x30, 0x35, 0x34, 0x30,  // 40240540
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x36, 0x34, 0x30, 0x37, 0x34, 0x30, 0x38, 0x34,  // 64074084
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x30, 0x39, 0x34, 0x31, 0x30, 0x34, 0x31, 0x31,  // 09410411
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x34, 0x31, 0x32, 0x34, 0x31, 0x33, 0x34, 0x31,  // 41241341
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x34, 0x34, 0x31, 0x35, 0x34, 0x31, 0x36, 0x34,  // 44154164
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x31, 0x37, 0x35, 0x30, 0x32, 0x35, 0x30, 0x34,  // 17502504
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x35, 0x30, 0x35, 0x32, 0x30, 0x33, 0x20, 0x4e,  // 505203.N
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x6f, 0x6e, 0x2d, 0x41, 0x75, 0x74, 0x68, 0x6f,  // on-Autho
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x72, 0x69, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65,  // ritative
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x20, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61,  // .Informa
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x74, 0x69, 0x6f, 0x6e, 0x32, 0x30, 0x34, 0x20,  // tion204.
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x4e, 0x6f, 0x20, 0x43, 0x6f, 0x6e, 0x74, 0x65,  // No.Conte
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x6e, 0x74, 0x33, 0x30, 0x31, 0x20, 0x4d, 0x6f,  // nt301.Mo
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x76, 0x65, 0x64, 0x20, 0x50, 0x65, 0x72, 0x6d,  // ved.Perm
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x61, 0x6e, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x34,  // anently4
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x30, 0x30, 0x20, 0x42, 0x61, 0x64, 0x20, 0x52,  // 00.Bad.R
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x34, 0x30,  // equest40
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x31, 0x20, 0x55, 0x6e, 0x61, 0x75, 0x74, 0x68,  // 1.Unauth
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x34, 0x30,  // orized40
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x33, 0x20, 0x46, 0x6f, 0x72, 0x62, 0x69, 0x64,  // 3.Forbid
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x64, 0x65, 0x6e, 0x34, 0x30, 0x34, 0x20, 0x4e,  // den404.N
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x6f, 0x74, 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64,  // ot.Found
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x35, 0x30, 0x30, 0x20, 0x49, 0x6e, 0x74, 0x65,  // 500.Inte
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x72, 0x6e, 0x61, 0x6c, 0x20, 0x53, 0x65, 0x72,  // rnal.Ser
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x76, 0x65, 0x72, 0x20, 0x45, 0x72, 0x72, 0x6f,  // ver.Erro
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x72, 0x35, 0x30, 0x31, 0x20, 0x4e, 0x6f, 0x74,  // r501.Not
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x20, 0x49, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65,  // .Impleme
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x6e, 0x74, 0x65, 0x64, 0x35, 0x30, 0x33, 0x20,  // nted503.
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x20,  // Service.
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x55, 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61,  // Unavaila
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x62, 0x6c, 0x65, 0x4a, 0x61, 0x6e, 0x20, 0x46,  // bleJan.F
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x65, 0x62, 0x20, 0x4d, 0x61, 0x72, 0x20, 0x41,  // eb.Mar.A
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x70, 0x72, 0x20, 0x4d, 0x61, 0x79, 0x20, 0x4a,  // pr.May.J
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x75, 0x6e, 0x20, 0x4a, 0x75, 0x6c, 0x20, 0x41,  // un.Jul.A
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x75, 0x67, 0x20, 0x53, 0x65, 0x70, 0x74, 0x20,  // ug.Sept.
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x4f, 0x63, 0x74, 0x20, 0x4e, 0x6f, 0x76, 0x20,  // Oct.Nov.
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x44, 0x65, 0x63, 0x20, 0x30, 0x30, 0x3a, 0x30,  // Dec.00.0
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x30, 0x3a, 0x30, 0x30, 0x20, 0x4d, 0x6f, 0x6e,  // 0.00.Mon
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x2c, 0x20, 0x54, 0x75, 0x65, 0x2c, 0x20, 0x57,  // ..Tue..W
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x65, 0x64, 0x2c, 0x20, 0x54, 0x68, 0x75, 0x2c,  // ed..Thu.
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x20, 0x46, 0x72, 0x69, 0x2c, 0x20, 0x53, 0x61,  // .Fri..Sa
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x74, 0x2c, 0x20, 0x53, 0x75, 0x6e, 0x2c, 0x20,  // t..Sun..
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x47, 0x4d, 0x54, 0x63, 0x68, 0x75, 0x6e, 0x6b,  // GMTchunk
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x65, 0x64, 0x2c, 0x74, 0x65, 0x78, 0x74, 0x2f,  // ed.text.
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x68, 0x74, 0x6d, 0x6c, 0x2c, 0x69, 0x6d, 0x61,  // html.ima
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x67, 0x65, 0x2f, 0x70, 0x6e, 0x67, 0x2c, 0x69,  // ge.png.i
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x6d, 0x61, 0x67, 0x65, 0x2f, 0x6a, 0x70, 0x67,  // mage.jpg
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x2c, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x67,  // .image.g
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x69, 0x66, 0x2c, 0x61, 0x70, 0x70, 0x6c, 0x69,  // if.appli
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x78,  // cation.x
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x6d, 0x6c, 0x2c, 0x61, 0x70, 0x70, 0x6c, 0x69,  // ml.appli
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x78,  // cation.x
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x68, 0x74, 0x6d, 0x6c, 0x2b, 0x78, 0x6d, 0x6c,  // html.xml
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x2c, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x70, 0x6c,  // .text.pl
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x61, 0x69, 0x6e, 0x2c, 0x74, 0x65, 0x78, 0x74,  // ain.text
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x2f, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72,  // .javascr
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x69, 0x70, 0x74, 0x2c, 0x70, 0x75, 0x62, 0x6c,  // ipt.publ
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x69, 0x63, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74,  // icprivat
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x65, 0x6d, 0x61, 0x78, 0x2d, 0x61, 0x67, 0x65,  // emax-age
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x3d, 0x67, 0x7a, 0x69, 0x70, 0x2c, 0x64, 0x65,  // .gzip.de
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x66, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x73, 0x64,  // flate.sd
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x63, 0x68, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65,  // chcharse
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x74, 0x3d, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x63,  // t.utf-8c
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, 0x69,  // harset.i
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x73, 0x6f, 0x2d, 0x38, 0x38, 0x35, 0x39, 0x2d,  // so-8859-
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x31, 0x2c, 0x75, 0x74, 0x66, 0x2d, 0x2c, 0x2a,  // 1.utf-..
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x2c, 0x65, 0x6e, 0x71, 0x3d, 0x30, 0x2e         // .enq.0.
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kV3DictionarySize = arraysize(kV3Dictionary);
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
259a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// The HTTP/2 connection header prefix, which must be the first bytes
260a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// sent by the client upon starting an HTTP/2 connection, and which
261a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// must be followed by a SETTINGS frame.
2622385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch//
2632385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// Equivalent to the string "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n"
2642385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// (without the null terminator).
2652385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochconst char kHttp2ConnectionHeaderPrefix[] = {
2662385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  0x50, 0x52, 0x49, 0x20, 0x2a, 0x20, 0x48, 0x54,  // PRI * HT
2672385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  0x54, 0x50, 0x2f, 0x32, 0x2e, 0x30, 0x0d, 0x0a,  // TP/2.0..
2682385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  0x0d, 0x0a, 0x53, 0x4d, 0x0d, 0x0a, 0x0d, 0x0a   // ..SM....
2692385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch};
270a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)const int kHttp2ConnectionHeaderPrefixSize =
271a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    arraysize(kHttp2ConnectionHeaderPrefix);
272a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Types of SPDY frames.
274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)enum SpdyFrameType {
275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DATA = 0,
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SYN_STREAM = 1,
277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FIRST_CONTROL_TYPE = SYN_STREAM,
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SYN_REPLY,
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RST_STREAM,
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SETTINGS,
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOOP,  // Because it is valid in SPDY/2, kept for identifiability/enum order.
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PING,
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GOAWAY,
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HEADERS,
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WINDOW_UPDATE,
2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CREDENTIAL,  // No longer valid.  Kept for identifiability/enum order.
287868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  BLOCKED,
2887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  PUSH_PROMISE,
289a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  CONTINUATION,
290a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  LAST_CONTROL_TYPE = CONTINUATION
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flags on data packets.
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum SpdyDataFlags {
2954ad1aa43a48567659193a298fad74f55e00b3dd9Ben MurdochDATA_FLAG_NONE = 0x00,
2964ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  DATA_FLAG_FIN = 0x01,
2974ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  DATA_FLAG_END_SEGMENT = 0x02,
2984ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  DATA_FLAG_PAD_LOW = 0x10,
2994ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  DATA_FLAG_PAD_HIGH = 0x20
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flags on control packets
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum SpdyControlFlags {
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CONTROL_FLAG_NONE = 0,
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CONTROL_FLAG_FIN = 1,
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CONTROL_FLAG_UNIDIRECTIONAL = 2
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
309a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)enum SpdyPingFlags {
310a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PING_FLAG_ACK = 0x1,
311a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
312a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)enum SpdyHeadersFlags {
314a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  HEADERS_FLAG_END_HEADERS = 0x4,
315a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  HEADERS_FLAG_PRIORITY = 0x8
316a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
317a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
318a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)enum SpdyPushPromiseFlags {
319a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PUSH_PROMISE_FLAG_END_PUSH_PROMISE = 0x4
3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flags on the SETTINGS control frame.
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum SpdySettingsControlFlags {
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SETTINGS_FLAG_CLEAR_PREVIOUSLY_PERSISTED_SETTINGS = 0x1
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
327a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)enum Http2SettingsControlFlags {
328a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SETTINGS_FLAG_ACK = 0x1,
329a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
330a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flags for settings within a SETTINGS frame.
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum SpdySettingsFlags {
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SETTINGS_FLAG_NONE = 0x0,
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SETTINGS_FLAG_PLEASE_PERSIST = 0x1,
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SETTINGS_FLAG_PERSISTED = 0x2
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
338e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// List of known settings. Avoid changing these enum values, as persisted
339e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// settings are keyed on them, and they are also exposed in net-internals.
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum SpdySettingsIds {
341e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  SETTINGS_UPLOAD_BANDWIDTH = 0x1,
342e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  SETTINGS_DOWNLOAD_BANDWIDTH = 0x2,
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Network round trip time in milliseconds.
344e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  SETTINGS_ROUND_TRIP_TIME = 0x3,
3454ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // The maximum number of simultaneous live streams in each direction.
346e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  SETTINGS_MAX_CONCURRENT_STREAMS = 0x4,
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TCP congestion window in packets.
348e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  SETTINGS_CURRENT_CWND = 0x5,
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Downstream byte retransmission rate in percentage.
350e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  SETTINGS_DOWNLOAD_RETRANS_RATE = 0x6,
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initial window size in bytes
352e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  SETTINGS_INITIAL_WINDOW_SIZE = 0x7,
3534ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // HPACK header table maximum size.
354e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  SETTINGS_HEADER_TABLE_SIZE = 0x8,
3554ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // Whether or not server push (PUSH_PROMISE) is enabled.
356e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  SETTINGS_ENABLE_PUSH = 0x9,
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Status codes for RST_STREAM frames.
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)enum SpdyRstStreamStatus {
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RST_STREAM_INVALID = 0,
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RST_STREAM_PROTOCOL_ERROR = 1,
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RST_STREAM_INVALID_STREAM = 2,
3645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  RST_STREAM_STREAM_CLOSED = 2,  // Equivalent to INVALID_STREAM
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RST_STREAM_REFUSED_STREAM = 3,
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RST_STREAM_UNSUPPORTED_VERSION = 4,
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RST_STREAM_CANCEL = 5,
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RST_STREAM_INTERNAL_ERROR = 6,
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RST_STREAM_FLOW_CONTROL_ERROR = 7,
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RST_STREAM_STREAM_IN_USE = 8,
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RST_STREAM_STREAM_ALREADY_CLOSED = 9,
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RST_STREAM_INVALID_CREDENTIALS = 10,
3735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // FRAME_TOO_LARGE (defined by SPDY versions 3.1 and below), and
3745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // FRAME_SIZE_ERROR (defined by HTTP/2) are mapped to the same internal
3755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // reset status.
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RST_STREAM_FRAME_TOO_LARGE = 11,
3775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  RST_STREAM_FRAME_SIZE_ERROR = 11,
3785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  RST_STREAM_SETTINGS_TIMEOUT = 12,
3795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  RST_STREAM_CONNECT_ERROR = 13,
3805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  RST_STREAM_ENHANCE_YOUR_CALM = 14,
3815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  RST_STREAM_NUM_STATUS_CODES = 15
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Status codes for GOAWAY frames.
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum SpdyGoAwayStatus {
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GOAWAY_OK = 0,
3875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  GOAWAY_NO_ERROR = GOAWAY_OK,
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GOAWAY_PROTOCOL_ERROR = 1,
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GOAWAY_INTERNAL_ERROR = 2,
3905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  GOAWAY_FLOW_CONTROL_ERROR = 3,
3915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  GOAWAY_SETTINGS_TIMEOUT = 4,
3925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  GOAWAY_STREAM_CLOSED = 5,
3935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  GOAWAY_FRAME_SIZE_ERROR = 6,
3945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  GOAWAY_REFUSED_STREAM = 7,
3955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  GOAWAY_CANCEL = 8,
3965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  GOAWAY_COMPRESSION_ERROR = 9,
3975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  GOAWAY_CONNECT_ERROR = 10,
3985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  GOAWAY_ENHANCE_YOUR_CALM = 11,
3995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  GOAWAY_INADEQUATE_SECURITY = 12
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A SPDY priority is a number between 0 and 7 (inclusive).
403a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// SPDY priority range is version-dependent. For SPDY 2 and below, priority is a
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// number between 0 and 3.
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef uint8 SpdyPriority;
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef std::map<std::string, std::string> SpdyNameValueBlock;
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)typedef uint64 SpdyPingId;
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4114ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch// TODO(hkhalil): Add direct testing for this? It won't increase coverage any,
4124ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch// but is good to do anyway.
4134ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdochclass NET_EXPORT_PRIVATE SpdyConstants {
4144ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch public:
4154ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // Returns true if a given on-the-wire enumeration of a frame type is valid
4164ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // for a given protocol version, false otherwise.
4174ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  static bool IsValidFrameType(SpdyMajorVersion version, int frame_type_field);
4184ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
4194ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // Parses a frame type from an on-the-wire enumeration of a given protocol
4204ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // version.
4214ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // Behavior is undefined for invalid frame type fields; consumers should first
4224ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // use IsValidFrameType() to verify validity of frame type fields.
4234ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  static SpdyFrameType ParseFrameType(SpdyMajorVersion version,
4244ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch                                      int frame_type_field);
4254ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
4264ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // Serializes a given frame type to the on-the-wire enumeration value for the
4274ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // given protocol version.
4284ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // Returns -1 on failure (I.E. Invalid frame type for the given version).
4294ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  static int SerializeFrameType(SpdyMajorVersion version,
4304ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch                                SpdyFrameType frame_type);
4314ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
4324ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // Returns true if a given on-the-wire enumeration of a setting id is valid
4334ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // for a given protocol version, false otherwise.
4344ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  static bool IsValidSettingId(SpdyMajorVersion version, int setting_id_field);
4354ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
4364ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // Parses a setting id from an on-the-wire enumeration of a given protocol
4374ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // version.
4384ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // Behavior is undefined for invalid setting id fields; consumers should first
4394ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // use IsValidSettingId() to verify validity of setting id fields.
4404ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  static SpdySettingsIds ParseSettingId(SpdyMajorVersion version,
4414ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch                                        int setting_id_field);
4424ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
4434ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // Serializes a given setting id to the on-the-wire enumeration value for the
4444ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // given protocol version.
4454ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // Returns -1 on failure (I.E. Invalid setting id for the given version).
4464ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  static int SerializeSettingId(SpdyMajorVersion version, SpdySettingsIds id);
4475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Returns true if a given on-the-wire enumeration of a RST_STREAM status code
4495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // is valid for a given protocol version, false otherwise.
4505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  static bool IsValidRstStreamStatus(SpdyMajorVersion version,
4515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                     int rst_stream_status_field);
4525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Parses a RST_STREAM status code from an on-the-wire enumeration of a given
4545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // protocol version.
4555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Behavior is undefined for invalid RST_STREAM status code fields; consumers
4565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // should first use IsValidRstStreamStatus() to verify validity of RST_STREAM
4575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // status code fields..
4585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  static SpdyRstStreamStatus ParseRstStreamStatus(SpdyMajorVersion version,
4595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                                  int rst_stream_status_field);
4605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Serializes a given RST_STREAM status code to the on-the-wire enumeration
4625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // value for the given protocol version.
4635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Returns -1 on failure (I.E. Invalid RST_STREAM status code for the given
4645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // version).
4655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  static int SerializeRstStreamStatus(SpdyMajorVersion version,
4665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                      SpdyRstStreamStatus rst_stream_status);
4675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Returns true if a given on-the-wire enumeration of a GOAWAY status code is
4695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // valid for the given protocol version, false otherwise.
4705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  static bool IsValidGoAwayStatus(SpdyMajorVersion version,
4715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                  int goaway_status_field);
4725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Parses a GOAWAY status from an on-the-wire enumeration of a given protocol
4745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // version.
4755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Behavior is undefined for invalid GOAWAY status fields; consumers should
4765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // first use IsValidGoAwayStatus() to verify validity of GOAWAY status fields.
4775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  static SpdyGoAwayStatus ParseGoAwayStatus(SpdyMajorVersion version,
4785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                            int goaway_status_field);
4795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Serializes a given GOAWAY status to the on-the-wire enumeration value for
4815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // the given protocol version.
4825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Returns -1 on failure (I.E. Invalid GOAWAY status for the given version).
4835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  static int SerializeGoAwayStatus(SpdyMajorVersion version,
4845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                   SpdyGoAwayStatus status);
4855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Size, in bytes, of the data frame header. Future versions of SPDY
4875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // will likely vary this, so we allow for the flexibility of a function call
4885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // for this value as opposed to a constant.
4895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  static size_t GetDataFrameMinimumSize();
4905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Size, in bytes, of the control frame header.
4925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  static size_t GetControlFrameHeaderSize(SpdyMajorVersion version);
4935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  static size_t GetPrefixLength(SpdyFrameType type, SpdyMajorVersion version);
4955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  static size_t GetFrameMaximumSize(SpdyMajorVersion version);
4975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  static SpdyMajorVersion ParseMajorVersion(int version_number);
4995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
5005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  static int SerializeMajorVersion(SpdyMajorVersion version);
5015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
5025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  static std::string GetVersionString(SpdyMajorVersion version);
5034ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch};
5044ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SpdyFrame;
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef SpdyFrame SpdySerializedFrame;
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
508eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass SpdyFrameVisitor;
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Intermediate representation for SPDY frames.
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(hkhalil): Rename this class to SpdyFrame when the existing SpdyFrame is
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// gone.
5135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class NET_EXPORT_PRIVATE SpdyFrameIR {
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~SpdyFrameIR() {}
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
517eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void Visit(SpdyFrameVisitor* visitor) const = 0;
518eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpdyFrameIR() {}
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SpdyFrameIR);
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Abstract class intended to be inherited by IRs that have a stream associated
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// to them.
5285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class NET_EXPORT_PRIVATE SpdyFrameWithStreamIdIR : public SpdyFrameIR {
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~SpdyFrameWithStreamIdIR() {}
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpdyStreamId stream_id() const { return stream_id_; }
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_stream_id(SpdyStreamId stream_id) {
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK_EQ(0u, stream_id & ~kStreamIdMask);
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    stream_id_ = stream_id;
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit SpdyFrameWithStreamIdIR(SpdyStreamId stream_id) {
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    set_stream_id(stream_id);
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpdyStreamId stream_id_;
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SpdyFrameWithStreamIdIR);
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Abstract class intended to be inherited by IRs that have the option of a FIN
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// flag. Implies SpdyFrameWithStreamIdIR.
5505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class NET_EXPORT_PRIVATE SpdyFrameWithFinIR : public SpdyFrameWithStreamIdIR {
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~SpdyFrameWithFinIR() {}
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool fin() const { return fin_; }
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_fin(bool fin) { fin_ = fin; }
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit SpdyFrameWithFinIR(SpdyStreamId stream_id)
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : SpdyFrameWithStreamIdIR(stream_id),
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        fin_(false) {}
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool fin_;
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SpdyFrameWithFinIR);
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Abstract class intended to be inherited by IRs that contain a name-value
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// block. Implies SpdyFrameWithFinIR.
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class NET_EXPORT_PRIVATE SpdyFrameWithNameValueBlockIR
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public NON_EXPORTED_BASE(SpdyFrameWithFinIR) {
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const SpdyNameValueBlock& name_value_block() const {
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return name_value_block_;
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void set_name_value_block(const SpdyNameValueBlock& name_value_block) {
5765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Deep copy.
5775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    name_value_block_ = name_value_block;
5785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetHeader(const base::StringPiece& name,
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 const base::StringPiece& value) {
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    name_value_block_[name.as_string()] = value.as_string();
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
583c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  SpdyNameValueBlock* mutable_name_value_block() {
584c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return &name_value_block_;
585c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit SpdyFrameWithNameValueBlockIR(SpdyStreamId stream_id);
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~SpdyFrameWithNameValueBlockIR();
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpdyNameValueBlock name_value_block_;
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SpdyFrameWithNameValueBlockIR);
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class NET_EXPORT_PRIVATE SpdyDataIR
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public NON_EXPORTED_BASE(SpdyFrameWithFinIR) {
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Performs deep copy on data.
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpdyDataIR(SpdyStreamId stream_id, const base::StringPiece& data);
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Use in conjunction with SetDataShallow() for shallow-copy on data.
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit SpdyDataIR(SpdyStreamId stream_id);
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~SpdyDataIR();
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::StringPiece data() const { return data_; }
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6104ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  bool pad_low() const { return pad_low_; }
6114ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
6124ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  bool pad_high() const { return pad_high_; }
6134ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
6144ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  int padding_payload_len() const { return padding_payload_len_; }
6154ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
6164ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  void set_padding_len(int padding_len) {
6174ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    // The padding_len should be in (0, 65535 + 2].
6184ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    // Note that SpdyFramer::GetDataFrameMaximumPayload() enforces the overall
6194ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    // payload size later so we actually can't pad more than 16375 bytes.
6204ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    DCHECK_GT(padding_len, 0);
6214ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    DCHECK_LT(padding_len, 65537);
6224ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
6234ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    if (padding_len <= 256) {
6244ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      pad_low_ = true;
6254ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      --padding_len;
6264ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    } else {
6274ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      pad_low_ = pad_high_ = true;
6284ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      padding_len -= 2;
6294ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    }
6304ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    padding_payload_len_ = padding_len;
6314ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  }
6324ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Deep-copy of data (keep private copy).
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetDataDeep(const base::StringPiece& data) {
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    data_store_.reset(new std::string(data.data(), data.length()));
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    data_ = *(data_store_.get());
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Shallow-copy of data (do not keep private copy).
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetDataShallow(const base::StringPiece& data) {
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    data_store_.reset();
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    data_ = data;
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void Visit(SpdyFrameVisitor* visitor) const OVERRIDE;
646eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Used to store data that this SpdyDataIR should own.
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<std::string> data_store_;
6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::StringPiece data_;
6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6524ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  bool pad_low_;
6534ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  bool pad_high_;
6544ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // padding_payload_len_ = desired padding length - len(padding length field).
6554ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  int padding_payload_len_;
6564ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SpdyDataIR);
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
660eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass NET_EXPORT_PRIVATE SpdySynStreamIR
661eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    : public SpdyFrameWithNameValueBlockIR {
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit SpdySynStreamIR(SpdyStreamId stream_id)
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : SpdyFrameWithNameValueBlockIR(stream_id),
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        associated_to_stream_id_(0),
6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        priority_(0),
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        unidirectional_(false) {}
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpdyStreamId associated_to_stream_id() const {
6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return associated_to_stream_id_;
6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_associated_to_stream_id(SpdyStreamId stream_id) {
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    associated_to_stream_id_ = stream_id;
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpdyPriority priority() const { return priority_; }
6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_priority(SpdyPriority priority) { priority_ = priority; }
6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool unidirectional() const { return unidirectional_; }
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_unidirectional(bool unidirectional) {
6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    unidirectional_ = unidirectional;
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
681eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void Visit(SpdyFrameVisitor* visitor) const OVERRIDE;
682eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpdyStreamId associated_to_stream_id_;
6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpdyPriority priority_;
6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool unidirectional_;
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SpdySynStreamIR);
6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class NET_EXPORT_PRIVATE SpdySynReplyIR : public SpdyFrameWithNameValueBlockIR {
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit SpdySynReplyIR(SpdyStreamId stream_id)
6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : SpdyFrameWithNameValueBlockIR(stream_id) {}
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
696eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void Visit(SpdyFrameVisitor* visitor) const OVERRIDE;
697eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SpdySynReplyIR);
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class NET_EXPORT_PRIVATE SpdyRstStreamIR : public SpdyFrameWithStreamIdIR {
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
7045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SpdyRstStreamIR(SpdyStreamId stream_id, SpdyRstStreamStatus status,
7055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  base::StringPiece description);
7065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual ~SpdyRstStreamIR();
7085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpdyRstStreamStatus status() const {
7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return status_;
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_status(SpdyRstStreamStatus status) {
7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    status_ = status;
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::StringPiece description() const { return description_; }
7175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void set_description(base::StringPiece description) {
7195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    description_ = description;
7205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
7215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
722eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void Visit(SpdyFrameVisitor* visitor) const OVERRIDE;
723eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpdyRstStreamStatus status_;
7265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::StringPiece description_;
7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SpdyRstStreamIR);
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class NET_EXPORT_PRIVATE SpdySettingsIR : public SpdyFrameIR {
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Associates flags with a value.
7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  struct Value {
7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Value() : persist_value(false),
7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              persisted(false),
7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              value(0) {}
7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool persist_value;
7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool persisted;
7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int32 value;
7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef std::map<SpdySettingsIds, Value> ValueMap;
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpdySettingsIR();
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~SpdySettingsIR();
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overwrites as appropriate.
7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const ValueMap& values() const { return values_; }
7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AddSetting(SpdySettingsIds id,
7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  bool persist_value,
7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  bool persisted,
7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  int32 value) {
7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    values_[id].persist_value = persist_value;
7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    values_[id].persisted = persisted;
7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    values_[id].value = value;
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
758a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool clear_settings() const { return clear_settings_; }
7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_clear_settings(bool clear_settings) {
7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    clear_settings_ = clear_settings;
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
763a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool is_ack() const { return is_ack_; }
764a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void set_is_ack(bool is_ack) {
765a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    is_ack_ = is_ack;
766a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
768eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void Visit(SpdyFrameVisitor* visitor) const OVERRIDE;
769eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ValueMap values_;
7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool clear_settings_;
773a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool is_ack_;
7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SpdySettingsIR);
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class NET_EXPORT_PRIVATE SpdyPingIR : public SpdyFrameIR {
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
780a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  explicit SpdyPingIR(SpdyPingId id) : id_(id), is_ack_(false) {}
7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpdyPingId id() const { return id_; }
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
783a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // ACK logic is valid only for SPDY versions 4 and above.
784a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool is_ack() const { return is_ack_; }
785a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void set_is_ack(bool is_ack) { is_ack_ = is_ack; }
786a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
787eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void Visit(SpdyFrameVisitor* visitor) const OVERRIDE;
788eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpdyPingId id_;
791a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool is_ack_;
7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SpdyPingIR);
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class NET_EXPORT_PRIVATE SpdyGoAwayIR : public SpdyFrameIR {
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
7985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SpdyGoAwayIR(SpdyStreamId last_good_stream_id, SpdyGoAwayStatus status,
7995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)               const base::StringPiece& description);
8005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual ~SpdyGoAwayIR();
8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpdyStreamId last_good_stream_id() const { return last_good_stream_id_; }
8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_last_good_stream_id(SpdyStreamId last_good_stream_id) {
8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK_LE(0u, last_good_stream_id);
8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK_EQ(0u, last_good_stream_id & ~kStreamIdMask);
8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    last_good_stream_id_ = last_good_stream_id;
8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpdyGoAwayStatus status() const { return status_; }
8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_status(SpdyGoAwayStatus status) {
8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // TODO(hkhalil): Check valid ranges of status?
8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    status_ = status;
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const base::StringPiece& description() const;
8145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
815eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void Visit(SpdyFrameVisitor* visitor) const OVERRIDE;
816eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpdyStreamId last_good_stream_id_;
8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpdyGoAwayStatus status_;
8205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const base::StringPiece description_;
8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SpdyGoAwayIR);
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class NET_EXPORT_PRIVATE SpdyHeadersIR : public SpdyFrameWithNameValueBlockIR {
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit SpdyHeadersIR(SpdyStreamId stream_id)
828a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    : SpdyFrameWithNameValueBlockIR(stream_id),
829a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      end_headers_(true),
830a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      has_priority_(false),
831a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      priority_(0) {}
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
833eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void Visit(SpdyFrameVisitor* visitor) const OVERRIDE;
834eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
835a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool end_headers() const { return end_headers_; }
836a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void set_end_headers(bool end_headers) {end_headers_ = end_headers;}
837a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool has_priority() const { return has_priority_; }
838a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void set_has_priority(bool has_priority) { has_priority_ = has_priority; }
839a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  uint32 priority() const { return priority_; }
840a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void set_priority(SpdyPriority priority) { priority_ = priority; }
841a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
843a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool end_headers_;
844a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool has_priority_;
845a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // 31-bit priority.
846a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  uint32 priority_;
8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SpdyHeadersIR);
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class NET_EXPORT_PRIVATE SpdyWindowUpdateIR : public SpdyFrameWithStreamIdIR {
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpdyWindowUpdateIR(SpdyStreamId stream_id, int32 delta)
8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : SpdyFrameWithStreamIdIR(stream_id) {
8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    set_delta(delta);
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int32 delta() const { return delta_; }
8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_delta(int32 delta) {
8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK_LT(0, delta);
8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK_LE(delta, kSpdyMaximumWindowSize);
8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    delta_ = delta;
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
863eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void Visit(SpdyFrameVisitor* visitor) const OVERRIDE;
864eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int32 delta_;
8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SpdyWindowUpdateIR);
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
871eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass NET_EXPORT_PRIVATE SpdyBlockedIR
872eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    : public NON_EXPORTED_BASE(SpdyFrameWithStreamIdIR) {
8735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
8745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  explicit SpdyBlockedIR(SpdyStreamId stream_id)
8755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : SpdyFrameWithStreamIdIR(stream_id) {}
876868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
877eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void Visit(SpdyFrameVisitor* visitor) const OVERRIDE;
878eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
8795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
8805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SpdyBlockedIR);
881868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
882868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
8835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class NET_EXPORT_PRIVATE SpdyPushPromiseIR
8845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : public SpdyFrameWithNameValueBlockIR {
8857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch public:
8867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  SpdyPushPromiseIR(SpdyStreamId stream_id, SpdyStreamId promised_stream_id)
8877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      : SpdyFrameWithNameValueBlockIR(stream_id),
888a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        promised_stream_id_(promised_stream_id),
889a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        end_push_promise_(true) {}
8907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  SpdyStreamId promised_stream_id() const { return promised_stream_id_; }
8917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void set_promised_stream_id(SpdyStreamId id) { promised_stream_id_ = id; }
892a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool end_push_promise() const { return end_push_promise_; }
893a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void set_end_push_promise(bool end_push_promise) {
894a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    end_push_promise_ = end_push_promise;
895a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
8967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
8977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void Visit(SpdyFrameVisitor* visitor) const OVERRIDE;
8987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
8997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch private:
9007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  SpdyStreamId promised_stream_id_;
901a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool end_push_promise_;
9027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(SpdyPushPromiseIR);
9037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
9047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
90523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// TODO(jgraettinger): This representation needs review. SpdyContinuationIR
90623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// needs to frame a portion of a single, arbitrarily-broken encoded buffer.
907a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class NET_EXPORT_PRIVATE SpdyContinuationIR
908a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    : public SpdyFrameWithNameValueBlockIR {
909a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public:
910a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  explicit SpdyContinuationIR(SpdyStreamId stream_id)
911a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      : SpdyFrameWithNameValueBlockIR(stream_id),
912a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        end_headers_(false) {}
913a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
914a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void Visit(SpdyFrameVisitor* visitor) const OVERRIDE;
915a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
916a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool end_headers() const { return end_headers_; }
917a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void set_end_headers(bool end_headers) {end_headers_ = end_headers;}
918a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
919a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private:
920a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool end_headers_;
921a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SpdyContinuationIR);
922a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
9237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// -------------------------------------------------------------------------
9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Wrapper classes for various SPDY frames.
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// All Spdy Frame types derive from this SpdyFrame class.
9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SpdyFrame {
9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Create a SpdyFrame using a pre-created buffer.
9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If |owns_buffer| is true, this class takes ownership of the buffer
9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // and will delete it on cleanup.  The buffer must have been created using
9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // new char[].
9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If |owns_buffer| is false, the caller retains ownership of the buffer and
9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // is responsible for making sure the buffer outlives this frame.  In other
9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // words, this class does NOT create a copy of the buffer.
9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpdyFrame(char* data, size_t size, bool owns_buffer)
9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : frame_(data),
9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        size_(size),
9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        owns_buffer_(owns_buffer) {
9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(frame_);
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ~SpdyFrame() {
9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (owns_buffer_) {
9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      delete [] frame_;
9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
9482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    frame_ = NULL;
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Provides access to the frame bytes, which is a buffer containing
9522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the frame packed as expected for sending over the wire.
9532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  char* data() const { return frame_; }
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns the actual size of the underlying buffer.
9562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t size() const { return size_; }
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  char* frame_;
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
9622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t size_;
9632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool owns_buffer_;
9642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SpdyFrame);
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
967eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// This interface is for classes that want to process SpdyFrameIRs without
968eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// having to know what type they are.  An instance of this interface can be
969eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// passed to a SpdyFrameIR's Visit method, and the appropriate type-specific
970eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// method of this class will be called.
971eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass SpdyFrameVisitor {
972eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public:
973eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void VisitSynStream(const SpdySynStreamIR& syn_stream) = 0;
974eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void VisitSynReply(const SpdySynReplyIR& syn_reply) = 0;
975eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void VisitRstStream(const SpdyRstStreamIR& rst_stream) = 0;
976eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void VisitSettings(const SpdySettingsIR& settings) = 0;
977eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void VisitPing(const SpdyPingIR& ping) = 0;
978eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void VisitGoAway(const SpdyGoAwayIR& goaway) = 0;
979eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void VisitHeaders(const SpdyHeadersIR& headers) = 0;
980eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void VisitWindowUpdate(const SpdyWindowUpdateIR& window_update) = 0;
981eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void VisitBlocked(const SpdyBlockedIR& blocked) = 0;
9827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void VisitPushPromise(const SpdyPushPromiseIR& push_promise) = 0;
983a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void VisitContinuation(const SpdyContinuationIR& continuation) = 0;
984eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void VisitData(const SpdyDataIR& data) = 0;
985eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
986eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch protected:
987eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SpdyFrameVisitor() {}
988eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual ~SpdyFrameVisitor() {}
989eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
990eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private:
991eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DISALLOW_COPY_AND_ASSIGN(SpdyFrameVisitor);
992eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch};
993eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // NET_SPDY_SPDY_PROTOCOL_H_
997