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 |