Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(170)

Side by Side Diff: net/spdy/spdy_session.h

Issue 2919011: Implement MAX_CONCURRENT_STREAMS SETTINGS header (Closed)
Patch Set: landing soon on a repo near you Created 10 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/spdy/spdy_network_transaction_unittest.cc ('k') | net/spdy/spdy_session.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 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_SPDY_SESSION_H_ 5 #ifndef NET_SPDY_SPDY_SESSION_H_
6 #define NET_SPDY_SPDY_SESSION_H_ 6 #define NET_SPDY_SPDY_SESSION_H_
7 7
8 #include <deque> 8 #include <deque>
9 #include <list> 9 #include <list>
10 #include <map> 10 #include <map>
(...skipping 13 matching lines...) Expand all
24 #include "net/socket/client_socket_handle.h" 24 #include "net/socket/client_socket_handle.h"
25 #include "net/socket/tcp_client_socket_pool.h" 25 #include "net/socket/tcp_client_socket_pool.h"
26 #include "net/spdy/spdy_framer.h" 26 #include "net/spdy/spdy_framer.h"
27 #include "net/spdy/spdy_io_buffer.h" 27 #include "net/spdy/spdy_io_buffer.h"
28 #include "net/spdy/spdy_protocol.h" 28 #include "net/spdy/spdy_protocol.h"
29 #include "net/spdy/spdy_session_pool.h" 29 #include "net/spdy/spdy_session_pool.h"
30 #include "testing/gtest/include/gtest/gtest_prod.h" // For FRIEND_TEST 30 #include "testing/gtest/include/gtest/gtest_prod.h" // For FRIEND_TEST
31 31
32 namespace net { 32 namespace net {
33 33
34 class SpdyHttpStream;
34 class SpdyStream; 35 class SpdyStream;
35 class HttpNetworkSession; 36 class HttpNetworkSession;
36 class BoundNetLog; 37 class BoundNetLog;
37 class SSLInfo; 38 class SSLInfo;
38 39
39 class SpdySession : public base::RefCounted<SpdySession>, 40 class SpdySession : public base::RefCounted<SpdySession>,
40 public spdy::SpdyFramerVisitorInterface { 41 public spdy::SpdyFramerVisitorInterface {
41 public: 42 public:
42 // Create a new SpdySession. 43 // Create a new SpdySession.
43 // |host_port_pair| is the host/port that this session connects to. 44 // |host_port_pair| is the host/port that this session connects to.
(...skipping 16 matching lines...) Expand all
60 // If the server initiates a stream, it might already exist for a given path. 61 // If the server initiates a stream, it might already exist for a given path.
61 // The server might also not have initiated the stream yet, but indicated it 62 // The server might also not have initiated the stream yet, but indicated it
62 // will via X-Associated-Content. Writes the stream out to |spdy_stream|. 63 // will via X-Associated-Content. Writes the stream out to |spdy_stream|.
63 // Returns a net error code. 64 // Returns a net error code.
64 int GetPushStream( 65 int GetPushStream(
65 const GURL& url, 66 const GURL& url,
66 scoped_refptr<SpdyStream>* spdy_stream, 67 scoped_refptr<SpdyStream>* spdy_stream,
67 const BoundNetLog& stream_net_log); 68 const BoundNetLog& stream_net_log);
68 69
69 // Create a new stream for a given |url|. Writes it out to |spdy_stream|. 70 // Create a new stream for a given |url|. Writes it out to |spdy_stream|.
70 // Returns a net error code. 71 // Returns a net error code, possibly ERR_IO_PENDING.
71 int CreateStream( 72 int CreateStream(
72 const GURL& url, 73 const GURL& url,
73 RequestPriority priority, 74 RequestPriority priority,
74 scoped_refptr<SpdyStream>* spdy_stream, 75 scoped_refptr<SpdyStream>* spdy_stream,
75 const BoundNetLog& stream_net_log); 76 const BoundNetLog& stream_net_log,
77 CompletionCallback* callback,
78 const SpdyHttpStream* spdy_http_stream);
79
80 // Remove PendingCreateStream objects on transaction deletion
81 void CancelPendingCreateStreams(const SpdyHttpStream* trans);
76 82
77 // Used by SpdySessionPool to initialize with a pre-existing SSL socket. 83 // Used by SpdySessionPool to initialize with a pre-existing SSL socket.
78 // Returns OK on success, or an error on failure. 84 // Returns OK on success, or an error on failure.
79 net::Error InitializeWithSSLSocket(ClientSocketHandle* connection, 85 net::Error InitializeWithSSLSocket(ClientSocketHandle* connection,
80 int certificate_error_code); 86 int certificate_error_code);
81 87
82 // Send the SYN frame for |stream_id|. 88 // Send the SYN frame for |stream_id|.
83 int WriteSynStream( 89 int WriteSynStream(
84 spdy::SpdyStreamId stream_id, 90 spdy::SpdyStreamId stream_id,
85 RequestPriority priority, 91 RequestPriority priority,
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
121 friend class base::RefCounted<SpdySession>; 127 friend class base::RefCounted<SpdySession>;
122 FRIEND_TEST(SpdySessionTest, GetActivePushStream); 128 FRIEND_TEST(SpdySessionTest, GetActivePushStream);
123 129
124 enum State { 130 enum State {
125 IDLE, 131 IDLE,
126 CONNECTING, 132 CONNECTING,
127 CONNECTED, 133 CONNECTED,
128 CLOSED 134 CLOSED
129 }; 135 };
130 136
137 enum { kDefaultMaxConcurrentStreams = 100 }; // TODO(mbelshe) remove this
138
139 struct PendingCreateStream {
140 const GURL* url;
141 RequestPriority priority;
142 scoped_refptr<SpdyStream>* spdy_stream;
143 const BoundNetLog* stream_net_log;
144 CompletionCallback* callback;
145
146 const SpdyHttpStream* spdy_http_stream;
147
148 PendingCreateStream(const GURL& url, RequestPriority priority,
149 scoped_refptr<SpdyStream>* spdy_stream,
150 const BoundNetLog& stream_net_log,
151 CompletionCallback* callback,
152 const SpdyHttpStream* spdy_http_stream)
153 : url(&url), priority(priority), spdy_stream(spdy_stream),
154 stream_net_log(&stream_net_log), callback(callback),
155 spdy_http_stream(spdy_http_stream) { }
156 };
157 typedef std::queue<PendingCreateStream, std::list< PendingCreateStream> >
158 PendingCreateStreamQueue;
131 typedef std::map<int, scoped_refptr<SpdyStream> > ActiveStreamMap; 159 typedef std::map<int, scoped_refptr<SpdyStream> > ActiveStreamMap;
132 // Only HTTP push a stream. 160 // Only HTTP push a stream.
133 typedef std::list<scoped_refptr<SpdyStream> > ActivePushedStreamList; 161 typedef std::list<scoped_refptr<SpdyStream> > ActivePushedStreamList;
134 typedef std::map<std::string, scoped_refptr<SpdyStream> > PendingStreamMap; 162 typedef std::map<std::string, scoped_refptr<SpdyStream> > PendingStreamMap;
135 typedef std::priority_queue<SpdyIOBuffer> OutputQueue; 163 typedef std::priority_queue<SpdyIOBuffer> OutputQueue;
136 164
137 virtual ~SpdySession(); 165 virtual ~SpdySession();
138 166
167 void ProcessPendingCreateStreams();
168 int CreateStreamImpl(
169 const GURL& url,
170 RequestPriority priority,
171 scoped_refptr<SpdyStream>* spdy_stream,
172 const BoundNetLog& stream_net_log);
173
139 // SpdyFramerVisitorInterface 174 // SpdyFramerVisitorInterface
140 virtual void OnError(spdy::SpdyFramer*); 175 virtual void OnError(spdy::SpdyFramer*);
141 virtual void OnStreamFrameData(spdy::SpdyStreamId stream_id, 176 virtual void OnStreamFrameData(spdy::SpdyStreamId stream_id,
142 const char* data, 177 const char* data,
143 size_t len); 178 size_t len);
144 virtual void OnControl(const spdy::SpdyControlFrame* frame); 179 virtual void OnControl(const spdy::SpdyControlFrame* frame);
145 180
146 // Control frame handlers. 181 // Control frame handlers.
147 void OnSyn(const spdy::SpdySynStreamControlFrame& frame, 182 void OnSyn(const spdy::SpdySynStreamControlFrame& frame,
148 const linked_ptr<spdy::SpdyHeaderBlock>& headers); 183 const linked_ptr<spdy::SpdyHeaderBlock>& headers);
149 void OnSynReply(const spdy::SpdySynReplyControlFrame& frame, 184 void OnSynReply(const spdy::SpdySynReplyControlFrame& frame,
150 const linked_ptr<spdy::SpdyHeaderBlock>& headers); 185 const linked_ptr<spdy::SpdyHeaderBlock>& headers);
151 void OnFin(const spdy::SpdyRstStreamControlFrame& frame); 186 void OnFin(const spdy::SpdyRstStreamControlFrame& frame);
152 void OnGoAway(const spdy::SpdyGoAwayControlFrame& frame); 187 void OnGoAway(const spdy::SpdyGoAwayControlFrame& frame);
153 void OnSettings(const spdy::SpdySettingsControlFrame& frame); 188 void OnSettings(const spdy::SpdySettingsControlFrame& frame);
154 189
155 // IO Callbacks 190 // IO Callbacks
156 void OnTCPConnect(int result); 191 void OnTCPConnect(int result);
157 void OnSSLConnect(int result); 192 void OnSSLConnect(int result);
158 void OnReadComplete(int result); 193 void OnReadComplete(int result);
159 void OnWriteComplete(int result); 194 void OnWriteComplete(int result);
160 195
161 // Send relevant SETTINGS. This is generally called on connection setup. 196 // Send relevant SETTINGS. This is generally called on connection setup.
162 void SendSettings(); 197 void SendSettings();
163 198
199 // Handle SETTINGS. Either when we send settings, or when we receive a
200 // SETTINGS ontrol frame, update our SpdySession accordingly.
201 void HandleSettings(const spdy::SpdySettings& settings);
202
164 // Start reading from the socket. 203 // Start reading from the socket.
165 // Returns OK on success, or an error on failure. 204 // Returns OK on success, or an error on failure.
166 net::Error ReadSocket(); 205 net::Error ReadSocket();
167 206
168 // Write current data to the socket. 207 // Write current data to the socket.
169 void WriteSocketLater(); 208 void WriteSocketLater();
170 void WriteSocket(); 209 void WriteSocket();
171 210
172 // Get a new stream id. 211 // Get a new stream id.
173 int GetNewStreamId(); 212 int GetNewStreamId();
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
216 255
217 // The socket handle for this session. 256 // The socket handle for this session.
218 scoped_ptr<ClientSocketHandle> connection_; 257 scoped_ptr<ClientSocketHandle> connection_;
219 258
220 // The read buffer used to read data from the socket. 259 // The read buffer used to read data from the socket.
221 scoped_refptr<IOBuffer> read_buffer_; 260 scoped_refptr<IOBuffer> read_buffer_;
222 bool read_pending_; 261 bool read_pending_;
223 262
224 int stream_hi_water_mark_; // The next stream id to use. 263 int stream_hi_water_mark_; // The next stream id to use.
225 264
265 // Queue, for each priority, of pending Create Streams that have not
266 // yet been satisfied
267 PendingCreateStreamQueue create_stream_queues_[NUM_PRIORITIES];
268
226 // TODO(mbelshe): We need to track these stream lists better. 269 // TODO(mbelshe): We need to track these stream lists better.
227 // I suspect it is possible to remove a stream from 270 // I suspect it is possible to remove a stream from
228 // one list, but not the other. 271 // one list, but not the other.
229 272
230 // Map from stream id to all active streams. Streams are active in the sense 273 // Map from stream id to all active streams. Streams are active in the sense
231 // that they have a consumer (typically SpdyNetworkTransaction and regardless 274 // that they have a consumer (typically SpdyNetworkTransaction and regardless
232 // of whether or not there is currently any ongoing IO [might be waiting for 275 // of whether or not there is currently any ongoing IO [might be waiting for
233 // the server to start pushing the stream]) or there are still network events 276 // the server to start pushing the stream]) or there are still network events
234 // incoming even though the consumer has already gone away (cancellation). 277 // incoming even though the consumer has already gone away (cancellation).
235 // TODO(willchan): Perhaps we should separate out cancelled streams and move 278 // TODO(willchan): Perhaps we should separate out cancelled streams and move
(...skipping 26 matching lines...) Expand all
262 305
263 // Spdy Frame state. 306 // Spdy Frame state.
264 spdy::SpdyFramer spdy_framer_; 307 spdy::SpdyFramer spdy_framer_;
265 308
266 // If an error has occurred on the session, the session is effectively 309 // If an error has occurred on the session, the session is effectively
267 // dead. Record this error here. When no error has occurred, |error_| will 310 // dead. Record this error here. When no error has occurred, |error_| will
268 // be OK. 311 // be OK.
269 net::Error error_; 312 net::Error error_;
270 State state_; 313 State state_;
271 314
315 // Limits
316 size_t max_concurrent_streams_; // 0 if no limit
317
272 // Some statistics counters for the session. 318 // Some statistics counters for the session.
273 int streams_initiated_count_; 319 int streams_initiated_count_;
274 int streams_pushed_count_; 320 int streams_pushed_count_;
275 int streams_pushed_and_claimed_count_; 321 int streams_pushed_and_claimed_count_;
276 int streams_abandoned_count_; 322 int streams_abandoned_count_;
277 bool sent_settings_; // Did this session send settings when it started. 323 bool sent_settings_; // Did this session send settings when it started.
278 bool received_settings_; // Did this session receive at least one settings 324 bool received_settings_; // Did this session receive at least one settings
279 // frame. 325 // frame.
280 326
281 bool in_session_pool_; // True if the session is currently in the pool. 327 bool in_session_pool_; // True if the session is currently in the pool.
282 328
283 BoundNetLog net_log_; 329 BoundNetLog net_log_;
284 330
285 static bool use_ssl_; 331 static bool use_ssl_;
286 }; 332 };
287 333
288 } // namespace net 334 } // namespace net
289 335
290 #endif // NET_SPDY_SPDY_SESSION_H_ 336 #endif // NET_SPDY_SPDY_SESSION_H_
OLDNEW
« no previous file with comments | « net/spdy/spdy_network_transaction_unittest.cc ('k') | net/spdy/spdy_session.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698