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_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 <stddef.h> | 8 #include <stddef.h> |
9 #include <stdint.h> | 9 #include <stdint.h> |
10 | 10 |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
76 // If more than this many bytes have been read or more than that many | 76 // If more than this many bytes have been read or more than that many |
77 // milliseconds have passed, return ERR_IO_PENDING from ReadLoop. | 77 // milliseconds have passed, return ERR_IO_PENDING from ReadLoop. |
78 const int kYieldAfterBytesRead = 32 * 1024; | 78 const int kYieldAfterBytesRead = 32 * 1024; |
79 const int kYieldAfterDurationMilliseconds = 20; | 79 const int kYieldAfterDurationMilliseconds = 20; |
80 | 80 |
81 // First and last valid stream IDs. As we always act as the client, | 81 // First and last valid stream IDs. As we always act as the client, |
82 // start at 1 for the first stream id. | 82 // start at 1 for the first stream id. |
83 const SpdyStreamId kFirstStreamId = 1; | 83 const SpdyStreamId kFirstStreamId = 1; |
84 const SpdyStreamId kLastStreamId = 0x7fffffff; | 84 const SpdyStreamId kLastStreamId = 0x7fffffff; |
85 | 85 |
86 class BoundNetLog; | 86 class NetLogWithSource; |
87 struct LoadTimingInfo; | 87 struct LoadTimingInfo; |
88 class ProxyDelegate; | 88 class ProxyDelegate; |
89 class SpdyStream; | 89 class SpdyStream; |
90 class SSLInfo; | 90 class SSLInfo; |
91 class TransportSecurityState; | 91 class TransportSecurityState; |
92 | 92 |
93 // NOTE: There's an enum of the same name (also with numeric suffixes) | 93 // NOTE: There's an enum of the same name (also with numeric suffixes) |
94 // in histograms.xml. Be sure to add new values there also. | 94 // in histograms.xml. Be sure to add new values there also. |
95 enum SpdyProtocolErrorDetails { | 95 enum SpdyProtocolErrorDetails { |
96 // SpdyFramer::SpdyError mappings. | 96 // SpdyFramer::SpdyError mappings. |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
171 // | 171 // |
172 // If OK is returned, must not be called again without | 172 // If OK is returned, must not be called again without |
173 // ReleaseStream() being called first. If ERR_IO_PENDING is | 173 // ReleaseStream() being called first. If ERR_IO_PENDING is |
174 // returned, must not be called again without CancelRequest() or | 174 // returned, must not be called again without CancelRequest() or |
175 // ReleaseStream() being called first. Otherwise, in case of an | 175 // ReleaseStream() being called first. Otherwise, in case of an |
176 // immediate error, this may be called again. | 176 // immediate error, this may be called again. |
177 int StartRequest(SpdyStreamType type, | 177 int StartRequest(SpdyStreamType type, |
178 const base::WeakPtr<SpdySession>& session, | 178 const base::WeakPtr<SpdySession>& session, |
179 const GURL& url, | 179 const GURL& url, |
180 RequestPriority priority, | 180 RequestPriority priority, |
181 const BoundNetLog& net_log, | 181 const NetLogWithSource& net_log, |
182 const CompletionCallback& callback); | 182 const CompletionCallback& callback); |
183 | 183 |
184 // Cancels any pending stream creation request. May be called | 184 // Cancels any pending stream creation request. May be called |
185 // repeatedly. | 185 // repeatedly. |
186 void CancelRequest(); | 186 void CancelRequest(); |
187 | 187 |
188 // Transfers the created stream (guaranteed to not be NULL) to the | 188 // Transfers the created stream (guaranteed to not be NULL) to the |
189 // caller. Must be called at most once after StartRequest() returns | 189 // caller. Must be called at most once after StartRequest() returns |
190 // OK or |callback| is called with OK. The caller must immediately | 190 // OK or |callback| is called with OK. The caller must immediately |
191 // set a delegate for the returned stream (except for test code). | 191 // set a delegate for the returned stream (except for test code). |
192 base::WeakPtr<SpdyStream> ReleaseStream(); | 192 base::WeakPtr<SpdyStream> ReleaseStream(); |
193 | 193 |
194 private: | 194 private: |
195 friend class SpdySession; | 195 friend class SpdySession; |
196 | 196 |
197 // Called by |session_| when the stream attempt has finished | 197 // Called by |session_| when the stream attempt has finished |
198 // successfully. | 198 // successfully. |
199 void OnRequestCompleteSuccess(const base::WeakPtr<SpdyStream>& stream); | 199 void OnRequestCompleteSuccess(const base::WeakPtr<SpdyStream>& stream); |
200 | 200 |
201 // Called by |session_| when the stream attempt has finished with an | 201 // Called by |session_| when the stream attempt has finished with an |
202 // error. Also called with ERR_ABORTED if |session_| is destroyed | 202 // error. Also called with ERR_ABORTED if |session_| is destroyed |
203 // while the stream attempt is still pending. | 203 // while the stream attempt is still pending. |
204 void OnRequestCompleteFailure(int rv); | 204 void OnRequestCompleteFailure(int rv); |
205 | 205 |
206 // Accessors called by |session_|. | 206 // Accessors called by |session_|. |
207 SpdyStreamType type() const { return type_; } | 207 SpdyStreamType type() const { return type_; } |
208 const GURL& url() const { return url_; } | 208 const GURL& url() const { return url_; } |
209 RequestPriority priority() const { return priority_; } | 209 RequestPriority priority() const { return priority_; } |
210 const BoundNetLog& net_log() const { return net_log_; } | 210 const NetLogWithSource& net_log() const { return net_log_; } |
211 | 211 |
212 void Reset(); | 212 void Reset(); |
213 | 213 |
214 SpdyStreamType type_; | 214 SpdyStreamType type_; |
215 base::WeakPtr<SpdySession> session_; | 215 base::WeakPtr<SpdySession> session_; |
216 base::WeakPtr<SpdyStream> stream_; | 216 base::WeakPtr<SpdyStream> stream_; |
217 GURL url_; | 217 GURL url_; |
218 RequestPriority priority_; | 218 RequestPriority priority_; |
219 BoundNetLog net_log_; | 219 NetLogWithSource net_log_; |
220 CompletionCallback callback_; | 220 CompletionCallback callback_; |
221 | 221 |
222 base::WeakPtrFactory<SpdyStreamRequest> weak_ptr_factory_; | 222 base::WeakPtrFactory<SpdyStreamRequest> weak_ptr_factory_; |
223 | 223 |
224 DISALLOW_COPY_AND_ASSIGN(SpdyStreamRequest); | 224 DISALLOW_COPY_AND_ASSIGN(SpdyStreamRequest); |
225 }; | 225 }; |
226 | 226 |
227 class NET_EXPORT SpdySession : public BufferedSpdyFramerVisitorInterface, | 227 class NET_EXPORT SpdySession : public BufferedSpdyFramerVisitorInterface, |
228 public SpdyFramerDebugVisitorInterface, | 228 public SpdyFramerDebugVisitorInterface, |
229 public HigherLayeredPool { | 229 public HigherLayeredPool { |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
315 return spdy_session_key_; | 315 return spdy_session_key_; |
316 } | 316 } |
317 // Get a pushed stream for a given |url|. If the server initiates a | 317 // Get a pushed stream for a given |url|. If the server initiates a |
318 // stream, it might already exist for a given path. The server | 318 // stream, it might already exist for a given path. The server |
319 // might also not have initiated the stream yet, but indicated it | 319 // might also not have initiated the stream yet, but indicated it |
320 // will via X-Associated-Content. Returns OK if a stream was found | 320 // will via X-Associated-Content. Returns OK if a stream was found |
321 // and put into |spdy_stream|, or if one was not found but it is | 321 // and put into |spdy_stream|, or if one was not found but it is |
322 // okay to create a new stream (in which case |spdy_stream| is | 322 // okay to create a new stream (in which case |spdy_stream| is |
323 // reset). Returns an error (not ERR_IO_PENDING) otherwise, and | 323 // reset). Returns an error (not ERR_IO_PENDING) otherwise, and |
324 // resets |spdy_stream|. | 324 // resets |spdy_stream|. |
325 int GetPushStream( | 325 int GetPushStream(const GURL& url, |
326 const GURL& url, | 326 base::WeakPtr<SpdyStream>* spdy_stream, |
327 base::WeakPtr<SpdyStream>* spdy_stream, | 327 const NetLogWithSource& stream_net_log); |
328 const BoundNetLog& stream_net_log); | |
329 | 328 |
330 // Initialize the session with the given connection. |is_secure| | 329 // Initialize the session with the given connection. |is_secure| |
331 // must indicate whether |connection| uses an SSL socket or not; it | 330 // must indicate whether |connection| uses an SSL socket or not; it |
332 // is usually true, but it can be false for testing or when SPDY is | 331 // is usually true, but it can be false for testing or when SPDY is |
333 // configured to work with non-secure sockets. | 332 // configured to work with non-secure sockets. |
334 // | 333 // |
335 // |pool| is the SpdySessionPool that owns us. Its lifetime must | 334 // |pool| is the SpdySessionPool that owns us. Its lifetime must |
336 // strictly be greater than |this|. | 335 // strictly be greater than |this|. |
337 // | 336 // |
338 // |certificate_error_code| must either be OK or less than | 337 // |certificate_error_code| must either be OK or less than |
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
511 | 510 |
512 // Returns the current |stream_initial_send_window_size_|. | 511 // Returns the current |stream_initial_send_window_size_|. |
513 int32_t stream_initial_send_window_size() const { | 512 int32_t stream_initial_send_window_size() const { |
514 return stream_initial_send_window_size_; | 513 return stream_initial_send_window_size_; |
515 } | 514 } |
516 | 515 |
517 // Returns true if no stream in the session can send data due to | 516 // Returns true if no stream in the session can send data due to |
518 // session flow control. | 517 // session flow control. |
519 bool IsSendStalled() const { return session_send_window_size_ == 0; } | 518 bool IsSendStalled() const { return session_send_window_size_ == 0; } |
520 | 519 |
521 const BoundNetLog& net_log() const { return net_log_; } | 520 const NetLogWithSource& net_log() const { return net_log_; } |
522 | 521 |
523 int GetPeerAddress(IPEndPoint* address) const; | 522 int GetPeerAddress(IPEndPoint* address) const; |
524 int GetLocalAddress(IPEndPoint* address) const; | 523 int GetLocalAddress(IPEndPoint* address) const; |
525 | 524 |
526 // Adds |alias| to set of aliases associated with this session. | 525 // Adds |alias| to set of aliases associated with this session. |
527 void AddPooledAlias(const SpdySessionKey& alias_key); | 526 void AddPooledAlias(const SpdySessionKey& alias_key); |
528 | 527 |
529 // Returns the set of aliases associated with this session. | 528 // Returns the set of aliases associated with this session. |
530 const std::set<SpdySessionKey>& pooled_aliases() const { | 529 const std::set<SpdySessionKey>& pooled_aliases() const { |
531 return pooled_aliases_; | 530 return pooled_aliases_; |
(...skipping 631 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1163 // plans to add a command line switch that would cause a SETTINGS | 1162 // plans to add a command line switch that would cause a SETTINGS |
1164 // frame with window size announcement to be sent on startup. Newly | 1163 // frame with window size announcement to be sent on startup. Newly |
1165 // created streams will use this value for the initial receive | 1164 // created streams will use this value for the initial receive |
1166 // window size. | 1165 // window size. |
1167 int32_t stream_max_recv_window_size_; | 1166 int32_t stream_max_recv_window_size_; |
1168 | 1167 |
1169 // A queue of stream IDs that have been send-stalled at some point | 1168 // A queue of stream IDs that have been send-stalled at some point |
1170 // in the past. | 1169 // in the past. |
1171 std::deque<SpdyStreamId> stream_send_unstall_queue_[NUM_PRIORITIES]; | 1170 std::deque<SpdyStreamId> stream_send_unstall_queue_[NUM_PRIORITIES]; |
1172 | 1171 |
1173 BoundNetLog net_log_; | 1172 NetLogWithSource net_log_; |
1174 | 1173 |
1175 // Outside of tests, these should always be true. | 1174 // Outside of tests, these should always be true. |
1176 bool verify_domain_authentication_; | 1175 bool verify_domain_authentication_; |
1177 bool enable_sending_initial_data_; | 1176 bool enable_sending_initial_data_; |
1178 bool enable_ping_based_connection_checking_; | 1177 bool enable_ping_based_connection_checking_; |
1179 | 1178 |
1180 // |connection_at_risk_of_loss_time_| is an optimization to avoid sending | 1179 // |connection_at_risk_of_loss_time_| is an optimization to avoid sending |
1181 // wasteful preface pings (when we just got some data). | 1180 // wasteful preface pings (when we just got some data). |
1182 // | 1181 // |
1183 // If it is zero (the most conservative figure), then we always send the | 1182 // If it is zero (the most conservative figure), then we always send the |
(...skipping 27 matching lines...) Expand all Loading... |
1211 // Used for posting asynchronous IO tasks. We use this even though | 1210 // Used for posting asynchronous IO tasks. We use this even though |
1212 // SpdySession is refcounted because we don't need to keep the SpdySession | 1211 // SpdySession is refcounted because we don't need to keep the SpdySession |
1213 // alive if the last reference is within a RunnableMethod. Just revoke the | 1212 // alive if the last reference is within a RunnableMethod. Just revoke the |
1214 // method. | 1213 // method. |
1215 base::WeakPtrFactory<SpdySession> weak_factory_; | 1214 base::WeakPtrFactory<SpdySession> weak_factory_; |
1216 }; | 1215 }; |
1217 | 1216 |
1218 } // namespace net | 1217 } // namespace net |
1219 | 1218 |
1220 #endif // NET_SPDY_SPDY_SESSION_H_ | 1219 #endif // NET_SPDY_SPDY_SESSION_H_ |
OLD | NEW |