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
3 // found in the LICENSE file.
5 #ifndef NET_TOOLS_FLIP_SERVER_SPDY_INTERFACE_H_
6 #define NET_TOOLS_FLIP_SERVER_SPDY_INTERFACE_H_
12 #include "base/compiler_specific.h"
13 #include "net/spdy/buffered_spdy_framer.h"
14 #include "net/spdy/spdy_protocol.h"
15 #include "net/tools/flip_server/balsa_headers.h"
16 #include "net/tools/flip_server/balsa_visitor_interface.h"
17 #include "net/tools/flip_server/output_ordering.h"
18 #include "net/tools/flip_server/sm_connection.h"
19 #include "net/tools/flip_server/sm_interface.h"
26 class SpdySM
: public BufferedSpdyFramerVisitorInterface
,
29 SpdySM(SMConnection
* connection
,
30 SMInterface
* sm_http_interface
,
31 EpollServer
* epoll_server
,
32 MemoryCache
* memory_cache
,
33 FlipAcceptor
* acceptor
);
36 virtual void InitSMInterface(SMInterface
* sm_http_interface
,
37 int32 server_idx
) OVERRIDE
{}
39 virtual void InitSMConnection(SMConnectionPoolInterface
* connection_pool
,
40 SMInterface
* sm_interface
,
41 EpollServer
* epoll_server
,
43 std::string server_ip
,
44 std::string server_port
,
45 std::string remote_ip
,
46 bool use_ssl
) OVERRIDE
;
49 virtual void set_is_request() OVERRIDE
{}
50 SMInterface
* NewConnectionInterface();
51 SMInterface
* FindOrMakeNewSMConnectionInterface(std::string server_ip
,
52 std::string server_port
);
53 int SpdyHandleNewStream(SpdyStreamId stream_id
,
54 SpdyPriority priority
,
55 const SpdyHeaderBlock
& headers
,
56 std::string
& http_data
,
57 bool* is_https_scheme
);
59 // BufferedSpdyFramerVisitorInterface:
60 virtual void OnError(SpdyFramer::SpdyError error_code
) OVERRIDE
{}
61 virtual void OnStreamError(SpdyStreamId stream_id
,
62 const std::string
& description
) OVERRIDE
{}
63 // Called after all the header data for SYN_STREAM control frame is received.
64 virtual void OnSynStream(SpdyStreamId stream_id
,
65 SpdyStreamId associated_stream_id
,
66 SpdyPriority priority
,
67 uint8 credential_slot
,
70 const SpdyHeaderBlock
& headers
) OVERRIDE
;
72 // Called after all the header data for SYN_REPLY control frame is received.
73 virtual void OnSynReply(SpdyStreamId stream_id
,
75 const SpdyHeaderBlock
& headers
) OVERRIDE
;
77 // Called after all the header data for HEADERS control frame is received.
78 virtual void OnHeaders(SpdyStreamId stream_id
,
80 const SpdyHeaderBlock
& headers
) OVERRIDE
;
82 // Called when data is received.
83 // |stream_id| The stream receiving data.
84 // |data| A buffer containing the data received.
85 // |len| The length of the data buffer.
86 // When the other side has finished sending data on this stream,
87 // this method will be called with a zero-length buffer.
88 virtual void OnStreamFrameData(SpdyStreamId stream_id
,
93 // Called when a SETTINGS frame is received.
94 // |clear_persisted| True if the respective flag is set on the SETTINGS frame.
95 virtual void OnSettings(bool clear_persisted
) OVERRIDE
{}
97 // Called when an individual setting within a SETTINGS frame has been parsed
99 virtual void OnSetting(SpdySettingsIds id
,
101 uint32 value
) OVERRIDE
{}
103 // Called when a PING frame has been parsed.
104 virtual void OnPing(uint32 unique_id
) OVERRIDE
{}
106 // Called when a RST_STREAM frame has been parsed.
107 virtual void OnRstStream(SpdyStreamId stream_id
,
108 SpdyRstStreamStatus status
) OVERRIDE
;
110 // Called when a GOAWAY frame has been parsed.
111 virtual void OnGoAway(SpdyStreamId last_accepted_stream_id
,
112 SpdyGoAwayStatus status
) OVERRIDE
{}
114 // Called when a WINDOW_UPDATE frame has been parsed.
115 virtual void OnWindowUpdate(SpdyStreamId stream_id
,
116 uint32 delta_window_size
) OVERRIDE
{}
118 // Called when a PUSH_PROMISE frame has been parsed.
119 virtual void OnPushPromise(SpdyStreamId stream_id
,
120 SpdyStreamId promised_stream_id
) OVERRIDE
{}
123 virtual size_t ProcessReadInput(const char* data
, size_t len
) OVERRIDE
;
124 virtual size_t ProcessWriteInput(const char* data
, size_t len
) OVERRIDE
;
125 virtual bool MessageFullyRead() const OVERRIDE
;
126 virtual void SetStreamID(uint32 stream_id
) OVERRIDE
{}
127 virtual bool Error() const OVERRIDE
;
128 virtual const char* ErrorAsString() const OVERRIDE
;
129 virtual void Reset() OVERRIDE
{}
130 virtual void ResetForNewInterface(int32 server_idx
) OVERRIDE
;
131 virtual void ResetForNewConnection() OVERRIDE
;
132 // SMInterface's Cleanup is currently only called by SMConnection after a
133 // protocol message as been fully read. Spdy's SMInterface does not need
134 // to do any cleanup at this time.
135 // TODO(klindsay) This method is probably not being used properly and
136 // some logic review and method renaming is probably in order.
137 virtual void Cleanup() OVERRIDE
{}
138 // Send a settings frame
139 virtual int PostAcceptHook() OVERRIDE
;
140 virtual void NewStream(uint32 stream_id
,
142 const std::string
& filename
) OVERRIDE
;
143 void AddToOutputOrder(const MemCacheIter
& mci
);
144 virtual void SendEOF(uint32 stream_id
) OVERRIDE
;
145 virtual void SendErrorNotFound(uint32 stream_id
) OVERRIDE
;
146 void SendOKResponse(uint32 stream_id
, std::string
* output
);
147 virtual size_t SendSynStream(uint32 stream_id
,
148 const BalsaHeaders
& headers
) OVERRIDE
;
149 virtual size_t SendSynReply(uint32 stream_id
,
150 const BalsaHeaders
& headers
) OVERRIDE
;
151 virtual void SendDataFrame(uint32 stream_id
, const char* data
, int64 len
,
152 uint32 flags
, bool compress
) OVERRIDE
;
153 BufferedSpdyFramer
* spdy_framer() {
154 return buffered_spdy_framer_
;
157 static std::string
forward_ip_header() { return forward_ip_header_
; }
158 static void set_forward_ip_header(std::string value
) {
159 forward_ip_header_
= value
;
163 void SendEOFImpl(uint32 stream_id
);
164 void SendErrorNotFoundImpl(uint32 stream_id
);
165 void SendOKResponseImpl(uint32 stream_id
, std::string
* output
);
166 void KillStream(uint32 stream_id
);
167 void CopyHeaders(SpdyHeaderBlock
& dest
, const BalsaHeaders
& headers
);
168 size_t SendSynStreamImpl(uint32 stream_id
, const BalsaHeaders
& headers
);
169 size_t SendSynReplyImpl(uint32 stream_id
, const BalsaHeaders
& headers
);
170 void SendDataFrameImpl(uint32 stream_id
, const char* data
, int64 len
,
171 SpdyDataFlags flags
, bool compress
);
172 void EnqueueDataFrame(DataFrame
* df
);
173 virtual void GetOutput() OVERRIDE
;
175 BufferedSpdyFramer
* buffered_spdy_framer_
;
176 bool valid_spdy_session_
; // True if we have seen valid data on this session.
177 // Use this to fail fast when junk is sent to our
180 SMConnection
* connection_
;
181 OutputList
* client_output_list_
;
182 OutputOrdering client_output_ordering_
;
183 uint32 next_outgoing_stream_id_
;
184 EpollServer
* epoll_server_
;
185 FlipAcceptor
* acceptor_
;
186 MemoryCache
* memory_cache_
;
187 std::vector
<SMInterface
*> server_interface_list
;
188 std::vector
<int32
> unused_server_interface_list
;
189 typedef std::map
<uint32
, SMInterface
*> StreamToSmif
;
190 StreamToSmif stream_to_smif_
;
191 bool close_on_error_
;
193 static std::string forward_ip_header_
;
198 #endif // NET_TOOLS_FLIP_SERVER_SPDY_INTERFACE_H_