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