15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NET_SPDY_BUFFERED_SPDY_FRAMER_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NET_SPDY_BUFFERED_SPDY_FRAMER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/gtest_prod_util.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_export.h" 14558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "net/socket/next_proto.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/spdy/spdy_framer.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/spdy/spdy_header_block.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/spdy/spdy_protocol.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Returns the SPDY major version corresponding to the given NextProto 22558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// value, which must represent a SPDY-like protocol. 23558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochNET_EXPORT_PRIVATE SpdyMajorVersion NextProtoToSpdyMajorVersion( 24558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch NextProto next_proto); 25558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NET_EXPORT_PRIVATE BufferedSpdyFramerVisitorInterface { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BufferedSpdyFramerVisitorInterface() {} 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called if an error is detected in the SpdyFrame protocol. 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnError(SpdyFramer::SpdyError error_code) = 0; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called if an error is detected in a SPDY stream. 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnStreamError(SpdyStreamId stream_id, 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& description) = 0; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called after all the header data for SYN_STREAM control frame is received. 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnSynStream(SpdyStreamId stream_id, 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpdyStreamId associated_stream_id, 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpdyPriority priority, 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 credential_slot, 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool fin, 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool unidirectional, 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SpdyHeaderBlock& headers) = 0; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called after all the header data for SYN_REPLY control frame is received. 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnSynReply(SpdyStreamId stream_id, 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool fin, 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SpdyHeaderBlock& headers) = 0; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called after all the header data for HEADERS control frame is received. 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnHeaders(SpdyStreamId stream_id, 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool fin, 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SpdyHeaderBlock& headers) = 0; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when data is received. 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |stream_id| The stream receiving data. 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |data| A buffer containing the data received. 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |len| The length of the data buffer (at most 2^24 - 1 for SPDY/3, 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // but 2^16 - 1 - 8 for SPDY/4). 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When the other side has finished sending data on this stream, 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this method will be called with a zero-length buffer. 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnStreamFrameData(SpdyStreamId stream_id, 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* data, 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t len, 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool fin) = 0; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Called when a SETTINGS frame is received. 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // |clear_persisted| True if the respective flag is set on the SETTINGS frame. 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnSettings(bool clear_persisted) = 0; 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when an individual setting within a SETTINGS frame has been parsed 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and validated. 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnSetting(SpdySettingsIds id, uint8 flags, uint32 value) = 0; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when a PING frame has been parsed. 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnPing(uint32 unique_id) = 0; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when a RST_STREAM frame has been parsed. 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnRstStream(SpdyStreamId stream_id, 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SpdyRstStreamStatus status) = 0; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when a GOAWAY frame has been parsed. 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnGoAway(SpdyStreamId last_accepted_stream_id, 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpdyGoAwayStatus status) = 0; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when a WINDOW_UPDATE frame has been parsed. 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnWindowUpdate(SpdyStreamId stream_id, 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32 delta_window_size) = 0; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Called when a PUSH_PROMISE frame has been parsed. 927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void OnPushPromise(SpdyStreamId stream_id, 937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SpdyStreamId promised_stream_id) = 0; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~BufferedSpdyFramerVisitorInterface() {} 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(BufferedSpdyFramerVisitorInterface); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NET_EXPORT_PRIVATE BufferedSpdyFramer 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public SpdyFramerVisitorInterface { 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 10590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) BufferedSpdyFramer(SpdyMajorVersion version, 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool enable_compression); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~BufferedSpdyFramer(); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets callbacks to be called from the buffered spdy framer. A visitor must 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be set, or else the framer will likely crash. It is acceptable for the 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // visitor to do nothing. If this is called multiple times, only the last 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // visitor will be used. 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_visitor(BufferedSpdyFramerVisitorInterface* visitor); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Set debug callbacks to be called from the framer. The debug visitor is 1167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // completely optional and need not be set in order for normal operation. 1177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // If this is called multiple times, only the last visitor will be used. 1187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void set_debug_visitor(SpdyFramerDebugVisitorInterface* debug_visitor); 1197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SpdyFramerVisitorInterface 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnError(SpdyFramer* spdy_framer) OVERRIDE; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnSynStream(SpdyStreamId stream_id, 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpdyStreamId associated_stream_id, 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpdyPriority priority, 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 credential_slot, 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool fin, 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool unidirectional) OVERRIDE; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnSynReply(SpdyStreamId stream_id, bool fin) OVERRIDE; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnHeaders(SpdyStreamId stream_id, bool fin) OVERRIDE; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnCredentialFrameData(const char* frame_data, 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t len) OVERRIDE; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnControlFrameHeaderData(SpdyStreamId stream_id, 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* header_data, 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t len) OVERRIDE; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnStreamFrameData(SpdyStreamId stream_id, 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* data, 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t len, 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool fin) OVERRIDE; 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnSettings(bool clear_persisted) OVERRIDE; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnSetting( 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpdySettingsIds id, uint8 flags, uint32 value) OVERRIDE; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnPing(uint32 unique_id) OVERRIDE; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnRstStream(SpdyStreamId stream_id, 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SpdyRstStreamStatus status) OVERRIDE; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnGoAway(SpdyStreamId last_accepted_stream_id, 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpdyGoAwayStatus status) OVERRIDE; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnWindowUpdate(SpdyStreamId stream_id, 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32 delta_window_size) OVERRIDE; 1497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void OnPushPromise(SpdyStreamId stream_id, 1507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SpdyStreamId promised_stream_id) OVERRIDE; 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnDataFrameHeader(SpdyStreamId stream_id, 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t length, 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool fin) OVERRIDE; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SpdyFramer methods. 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t ProcessInput(const char* data, size_t len); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int protocol_version(); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Reset(); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpdyFramer::SpdyError error_code() const; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpdyFramer::SpdyState state() const; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool MessageFullyRead(); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool HasError(); 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SpdyFrame* CreateSynStream(SpdyStreamId stream_id, 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SpdyStreamId associated_stream_id, 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SpdyPriority priority, 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint8 credential_slot, 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SpdyControlFlags flags, 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool compressed, 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const SpdyHeaderBlock* headers); 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SpdyFrame* CreateSynReply(SpdyStreamId stream_id, 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SpdyControlFlags flags, 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool compressed, 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const SpdyHeaderBlock* headers); 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SpdyFrame* CreateRstStream(SpdyStreamId stream_id, 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SpdyRstStreamStatus status) const; 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SpdyFrame* CreateSettings(const SettingsMap& values) const; 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SpdyFrame* CreatePingFrame(uint32 unique_id) const; 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SpdyFrame* CreateGoAway( 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpdyStreamId last_accepted_stream_id, 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpdyGoAwayStatus status) const; 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SpdyFrame* CreateHeaders(SpdyStreamId stream_id, 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SpdyControlFlags flags, 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool compressed, 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const SpdyHeaderBlock* headers); 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SpdyFrame* CreateWindowUpdate( 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpdyStreamId stream_id, 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 delta_window_size) const; 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SpdyFrame* CreateCredentialFrame( 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SpdyCredential& credential) const; 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SpdyFrame* CreateDataFrame(SpdyStreamId stream_id, 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* data, 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32 len, 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SpdyDataFlags flags); 194eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 195eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Serialize a frame of unknown type. 196eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SpdySerializedFrame* SerializeFrame(const SpdyFrameIR& frame) { 197eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return spdy_framer_.SerializeFrame(frame); 198eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 199eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpdyPriority GetHighestPriority() const; 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t GetDataFrameMinimumSize() const { 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return spdy_framer_.GetDataFrameMinimumSize(); 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t GetControlFrameHeaderSize() const { 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return spdy_framer_.GetControlFrameHeaderSize(); 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch size_t GetSynStreamMinimumSize() const { 2117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return spdy_framer_.GetSynStreamMinimumSize(); 2127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 2137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t GetFrameMinimumSize() const { 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return spdy_framer_.GetFrameMinimumSize(); 216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t GetFrameMaximumSize() const { 219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return spdy_framer_.GetFrameMaximumSize(); 220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t GetDataFrameMaximumPayload() const { 223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return spdy_framer_.GetDataFrameMaximumPayload(); 224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int frames_received() const { return frames_received_; } 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The size of the header_buffer_. 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum { kHeaderBufferSize = 32 * 1024 }; 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void InitHeaderStreaming(SpdyStreamId stream_id); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpdyFramer spdy_framer_; 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BufferedSpdyFramerVisitorInterface* visitor_; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Header block streaming state: 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char header_buffer_[kHeaderBufferSize]; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t header_buffer_used_; 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool header_buffer_valid_; 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpdyStreamId header_stream_id_; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int frames_received_; 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Collection of fields from control frames that we need to 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // buffer up from the spdy framer. 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct ControlFrameFields { 247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpdyFrameType type; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpdyStreamId stream_id; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpdyStreamId associated_stream_id; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpdyPriority priority; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 credential_slot; 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool fin; 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool unidirectional; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ControlFrameFields> control_frame_fields_; 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(BufferedSpdyFramer); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // NET_SPDY_BUFFERED_SPDY_FRAMER_H_ 263