spdy_protocol.h revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
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
3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// which indicate application-layer incompatibility. It is guaranteed
3290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// that the enum value SPDYn maps 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,
3890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SPDY_MAX_VERSION = SPDY4
3990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A SPDY stream id is a 31 bit entity.
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef uint32 SpdyStreamId;
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Specifies the stream ID used to denote the current session (for
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// flow control).
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const SpdyStreamId kSessionFlowControlStreamId = 0;
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Initial window size for a Spdy stream.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int32 kSpdyStreamInitialWindowSize = 64 * 1024;  // 64 KBytes
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Initial window size for a Spdy session.
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int32 kSpdySessionInitialWindowSize = 64 * 1024;  // 64 KBytes
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Maximum window size for a Spdy stream or session.
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int32 kSpdyMaximumWindowSize = 0x7FFFFFFF;  // Max signed 32bit int
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SPDY 2 dictionary.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is just a hacked dictionary to use for shrinking HTTP-like headers.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kV2Dictionary[] =
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "optionsgetheadpostputdeletetraceacceptaccept-charsetaccept-encodingaccept-"
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "languageauthorizationexpectfromhostif-modified-sinceif-matchif-none-matchi"
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "f-rangeif-unmodifiedsincemax-forwardsproxy-authorizationrangerefererteuser"
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "-agent10010120020120220320420520630030130230330430530630740040140240340440"
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "5406407408409410411412413414415416417500501502503504505accept-rangesageeta"
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "glocationproxy-authenticatepublicretry-afterservervarywarningwww-authentic"
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "ateallowcontent-basecontent-encodingcache-controlconnectiondatetrailertran"
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "sfer-encodingupgradeviawarningcontent-languagecontent-lengthcontent-locati"
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "oncontent-md5content-rangecontent-typeetagexpireslast-modifiedset-cookieMo"
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "ndayTuesdayWednesdayThursdayFridaySaturdaySundayJanFebMarAprMayJunJulAugSe"
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "pOctNovDecchunkedtext/htmlimage/pngimage/jpgimage/gifapplication/xmlapplic"
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "ation/xhtmltext/plainpublicmax-agecharset=iso-8859-1utf-8gzipdeflateHTTP/1"
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ".1statusversionurl";
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kV2DictionarySize = arraysize(kV2Dictionary);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SPDY 3 dictionary.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kV3Dictionary[] = {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x00, 0x00, 0x07, 0x6f, 0x70, 0x74, 0x69,  // ....opti
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x6f, 0x6e, 0x73, 0x00, 0x00, 0x00, 0x04, 0x68,  // ons....h
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x65, 0x61, 0x64, 0x00, 0x00, 0x00, 0x04, 0x70,  // ead....p
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x6f, 0x73, 0x74, 0x00, 0x00, 0x00, 0x03, 0x70,  // ost....p
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x75, 0x74, 0x00, 0x00, 0x00, 0x06, 0x64, 0x65,  // ut....de
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x6c, 0x65, 0x74, 0x65, 0x00, 0x00, 0x00, 0x05,  // lete....
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x74, 0x72, 0x61, 0x63, 0x65, 0x00, 0x00, 0x00,  // trace...
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x06, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x00,  // .accept.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x00, 0x0e, 0x61, 0x63, 0x63, 0x65, 0x70,  // ...accep
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x74, 0x2d, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65,  // t-charse
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x74, 0x00, 0x00, 0x00, 0x0f, 0x61, 0x63, 0x63,  // t....acc
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x65, 0x70, 0x74, 0x2d, 0x65, 0x6e, 0x63, 0x6f,  // ept-enco
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x64, 0x69, 0x6e, 0x67, 0x00, 0x00, 0x00, 0x0f,  // ding....
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x2d, 0x6c,  // accept-l
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x00,  // anguage.
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x00, 0x0d, 0x61, 0x63, 0x63, 0x65, 0x70,  // ...accep
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x74, 0x2d, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x73,  // t-ranges
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x00, 0x00, 0x03, 0x61, 0x67, 0x65, 0x00,  // ....age.
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x00, 0x05, 0x61, 0x6c, 0x6c, 0x6f, 0x77,  // ...allow
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x00, 0x00, 0x0d, 0x61, 0x75, 0x74, 0x68,  // ....auth
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f,  // orizatio
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x6e, 0x00, 0x00, 0x00, 0x0d, 0x63, 0x61, 0x63,  // n....cac
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x68, 0x65, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72,  // he-contr
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x6f, 0x6c, 0x00, 0x00, 0x00, 0x0a, 0x63, 0x6f,  // ol....co
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e,  // nnection
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x00, 0x00, 0x0c, 0x63, 0x6f, 0x6e, 0x74,  // ....cont
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x65, 0x6e, 0x74, 0x2d, 0x62, 0x61, 0x73, 0x65,  // ent-base
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x00, 0x00, 0x10, 0x63, 0x6f, 0x6e, 0x74,  // ....cont
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x65, 0x6e, 0x74, 0x2d, 0x65, 0x6e, 0x63, 0x6f,  // ent-enco
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x64, 0x69, 0x6e, 0x67, 0x00, 0x00, 0x00, 0x10,  // ding....
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d,  // content-
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65,  // language
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x00, 0x00, 0x0e, 0x63, 0x6f, 0x6e, 0x74,  // ....cont
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x65, 0x6e, 0x74, 0x2d, 0x6c, 0x65, 0x6e, 0x67,  // ent-leng
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x74, 0x68, 0x00, 0x00, 0x00, 0x10, 0x63, 0x6f,  // th....co
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x6c, 0x6f,  // ntent-lo
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00,  // cation..
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,  // ..conten
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x74, 0x2d, 0x6d, 0x64, 0x35, 0x00, 0x00, 0x00,  // t-md5...
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,  // .content
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x2d, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x00, 0x00,  // -range..
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,  // ..conten
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x00, 0x00,  // t-type..
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x04, 0x64, 0x61, 0x74, 0x65, 0x00, 0x00,  // ..date..
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x04, 0x65, 0x74, 0x61, 0x67, 0x00, 0x00,  // ..etag..
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x06, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74,  // ..expect
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x00, 0x00, 0x07, 0x65, 0x78, 0x70, 0x69,  // ....expi
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x72, 0x65, 0x73, 0x00, 0x00, 0x00, 0x04, 0x66,  // res....f
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x72, 0x6f, 0x6d, 0x00, 0x00, 0x00, 0x04, 0x68,  // rom....h
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x6f, 0x73, 0x74, 0x00, 0x00, 0x00, 0x08, 0x69,  // ost....i
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x66, 0x2d, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x00,  // f-match.
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x00, 0x11, 0x69, 0x66, 0x2d, 0x6d, 0x6f,  // ...if-mo
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x2d, 0x73,  // dified-s
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x69, 0x6e, 0x63, 0x65, 0x00, 0x00, 0x00, 0x0d,  // ince....
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x69, 0x66, 0x2d, 0x6e, 0x6f, 0x6e, 0x65, 0x2d,  // if-none-
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x6d, 0x61, 0x74, 0x63, 0x68, 0x00, 0x00, 0x00,  // match...
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x08, 0x69, 0x66, 0x2d, 0x72, 0x61, 0x6e, 0x67,  // .if-rang
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x65, 0x00, 0x00, 0x00, 0x13, 0x69, 0x66, 0x2d,  // e....if-
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x75, 0x6e, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69,  // unmodifi
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x65, 0x64, 0x2d, 0x73, 0x69, 0x6e, 0x63, 0x65,  // ed-since
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x00, 0x00, 0x0d, 0x6c, 0x61, 0x73, 0x74,  // ....last
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x2d, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65,  // -modifie
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x64, 0x00, 0x00, 0x00, 0x08, 0x6c, 0x6f, 0x63,  // d....loc
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x61, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x00,  // ation...
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x0c, 0x6d, 0x61, 0x78, 0x2d, 0x66, 0x6f, 0x72,  // .max-for
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x77, 0x61, 0x72, 0x64, 0x73, 0x00, 0x00, 0x00,  // wards...
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x06, 0x70, 0x72, 0x61, 0x67, 0x6d, 0x61, 0x00,  // .pragma.
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x00, 0x12, 0x70, 0x72, 0x6f, 0x78, 0x79,  // ...proxy
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x2d, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74,  // -authent
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x69, 0x63, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00,  // icate...
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x13, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2d, 0x61,  // .proxy-a
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61,  // uthoriza
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x00, 0x05,  // tion....
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x72, 0x61, 0x6e, 0x67, 0x65, 0x00, 0x00, 0x00,  // range...
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x07, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x72,  // .referer
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x00, 0x00, 0x0b, 0x72, 0x65, 0x74, 0x72,  // ....retr
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x79, 0x2d, 0x61, 0x66, 0x74, 0x65, 0x72, 0x00,  // y-after.
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x00, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65,  // ...serve
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x72, 0x00, 0x00, 0x00, 0x02, 0x74, 0x65, 0x00,  // r....te.
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x00, 0x07, 0x74, 0x72, 0x61, 0x69, 0x6c,  // ...trail
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x65, 0x72, 0x00, 0x00, 0x00, 0x11, 0x74, 0x72,  // er....tr
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x2d, 0x65,  // ansfer-e
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x00,  // ncoding.
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x00, 0x07, 0x75, 0x70, 0x67, 0x72, 0x61,  // ...upgra
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x64, 0x65, 0x00, 0x00, 0x00, 0x0a, 0x75, 0x73,  // de....us
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x65, 0x72, 0x2d, 0x61, 0x67, 0x65, 0x6e, 0x74,  // er-agent
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x00, 0x00, 0x04, 0x76, 0x61, 0x72, 0x79,  // ....vary
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x00, 0x00, 0x03, 0x76, 0x69, 0x61, 0x00,  // ....via.
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x00, 0x07, 0x77, 0x61, 0x72, 0x6e, 0x69,  // ...warni
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x6e, 0x67, 0x00, 0x00, 0x00, 0x10, 0x77, 0x77,  // ng....ww
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x77, 0x2d, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e,  // w-authen
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x00, 0x00,  // ticate..
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64,  // ..method
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x00, 0x00, 0x03, 0x67, 0x65, 0x74, 0x00,  // ....get.
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x00, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75,  // ...statu
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x73, 0x00, 0x00, 0x00, 0x06, 0x32, 0x30, 0x30,  // s....200
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x20, 0x4f, 0x4b, 0x00, 0x00, 0x00, 0x07, 0x76,  // .OK....v
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x00, 0x00,  // ersion..
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x08, 0x48, 0x54, 0x54, 0x50, 0x2f, 0x31,  // ..HTTP.1
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x2e, 0x31, 0x00, 0x00, 0x00, 0x03, 0x75, 0x72,  // .1....ur
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x6c, 0x00, 0x00, 0x00, 0x06, 0x70, 0x75, 0x62,  // l....pub
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x6c, 0x69, 0x63, 0x00, 0x00, 0x00, 0x0a, 0x73,  // lic....s
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x65, 0x74, 0x2d, 0x63, 0x6f, 0x6f, 0x6b, 0x69,  // et-cooki
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x65, 0x00, 0x00, 0x00, 0x0a, 0x6b, 0x65, 0x65,  // e....kee
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x70, 0x2d, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x00,  // p-alive.
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x00, 0x06, 0x6f, 0x72, 0x69, 0x67, 0x69,  // ...origi
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x6e, 0x31, 0x30, 0x30, 0x31, 0x30, 0x31, 0x32,  // n1001012
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x30, 0x31, 0x32, 0x30, 0x32, 0x32, 0x30, 0x35,  // 01202205
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x32, 0x30, 0x36, 0x33, 0x30, 0x30, 0x33, 0x30,  // 20630030
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x32, 0x33, 0x30, 0x33, 0x33, 0x30, 0x34, 0x33,  // 23033043
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x30, 0x35, 0x33, 0x30, 0x36, 0x33, 0x30, 0x37,  // 05306307
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x34, 0x30, 0x32, 0x34, 0x30, 0x35, 0x34, 0x30,  // 40240540
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x36, 0x34, 0x30, 0x37, 0x34, 0x30, 0x38, 0x34,  // 64074084
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x30, 0x39, 0x34, 0x31, 0x30, 0x34, 0x31, 0x31,  // 09410411
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x34, 0x31, 0x32, 0x34, 0x31, 0x33, 0x34, 0x31,  // 41241341
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x34, 0x34, 0x31, 0x35, 0x34, 0x31, 0x36, 0x34,  // 44154164
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x31, 0x37, 0x35, 0x30, 0x32, 0x35, 0x30, 0x34,  // 17502504
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x35, 0x30, 0x35, 0x32, 0x30, 0x33, 0x20, 0x4e,  // 505203.N
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x6f, 0x6e, 0x2d, 0x41, 0x75, 0x74, 0x68, 0x6f,  // on-Autho
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x72, 0x69, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65,  // ritative
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x20, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61,  // .Informa
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x74, 0x69, 0x6f, 0x6e, 0x32, 0x30, 0x34, 0x20,  // tion204.
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x4e, 0x6f, 0x20, 0x43, 0x6f, 0x6e, 0x74, 0x65,  // No.Conte
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x6e, 0x74, 0x33, 0x30, 0x31, 0x20, 0x4d, 0x6f,  // nt301.Mo
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x76, 0x65, 0x64, 0x20, 0x50, 0x65, 0x72, 0x6d,  // ved.Perm
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x61, 0x6e, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x34,  // anently4
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x30, 0x30, 0x20, 0x42, 0x61, 0x64, 0x20, 0x52,  // 00.Bad.R
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x34, 0x30,  // equest40
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x31, 0x20, 0x55, 0x6e, 0x61, 0x75, 0x74, 0x68,  // 1.Unauth
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x34, 0x30,  // orized40
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x33, 0x20, 0x46, 0x6f, 0x72, 0x62, 0x69, 0x64,  // 3.Forbid
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x64, 0x65, 0x6e, 0x34, 0x30, 0x34, 0x20, 0x4e,  // den404.N
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x6f, 0x74, 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64,  // ot.Found
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x35, 0x30, 0x30, 0x20, 0x49, 0x6e, 0x74, 0x65,  // 500.Inte
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x72, 0x6e, 0x61, 0x6c, 0x20, 0x53, 0x65, 0x72,  // rnal.Ser
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x76, 0x65, 0x72, 0x20, 0x45, 0x72, 0x72, 0x6f,  // ver.Erro
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x72, 0x35, 0x30, 0x31, 0x20, 0x4e, 0x6f, 0x74,  // r501.Not
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x20, 0x49, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65,  // .Impleme
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x6e, 0x74, 0x65, 0x64, 0x35, 0x30, 0x33, 0x20,  // nted503.
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x20,  // Service.
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x55, 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61,  // Unavaila
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x62, 0x6c, 0x65, 0x4a, 0x61, 0x6e, 0x20, 0x46,  // bleJan.F
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x65, 0x62, 0x20, 0x4d, 0x61, 0x72, 0x20, 0x41,  // eb.Mar.A
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x70, 0x72, 0x20, 0x4d, 0x61, 0x79, 0x20, 0x4a,  // pr.May.J
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x75, 0x6e, 0x20, 0x4a, 0x75, 0x6c, 0x20, 0x41,  // un.Jul.A
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x75, 0x67, 0x20, 0x53, 0x65, 0x70, 0x74, 0x20,  // ug.Sept.
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x4f, 0x63, 0x74, 0x20, 0x4e, 0x6f, 0x76, 0x20,  // Oct.Nov.
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x44, 0x65, 0x63, 0x20, 0x30, 0x30, 0x3a, 0x30,  // Dec.00.0
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x30, 0x3a, 0x30, 0x30, 0x20, 0x4d, 0x6f, 0x6e,  // 0.00.Mon
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x2c, 0x20, 0x54, 0x75, 0x65, 0x2c, 0x20, 0x57,  // ..Tue..W
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x65, 0x64, 0x2c, 0x20, 0x54, 0x68, 0x75, 0x2c,  // ed..Thu.
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x20, 0x46, 0x72, 0x69, 0x2c, 0x20, 0x53, 0x61,  // .Fri..Sa
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x74, 0x2c, 0x20, 0x53, 0x75, 0x6e, 0x2c, 0x20,  // t..Sun..
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x47, 0x4d, 0x54, 0x63, 0x68, 0x75, 0x6e, 0x6b,  // GMTchunk
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x65, 0x64, 0x2c, 0x74, 0x65, 0x78, 0x74, 0x2f,  // ed.text.
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x68, 0x74, 0x6d, 0x6c, 0x2c, 0x69, 0x6d, 0x61,  // html.ima
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x67, 0x65, 0x2f, 0x70, 0x6e, 0x67, 0x2c, 0x69,  // ge.png.i
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x6d, 0x61, 0x67, 0x65, 0x2f, 0x6a, 0x70, 0x67,  // mage.jpg
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x2c, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x67,  // .image.g
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x69, 0x66, 0x2c, 0x61, 0x70, 0x70, 0x6c, 0x69,  // if.appli
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x78,  // cation.x
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x6d, 0x6c, 0x2c, 0x61, 0x70, 0x70, 0x6c, 0x69,  // ml.appli
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x78,  // cation.x
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x68, 0x74, 0x6d, 0x6c, 0x2b, 0x78, 0x6d, 0x6c,  // html.xml
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x2c, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x70, 0x6c,  // .text.pl
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x61, 0x69, 0x6e, 0x2c, 0x74, 0x65, 0x78, 0x74,  // ain.text
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x2f, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72,  // .javascr
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x69, 0x70, 0x74, 0x2c, 0x70, 0x75, 0x62, 0x6c,  // ipt.publ
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x69, 0x63, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74,  // icprivat
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x65, 0x6d, 0x61, 0x78, 0x2d, 0x61, 0x67, 0x65,  // emax-age
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x3d, 0x67, 0x7a, 0x69, 0x70, 0x2c, 0x64, 0x65,  // .gzip.de
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x66, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x73, 0x64,  // flate.sd
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x63, 0x68, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65,  // chcharse
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x74, 0x3d, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x63,  // t.utf-8c
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, 0x69,  // harset.i
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x73, 0x6f, 0x2d, 0x38, 0x38, 0x35, 0x39, 0x2d,  // so-8859-
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x31, 0x2c, 0x75, 0x74, 0x66, 0x2d, 0x2c, 0x2a,  // 1.utf-..
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x2c, 0x65, 0x6e, 0x71, 0x3d, 0x30, 0x2e         // .enq.0.
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kV3DictionarySize = arraysize(kV3Dictionary);
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Types of SPDY frames.
259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)enum SpdyFrameType {
260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DATA = 0,
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SYN_STREAM = 1,
262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FIRST_CONTROL_TYPE = SYN_STREAM,
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SYN_REPLY,
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RST_STREAM,
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SETTINGS,
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOOP,  // Because it is valid in SPDY/2, kept for identifiability/enum order.
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PING,
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GOAWAY,
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HEADERS,
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WINDOW_UPDATE,
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CREDENTIAL,
272868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  BLOCKED,
273868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  LAST_CONTROL_TYPE = BLOCKED
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flags on data packets.
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum SpdyDataFlags {
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DATA_FLAG_NONE = 0,
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DATA_FLAG_FIN = 1,
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flags on control packets
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum SpdyControlFlags {
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CONTROL_FLAG_NONE = 0,
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CONTROL_FLAG_FIN = 1,
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CONTROL_FLAG_UNIDIRECTIONAL = 2
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flags on the SETTINGS control frame.
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum SpdySettingsControlFlags {
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SETTINGS_FLAG_CLEAR_PREVIOUSLY_PERSISTED_SETTINGS = 0x1
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flags for settings within a SETTINGS frame.
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum SpdySettingsFlags {
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SETTINGS_FLAG_NONE = 0x0,
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SETTINGS_FLAG_PLEASE_PERSIST = 0x1,
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SETTINGS_FLAG_PERSISTED = 0x2
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// List of known settings.
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum SpdySettingsIds {
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SETTINGS_UPLOAD_BANDWIDTH = 0x1,
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SETTINGS_DOWNLOAD_BANDWIDTH = 0x2,
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Network round trip time in milliseconds.
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SETTINGS_ROUND_TRIP_TIME = 0x3,
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SETTINGS_MAX_CONCURRENT_STREAMS = 0x4,
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TCP congestion window in packets.
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SETTINGS_CURRENT_CWND = 0x5,
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Downstream byte retransmission rate in percentage.
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SETTINGS_DOWNLOAD_RETRANS_RATE = 0x6,
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initial window size in bytes
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SETTINGS_INITIAL_WINDOW_SIZE = 0x7
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Status codes for RST_STREAM frames.
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)enum SpdyRstStreamStatus {
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RST_STREAM_INVALID = 0,
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RST_STREAM_PROTOCOL_ERROR = 1,
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RST_STREAM_INVALID_STREAM = 2,
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RST_STREAM_REFUSED_STREAM = 3,
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RST_STREAM_UNSUPPORTED_VERSION = 4,
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RST_STREAM_CANCEL = 5,
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RST_STREAM_INTERNAL_ERROR = 6,
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RST_STREAM_FLOW_CONTROL_ERROR = 7,
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RST_STREAM_STREAM_IN_USE = 8,
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RST_STREAM_STREAM_ALREADY_CLOSED = 9,
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RST_STREAM_INVALID_CREDENTIALS = 10,
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RST_STREAM_FRAME_TOO_LARGE = 11,
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RST_STREAM_NUM_STATUS_CODES = 12
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Status codes for GOAWAY frames.
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum SpdyGoAwayStatus {
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GOAWAY_INVALID = -1,
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GOAWAY_OK = 0,
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GOAWAY_PROTOCOL_ERROR = 1,
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GOAWAY_INTERNAL_ERROR = 2,
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GOAWAY_NUM_STATUS_CODES = 3
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A SPDY priority is a number between 0 and 7 (inclusive).
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SPDY priority range is version-dependant. For SPDY 2 and below, priority is a
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// number between 0 and 3.
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef uint8 SpdyPriority;
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef uint8 SpdyCredentialSlot;
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef std::map<std::string, std::string> SpdyNameValueBlock;
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef uint32 SpdyPingId;
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SpdyFrame;
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef SpdyFrame SpdySerializedFrame;
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
356eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass SpdyFrameVisitor;
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Intermediate representation for SPDY frames.
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(hkhalil): Rename this class to SpdyFrame when the existing SpdyFrame is
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// gone.
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SpdyFrameIR {
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~SpdyFrameIR() {}
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void Visit(SpdyFrameVisitor* visitor) const = 0;
366eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpdyFrameIR() {}
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SpdyFrameIR);
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Abstract class intended to be inherited by IRs that have a stream associated
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// to them.
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SpdyFrameWithStreamIdIR : public SpdyFrameIR {
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~SpdyFrameWithStreamIdIR() {}
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpdyStreamId stream_id() const { return stream_id_; }
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_stream_id(SpdyStreamId stream_id) {
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK_EQ(0u, stream_id & ~kStreamIdMask);
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    stream_id_ = stream_id;
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit SpdyFrameWithStreamIdIR(SpdyStreamId stream_id) {
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    set_stream_id(stream_id);
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpdyStreamId stream_id_;
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SpdyFrameWithStreamIdIR);
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Abstract class intended to be inherited by IRs that have the option of a FIN
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// flag. Implies SpdyFrameWithStreamIdIR.
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SpdyFrameWithFinIR : public SpdyFrameWithStreamIdIR {
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~SpdyFrameWithFinIR() {}
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool fin() const { return fin_; }
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_fin(bool fin) { fin_ = fin; }
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit SpdyFrameWithFinIR(SpdyStreamId stream_id)
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : SpdyFrameWithStreamIdIR(stream_id),
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        fin_(false) {}
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool fin_;
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SpdyFrameWithFinIR);
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Abstract class intended to be inherited by IRs that contain a name-value
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// block. Implies SpdyFrameWithFinIR.
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class NET_EXPORT_PRIVATE SpdyFrameWithNameValueBlockIR
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public NON_EXPORTED_BASE(SpdyFrameWithFinIR) {
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const SpdyNameValueBlock& name_value_block() const {
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return name_value_block_;
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpdyNameValueBlock* GetMutableNameValueBlock() { return &name_value_block_; }
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetHeader(const base::StringPiece& name,
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 const base::StringPiece& value) {
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    name_value_block_[name.as_string()] = value.as_string();
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit SpdyFrameWithNameValueBlockIR(SpdyStreamId stream_id);
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~SpdyFrameWithNameValueBlockIR();
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpdyNameValueBlock name_value_block_;
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SpdyFrameWithNameValueBlockIR);
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class NET_EXPORT_PRIVATE SpdyDataIR
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public NON_EXPORTED_BASE(SpdyFrameWithFinIR) {
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Performs deep copy on data.
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpdyDataIR(SpdyStreamId stream_id, const base::StringPiece& data);
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Use in conjunction with SetDataShallow() for shallow-copy on data.
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit SpdyDataIR(SpdyStreamId stream_id);
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~SpdyDataIR();
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::StringPiece data() const { return data_; }
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Deep-copy of data (keep private copy).
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetDataDeep(const base::StringPiece& data) {
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    data_store_.reset(new std::string(data.data(), data.length()));
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    data_ = *(data_store_.get());
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Shallow-copy of data (do not keep private copy).
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetDataShallow(const base::StringPiece& data) {
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    data_store_.reset();
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    data_ = data;
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
464eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void Visit(SpdyFrameVisitor* visitor) const OVERRIDE;
465eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Used to store data that this SpdyDataIR should own.
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<std::string> data_store_;
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::StringPiece data_;
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SpdyDataIR);
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
474eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass NET_EXPORT_PRIVATE SpdySynStreamIR
475eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    : public SpdyFrameWithNameValueBlockIR {
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit SpdySynStreamIR(SpdyStreamId stream_id)
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : SpdyFrameWithNameValueBlockIR(stream_id),
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        associated_to_stream_id_(0),
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        priority_(0),
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        slot_(0),
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        unidirectional_(false) {}
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpdyStreamId associated_to_stream_id() const {
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return associated_to_stream_id_;
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_associated_to_stream_id(SpdyStreamId stream_id) {
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    associated_to_stream_id_ = stream_id;
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpdyPriority priority() const { return priority_; }
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_priority(SpdyPriority priority) { priority_ = priority; }
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpdyCredentialSlot slot() const { return slot_; }
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_slot(SpdyCredentialSlot slot) { slot_ = slot; }
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool unidirectional() const { return unidirectional_; }
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_unidirectional(bool unidirectional) {
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    unidirectional_ = unidirectional;
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
498eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void Visit(SpdyFrameVisitor* visitor) const OVERRIDE;
499eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpdyStreamId associated_to_stream_id_;
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpdyPriority priority_;
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpdyCredentialSlot slot_;
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool unidirectional_;
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SpdySynStreamIR);
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SpdySynReplyIR : public SpdyFrameWithNameValueBlockIR {
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit SpdySynReplyIR(SpdyStreamId stream_id)
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : SpdyFrameWithNameValueBlockIR(stream_id) {}
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
514eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void Visit(SpdyFrameVisitor* visitor) const OVERRIDE;
515eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SpdySynReplyIR);
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SpdyRstStreamIR : public SpdyFrameWithStreamIdIR {
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpdyRstStreamIR(SpdyStreamId stream_id, SpdyRstStreamStatus status)
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : SpdyFrameWithStreamIdIR(stream_id) {
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    set_status(status);
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpdyRstStreamStatus status() const {
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return status_;
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_status(SpdyRstStreamStatus status) {
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK_NE(status, RST_STREAM_INVALID);
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK_LT(status, RST_STREAM_NUM_STATUS_CODES);
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    status_ = status;
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void Visit(SpdyFrameVisitor* visitor) const OVERRIDE;
536eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpdyRstStreamStatus status_;
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SpdyRstStreamIR);
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SpdySettingsIR : public SpdyFrameIR {
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Associates flags with a value.
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  struct Value {
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Value() : persist_value(false),
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              persisted(false),
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              value(0) {}
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool persist_value;
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool persisted;
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int32 value;
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef std::map<SpdySettingsIds, Value> ValueMap;
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpdySettingsIR();
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~SpdySettingsIR();
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overwrites as appropriate.
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const ValueMap& values() const { return values_; }
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AddSetting(SpdySettingsIds id,
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  bool persist_value,
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  bool persisted,
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  int32 value) {
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // TODO(hkhalil): DCHECK_LE(SETTINGS_UPLOAD_BANDWIDTH, id);
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // TODO(hkhalil): DCHECK_GE(SETTINGS_INITIAL_WINDOW_SIZE, id);
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    values_[id].persist_value = persist_value;
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    values_[id].persisted = persisted;
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    values_[id].value = value;
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool clear_settings() const { return clear_settings_; }
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_clear_settings(bool clear_settings) {
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    clear_settings_ = clear_settings;
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
577eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void Visit(SpdyFrameVisitor* visitor) const OVERRIDE;
578eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ValueMap values_;
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool clear_settings_;
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SpdySettingsIR);
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SpdyPingIR : public SpdyFrameIR {
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit SpdyPingIR(SpdyPingId id) : id_(id) {}
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpdyPingId id() const { return id_; }
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
591eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void Visit(SpdyFrameVisitor* visitor) const OVERRIDE;
592eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpdyPingId id_;
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SpdyPingIR);
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SpdyGoAwayIR : public SpdyFrameIR {
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpdyGoAwayIR(SpdyStreamId last_good_stream_id, SpdyGoAwayStatus status) {
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    set_last_good_stream_id(last_good_stream_id);
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    set_status(status);
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpdyStreamId last_good_stream_id() const { return last_good_stream_id_; }
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_last_good_stream_id(SpdyStreamId last_good_stream_id) {
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK_LE(0u, last_good_stream_id);
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK_EQ(0u, last_good_stream_id & ~kStreamIdMask);
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    last_good_stream_id_ = last_good_stream_id;
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpdyGoAwayStatus status() const { return status_; }
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_status(SpdyGoAwayStatus status) {
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // TODO(hkhalil): Check valid ranges of status?
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    status_ = status;
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
617eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void Visit(SpdyFrameVisitor* visitor) const OVERRIDE;
618eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpdyStreamId last_good_stream_id_;
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpdyGoAwayStatus status_;
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SpdyGoAwayIR);
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SpdyHeadersIR : public SpdyFrameWithNameValueBlockIR {
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit SpdyHeadersIR(SpdyStreamId stream_id)
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : SpdyFrameWithNameValueBlockIR(stream_id) {}
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
631eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void Visit(SpdyFrameVisitor* visitor) const OVERRIDE;
632eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SpdyHeadersIR);
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SpdyWindowUpdateIR : public SpdyFrameWithStreamIdIR {
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpdyWindowUpdateIR(SpdyStreamId stream_id, int32 delta)
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : SpdyFrameWithStreamIdIR(stream_id) {
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    set_delta(delta);
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int32 delta() const { return delta_; }
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_delta(int32 delta) {
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK_LT(0, delta);
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK_LE(delta, kSpdyMaximumWindowSize);
6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    delta_ = delta;
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
650eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void Visit(SpdyFrameVisitor* visitor) const OVERRIDE;
651eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int32 delta_;
6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SpdyWindowUpdateIR);
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SpdyCredentialIR : public SpdyFrameIR {
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef std::vector<std::string> CertificateList;
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit SpdyCredentialIR(int16 slot);
6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~SpdyCredentialIR();
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int16 slot() const { return slot_; }
6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_slot(int16 slot) {
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // TODO(hkhalil): Verify valid slot range?
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    slot_ = slot;
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::StringPiece proof() const { return proof_; }
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_proof(const base::StringPiece& proof) {
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    proof.CopyToString(&proof_);
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const CertificateList* certificates() const { return &certificates_; }
6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AddCertificate(const base::StringPiece& certificate) {
6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    certificates_.push_back(certificate.as_string());
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
679eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void Visit(SpdyFrameVisitor* visitor) const OVERRIDE;
680eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int16 slot_;
6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string proof_;
6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CertificateList certificates_;
6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SpdyCredentialIR);
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
689eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass NET_EXPORT_PRIVATE SpdyBlockedIR
690eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    : public NON_EXPORTED_BASE(SpdyFrameWithStreamIdIR) {
691868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  public:
692868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)   explicit SpdyBlockedIR(SpdyStreamId stream_id)
693868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)       : SpdyFrameWithStreamIdIR(stream_id) {}
694868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
695eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void Visit(SpdyFrameVisitor* visitor) const OVERRIDE;
696eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
697868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  private:
698868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)   DISALLOW_COPY_AND_ASSIGN(SpdyBlockedIR);
699868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
700868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// -------------------------------------------------------------------------
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Wrapper classes for various SPDY frames.
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// All Spdy Frame types derive from this SpdyFrame class.
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SpdyFrame {
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Create a SpdyFrame using a pre-created buffer.
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If |owns_buffer| is true, this class takes ownership of the buffer
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // and will delete it on cleanup.  The buffer must have been created using
7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // new char[].
7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If |owns_buffer| is false, the caller retains ownership of the buffer and
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // is responsible for making sure the buffer outlives this frame.  In other
7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // words, this class does NOT create a copy of the buffer.
7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpdyFrame(char* data, size_t size, bool owns_buffer)
7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : frame_(data),
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        size_(size),
7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        owns_buffer_(owns_buffer) {
7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(frame_);
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ~SpdyFrame() {
7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (owns_buffer_) {
7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      delete [] frame_;
7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    frame_ = NULL;
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Provides access to the frame bytes, which is a buffer containing
7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the frame packed as expected for sending over the wire.
7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  char* data() const { return frame_; }
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns the actual size of the underlying buffer.
7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t size() const { return size_; }
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  char* frame_;
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t size_;
7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool owns_buffer_;
7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SpdyFrame);
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
744eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// This interface is for classes that want to process SpdyFrameIRs without
745eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// having to know what type they are.  An instance of this interface can be
746eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// passed to a SpdyFrameIR's Visit method, and the appropriate type-specific
747eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// method of this class will be called.
748eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass SpdyFrameVisitor {
749eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public:
750eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void VisitSynStream(const SpdySynStreamIR& syn_stream) = 0;
751eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void VisitSynReply(const SpdySynReplyIR& syn_reply) = 0;
752eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void VisitRstStream(const SpdyRstStreamIR& rst_stream) = 0;
753eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void VisitSettings(const SpdySettingsIR& settings) = 0;
754eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void VisitPing(const SpdyPingIR& ping) = 0;
755eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void VisitGoAway(const SpdyGoAwayIR& goaway) = 0;
756eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void VisitHeaders(const SpdyHeadersIR& headers) = 0;
757eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void VisitWindowUpdate(const SpdyWindowUpdateIR& window_update) = 0;
758eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void VisitCredential(const SpdyCredentialIR& credential) = 0;
759eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void VisitBlocked(const SpdyBlockedIR& blocked) = 0;
760eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void VisitData(const SpdyDataIR& data) = 0;
761eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
762eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch protected:
763eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SpdyFrameVisitor() {}
764eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual ~SpdyFrameVisitor() {}
765eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
766eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private:
767eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DISALLOW_COPY_AND_ASSIGN(SpdyFrameVisitor);
768eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch};
769eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // NET_SPDY_SPDY_PROTOCOL_H_
773