| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef NET_SPDY_BUFFERED_SPDY_FRAMER_H_ | 5 #ifndef NET_SPDY_BUFFERED_SPDY_FRAMER_H_ |
| 6 #define NET_SPDY_BUFFERED_SPDY_FRAMER_H_ | 6 #define NET_SPDY_BUFFERED_SPDY_FRAMER_H_ |
| 7 #pragma once | 7 #pragma once |
| 8 | 8 |
| 9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
| 10 #include "base/gtest_prod_util.h" | 10 #include "base/gtest_prod_util.h" |
| 11 #include "base/memory/linked_ptr.h" | 11 #include "base/memory/linked_ptr.h" |
| 12 #include "base/memory/scoped_ptr.h" | 12 #include "base/memory/scoped_ptr.h" |
| 13 #include "net/base/net_export.h" | 13 #include "net/base/net_export.h" |
| 14 #include "net/spdy/spdy_framer.h" | 14 #include "net/spdy/spdy_framer.h" |
| 15 #include "net/spdy/spdy_protocol.h" | 15 #include "net/spdy/spdy_protocol.h" |
| 16 | 16 |
| 17 namespace spdy { | 17 namespace spdy { |
| 18 | 18 |
| 19 class NET_EXPORT_PRIVATE BufferedSpdyFramerVisitorInterface | 19 class NET_EXPORT_PRIVATE BufferedSpdyFramerVisitorInterface { |
| 20 : public SpdyFramerVisitorInterface { | |
| 21 public: | 20 public: |
| 22 BufferedSpdyFramerVisitorInterface() {} | 21 BufferedSpdyFramerVisitorInterface() {} |
| 23 virtual ~BufferedSpdyFramerVisitorInterface() {} | 22 virtual ~BufferedSpdyFramerVisitorInterface() {} |
| 24 | 23 |
| 24 // Called if an error is detected in the SpdyFrame protocol. |
| 25 virtual void OnError() = 0; |
| 26 |
| 27 // Called if an error is detected in a SPDY stream. |
| 28 virtual void OnStreamError(spdy::SpdyStreamId stream_id) = 0; |
| 29 |
| 25 // Called after all the header data for SYN_STREAM control frame is received. | 30 // Called after all the header data for SYN_STREAM control frame is received. |
| 26 virtual void OnSyn(const SpdySynStreamControlFrame& frame, | 31 virtual void OnSynStream(const SpdySynStreamControlFrame& frame, |
| 27 const linked_ptr<SpdyHeaderBlock>& headers) = 0; | 32 const linked_ptr<SpdyHeaderBlock>& headers) = 0; |
| 28 | 33 |
| 29 // Called after all the header data for SYN_REPLY control frame is received. | 34 // Called after all the header data for SYN_REPLY control frame is received. |
| 30 virtual void OnSynReply(const SpdySynReplyControlFrame& frame, | 35 virtual void OnSynReply(const SpdySynReplyControlFrame& frame, |
| 31 const linked_ptr<SpdyHeaderBlock>& headers) = 0; | 36 const linked_ptr<SpdyHeaderBlock>& headers) = 0; |
| 32 | 37 |
| 33 // Called after all the header data for HEADERS control frame is received. | 38 // Called after all the header data for HEADERS control frame is received. |
| 34 virtual void OnHeaders(const SpdyHeadersControlFrame& frame, | 39 virtual void OnHeaders(const SpdyHeadersControlFrame& frame, |
| 35 const linked_ptr<SpdyHeaderBlock>& headers) = 0; | 40 const linked_ptr<SpdyHeaderBlock>& headers) = 0; |
| 36 | 41 |
| 42 // Called after a RST_STREAM frame is received. |
| 43 virtual void OnRstStream(const spdy::SpdyRstStreamControlFrame& frame) = 0; |
| 44 |
| 45 // Called after a GOAWAY frame is received. |
| 46 virtual void OnGoAway(const spdy::SpdyGoAwayControlFrame& frame) = 0; |
| 47 |
| 48 // Called after a PING frame is received. |
| 49 virtual void OnPing(const spdy::SpdyPingControlFrame& frame) = 0; |
| 50 |
| 51 // Called after a SETTINGS frame is received. |
| 52 virtual void OnSettings(const spdy::SpdySettingsControlFrame& frame) = 0; |
| 53 |
| 54 // Called after a WINDOW_UPDATE frame is received. |
| 55 virtual void OnWindowUpdate( |
| 56 const spdy::SpdyWindowUpdateControlFrame& frame) = 0; |
| 57 |
| 58 // Called when data is received. |
| 59 // |stream_id| The stream receiving data. |
| 60 // |data| A buffer containing the data received. |
| 61 // |len| The length of the data buffer. |
| 62 // When the other side has finished sending data on this stream, |
| 63 // this method will be called with a zero-length buffer. |
| 64 virtual void OnStreamFrameData(SpdyStreamId stream_id, |
| 65 const char* data, |
| 66 size_t len) = 0; |
| 37 private: | 67 private: |
| 38 DISALLOW_COPY_AND_ASSIGN(BufferedSpdyFramerVisitorInterface); | 68 DISALLOW_COPY_AND_ASSIGN(BufferedSpdyFramerVisitorInterface); |
| 39 }; | 69 }; |
| 40 | 70 |
| 41 class NET_EXPORT_PRIVATE BufferedSpdyFramer { | 71 class NET_EXPORT_PRIVATE BufferedSpdyFramer |
| 72 : public SpdyFramerVisitorInterface { |
| 42 public: | 73 public: |
| 43 BufferedSpdyFramer(); | 74 BufferedSpdyFramer(); |
| 44 virtual ~BufferedSpdyFramer(); | 75 virtual ~BufferedSpdyFramer(); |
| 45 | 76 |
| 46 // Sets callbacks to be called from the buffered spdy framer. A visitor must | 77 // Sets callbacks to be called from the buffered spdy framer. A visitor must |
| 47 // be set, or else the framer will likely crash. It is acceptable for the | 78 // be set, or else the framer will likely crash. It is acceptable for the |
| 48 // visitor to do nothing. If this is called multiple times, only the last | 79 // visitor to do nothing. If this is called multiple times, only the last |
| 49 // visitor will be used. | 80 // visitor will be used. |
| 50 void set_visitor(BufferedSpdyFramerVisitorInterface* visitor); | 81 void set_visitor(BufferedSpdyFramerVisitorInterface* visitor); |
| 51 | 82 |
| 52 void OnControl(const SpdyControlFrame* frame); | 83 // SpdyFramerVisitorInterface |
| 84 virtual void OnError(SpdyFramer* /*framer*/) OVERRIDE; |
| 85 virtual void OnControl(const SpdyControlFrame* frame) OVERRIDE; |
| 86 virtual bool OnCredentialFrameData(const char* frame_data, |
| 87 size_t len) OVERRIDE; |
| 88 virtual bool OnControlFrameHeaderData(SpdyStreamId stream_id, |
| 89 const char* header_data, |
| 90 size_t len) OVERRIDE; |
| 91 virtual void OnStreamFrameData(SpdyStreamId stream_id, |
| 92 const char* data, |
| 93 size_t len) OVERRIDE; |
| 94 virtual void OnDataFrameHeader(const SpdyDataFrame* frame) OVERRIDE; |
| 53 | 95 |
| 54 bool OnControlFrameHeaderData(SpdyStreamId stream_id, | 96 // SpdyFramer methods. |
| 55 const char* header_data, | |
| 56 size_t len); | |
| 57 | |
| 58 void OnDataFrameHeader(const SpdyDataFrame* frame); | |
| 59 | |
| 60 // spdy_framer_ methods. | |
| 61 size_t ProcessInput(const char* data, size_t len); | 97 size_t ProcessInput(const char* data, size_t len); |
| 62 void Reset(); | 98 void Reset(); |
| 63 SpdyFramer::SpdyError error_code() const; | 99 SpdyFramer::SpdyError error_code() const; |
| 64 SpdyFramer::SpdyState state() const; | 100 SpdyFramer::SpdyState state() const; |
| 65 bool MessageFullyRead(); | 101 bool MessageFullyRead(); |
| 66 bool HasError(); | 102 bool HasError(); |
| 67 bool ParseHeaderBlock(const SpdyFrame* frame, SpdyHeaderBlock* block); | 103 bool ParseHeaderBlock(const SpdyFrame* frame, SpdyHeaderBlock* block); |
| 68 SpdySynStreamControlFrame* CreateSynStream(SpdyStreamId stream_id, | 104 SpdySynStreamControlFrame* CreateSynStream(SpdyStreamId stream_id, |
| 69 SpdyStreamId associated_stream_id, | 105 SpdyStreamId associated_stream_id, |
| 70 int priority, | 106 int priority, |
| 71 SpdyControlFlags flags, | 107 SpdyControlFlags flags, |
| 72 bool compressed, | 108 bool compressed, |
| 73 const SpdyHeaderBlock* headers); | 109 const SpdyHeaderBlock* headers); |
| 74 SpdySynReplyControlFrame* CreateSynReply(SpdyStreamId stream_id, | 110 SpdySynReplyControlFrame* CreateSynReply(SpdyStreamId stream_id, |
| 75 SpdyControlFlags flags, | 111 SpdyControlFlags flags, |
| 76 bool compressed, | 112 bool compressed, |
| 77 const SpdyHeaderBlock* headers); | 113 const SpdyHeaderBlock* headers); |
| 78 SpdyHeadersControlFrame* CreateHeaders(SpdyStreamId stream_id, | 114 SpdyHeadersControlFrame* CreateHeaders(SpdyStreamId stream_id, |
| 79 SpdyControlFlags flags, | 115 SpdyControlFlags flags, |
| 80 bool compressed, | 116 bool compressed, |
| 81 const SpdyHeaderBlock* headers); | 117 const SpdyHeaderBlock* headers); |
| 82 SpdyDataFrame* CreateDataFrame(SpdyStreamId stream_id, | 118 SpdyDataFrame* CreateDataFrame(SpdyStreamId stream_id, |
| 83 const char* data, | 119 const char* data, |
| 84 uint32 len, | 120 uint32 len, |
| 85 SpdyDataFlags flags); | 121 SpdyDataFlags flags); |
| 86 SpdyFrame* CompressFrame(const SpdyFrame& frame); | 122 SpdyFrame* CompressFrame(const SpdyFrame& frame); |
| 87 bool IsCompressible(const SpdyFrame& frame) const; | 123 bool IsCompressible(const SpdyFrame& frame) const; |
| 88 | 124 |
| 125 int frames_received() const { return frames_received_; } |
| 126 |
| 89 private: | 127 private: |
| 90 // The size of the header_buffer_. | 128 // The size of the header_buffer_. |
| 91 enum { kHeaderBufferSize = 32 * 1024 }; | 129 enum { kHeaderBufferSize = 32 * 1024 }; |
| 92 | 130 |
| 93 void InitHeaderStreaming(const SpdyControlFrame* frame); | 131 void InitHeaderStreaming(const SpdyControlFrame* frame); |
| 94 | 132 |
| 95 SpdyFramer spdy_framer_; | 133 SpdyFramer spdy_framer_; |
| 96 BufferedSpdyFramerVisitorInterface* visitor_; | 134 BufferedSpdyFramerVisitorInterface* visitor_; |
| 97 | 135 |
| 98 // Header block streaming state: | 136 // Header block streaming state: |
| 99 char header_buffer_[kHeaderBufferSize]; | 137 char header_buffer_[kHeaderBufferSize]; |
| 100 size_t header_buffer_used_; | 138 size_t header_buffer_used_; |
| 101 bool header_buffer_valid_; | 139 bool header_buffer_valid_; |
| 102 SpdyStreamId header_stream_id_; | 140 SpdyStreamId header_stream_id_; |
| 103 scoped_ptr<SpdyFrame> control_frame_; | 141 scoped_ptr<SpdyFrame> control_frame_; |
| 142 int frames_received_; |
| 104 | 143 |
| 105 DISALLOW_COPY_AND_ASSIGN(BufferedSpdyFramer); | 144 DISALLOW_COPY_AND_ASSIGN(BufferedSpdyFramer); |
| 106 }; | 145 }; |
| 107 | 146 |
| 108 } // namespace spdy | 147 } // namespace spdy |
| 109 | 148 |
| 110 #endif // NET_SPDY_BUFFERED_SPDY_FRAMER_H_ | 149 #endif // NET_SPDY_BUFFERED_SPDY_FRAMER_H_ |
| OLD | NEW |