blob: 81319b965b5b31657a9670bd5210ed789172a04f [file] [log] [blame]
[email protected]3b63f8f42011-03-28 01:54:151// Copyright (c) 2011 The Chromium Authors. All rights reserved.
[email protected]aea80602009-09-18 00:55:082// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
[email protected]dab9c7d2010-02-06 21:44:325#ifndef NET_SPDY_SPDY_SESSION_H_
6#define NET_SPDY_SPDY_SESSION_H_
[email protected]32b76ef2010-07-26 23:08:247#pragma once
[email protected]aea80602009-09-18 00:55:088
9#include <deque>
10#include <list>
11#include <map>
12#include <queue>
13#include <string>
14
[email protected]8822f382010-07-30 21:49:0315#include "base/gtest_prod_util.h"
[email protected]3b63f8f42011-03-28 01:54:1516#include "base/memory/linked_ptr.h"
17#include "base/memory/ref_counted.h"
[email protected]023cee772010-09-29 20:59:4018#include "base/task.h"
[email protected]aea80602009-09-18 00:55:0819#include "net/base/io_buffer.h"
20#include "net/base/load_states.h"
21#include "net/base/net_errors.h"
[email protected]635909f2010-05-12 18:19:3622#include "net/base/net_log.h"
[email protected]ac790b42009-12-02 04:31:3123#include "net/base/request_priority.h"
[email protected]18c53ae2009-10-01 18:18:5224#include "net/base/ssl_config_service.h"
[email protected]aea80602009-09-18 00:55:0825#include "net/base/upload_data_stream.h"
[email protected]aea80602009-09-18 00:55:0826#include "net/socket/client_socket.h"
27#include "net/socket/client_socket_handle.h"
[email protected]7fc5b09a2010-02-27 00:07:3828#include "net/socket/tcp_client_socket_pool.h"
[email protected]dab9c7d2010-02-06 21:44:3229#include "net/spdy/spdy_framer.h"
30#include "net/spdy/spdy_io_buffer.h"
31#include "net/spdy/spdy_protocol.h"
32#include "net/spdy/spdy_session_pool.h"
[email protected]aea80602009-09-18 00:55:0833
34namespace net {
35
[email protected]7349c6b12010-07-22 02:29:1636// This is somewhat arbitrary and not really fixed, but it will always work
37// reasonably with ethernet. Chop the world into 2-packet chunks. This is
38// somewhat arbitrary, but is reasonably small and ensures that we elicit
39// ACKs quickly from TCP (because TCP tries to only ACK every other packet).
40const int kMss = 1430;
41const int kMaxSpdyFrameChunkSize = (2 * kMss) - spdy::SpdyFrame::size();
42
[email protected]9e743cd2010-03-16 07:03:5343class BoundNetLog;
[email protected]f4580332010-09-25 21:20:2744class SpdySettingsStorage;
45class SpdyStream;
[email protected]dcc6bbb2009-12-09 19:09:0146class SSLInfo;
[email protected]aea80602009-09-18 00:55:0847
[email protected]955fc2e72010-02-08 20:37:3048class SpdySession : public base::RefCounted<SpdySession>,
49 public spdy::SpdyFramerVisitorInterface {
[email protected]aea80602009-09-18 00:55:0850 public:
[email protected]807c01a2010-04-21 16:57:4551 // Create a new SpdySession.
[email protected]b261d0e2010-08-02 19:13:2452 // |host_port_proxy_pair| is the host/port that this session connects to, and
53 // the proxy configuration settings that it's using.
[email protected]87bfa3f2010-09-30 14:54:5654 // |spdy_session_pool| is the SpdySessionPool that owns us. Its lifetime must
55 // strictly be greater than |this|.
[email protected]635909f2010-05-12 18:19:3656 // |session| is the HttpNetworkSession. |net_log| is the NetLog that we log
57 // network events to.
[email protected]b261d0e2010-08-02 19:13:2458 SpdySession(const HostPortProxyPair& host_port_proxy_pair,
[email protected]f4580332010-09-25 21:20:2759 SpdySessionPool* spdy_session_pool,
60 SpdySettingsStorage* spdy_settings,
[email protected]44297002010-05-16 00:59:1061 NetLog* net_log);
[email protected]807c01a2010-04-21 16:57:4562
[email protected]b261d0e2010-08-02 19:13:2463 const HostPortPair& host_port_pair() const {
64 return host_port_proxy_pair_.first;
65 }
66 const HostPortProxyPair& host_port_proxy_pair() const {
67 return host_port_proxy_pair_;
68 }
[email protected]aea80602009-09-18 00:55:0869
[email protected]9be804c82010-06-24 17:59:4670 // Get a pushed stream for a given |url|.
71 // If the server initiates a stream, it might already exist for a given path.
72 // The server might also not have initiated the stream yet, but indicated it
[email protected]bdbda462010-06-28 17:30:3773 // will via X-Associated-Content. Writes the stream out to |spdy_stream|.
74 // Returns a net error code.
75 int GetPushStream(
[email protected]9be804c82010-06-24 17:59:4676 const GURL& url,
[email protected]bdbda462010-06-28 17:30:3777 scoped_refptr<SpdyStream>* spdy_stream,
[email protected]9be804c82010-06-24 17:59:4678 const BoundNetLog& stream_net_log);
79
[email protected]bdbda462010-06-28 17:30:3780 // Create a new stream for a given |url|. Writes it out to |spdy_stream|.
[email protected]2bd93022010-07-17 00:58:4481 // Returns a net error code, possibly ERR_IO_PENDING.
[email protected]bdbda462010-06-28 17:30:3782 int CreateStream(
[email protected]9be804c82010-06-24 17:59:4683 const GURL& url,
84 RequestPriority priority,
[email protected]bdbda462010-06-28 17:30:3785 scoped_refptr<SpdyStream>* spdy_stream,
[email protected]2bd93022010-07-17 00:58:4486 const BoundNetLog& stream_net_log,
[email protected]971746e2010-07-21 03:02:2387 CompletionCallback* callback);
[email protected]2bd93022010-07-17 00:58:4488
89 // Remove PendingCreateStream objects on transaction deletion
[email protected]971746e2010-07-21 03:02:2390 void CancelPendingCreateStreams(const scoped_refptr<SpdyStream>* spdy_stream);
[email protected]aea80602009-09-18 00:55:0891
[email protected]9e9e842e2010-07-23 23:09:1592 // Used by SpdySessionPool to initialize with a pre-existing SSL socket. For
93 // testing, setting is_secure to false allows initialization with a
94 // pre-existing TCP socket.
[email protected]26ef6582010-06-24 02:30:4795 // Returns OK on success, or an error on failure.
[email protected]9e9e842e2010-07-23 23:09:1596 net::Error InitializeWithSocket(ClientSocketHandle* connection,
97 bool is_secure,
98 int certificate_error_code);
[email protected]807c01a2010-04-21 16:57:4599
[email protected]8b114dd72011-03-25 05:33:02100 // Check to see if this SPDY session can support an additional domain.
101 // If the session is un-authenticated, then this call always returns true.
102 // For SSL-based sessions, verifies that the certificate in use by this
103 // session provides authentication for the domain.
104 // NOTE: This function can have false negatives on some platforms.
105 bool VerifyDomainAuthentication(const std::string& domain);
106
[email protected]9be804c82010-06-24 17:59:46107 // Send the SYN frame for |stream_id|.
108 int WriteSynStream(
109 spdy::SpdyStreamId stream_id,
110 RequestPriority priority,
111 spdy::SpdyControlFlags flags,
112 const linked_ptr<spdy::SpdyHeaderBlock>& headers);
113
[email protected]ff57bb82009-11-12 06:52:14114 // Write a data frame to the stream.
115 // Used to create and queue a data frame for the given stream.
[email protected]955fc2e72010-02-08 20:37:30116 int WriteStreamData(spdy::SpdyStreamId stream_id, net::IOBuffer* data,
[email protected]4f386422010-07-20 04:19:49117 int len,
118 spdy::SpdyDataFlags flags);
[email protected]ff57bb82009-11-12 06:52:14119
[email protected]56e7c63d2010-07-12 18:42:17120 // Close a stream.
121 void CloseStream(spdy::SpdyStreamId stream_id, int status);
[email protected]aea80602009-09-18 00:55:08122
[email protected]5af3c572010-07-20 14:16:27123 // Reset a stream by sending a RST_STREAM frame with given status code.
124 // Also closes the stream. Was not piggybacked to CloseStream since not
125 // all of the calls to CloseStream necessitate sending a RST_STREAM.
126 void ResetStream(spdy::SpdyStreamId stream_id, spdy::SpdyStatusCodes status);
127
[email protected]aea80602009-09-18 00:55:08128 // Check if a stream is active.
[email protected]955fc2e72010-02-08 20:37:30129 bool IsStreamActive(spdy::SpdyStreamId stream_id) const;
[email protected]aea80602009-09-18 00:55:08130
131 // The LoadState is used for informing the user of the current network
132 // status, such as "resolving host", "connecting", etc.
133 LoadState GetLoadState() const;
[email protected]d1eda932009-11-04 01:03:10134
[email protected]9be804c82010-06-24 17:59:46135 // Fills SSL info in |ssl_info| and returns true when SSL is in use.
136 bool GetSSLInfo(SSLInfo* ssl_info, bool* was_npn_negotiated);
137
[email protected]8e6441ca2010-08-19 05:56:38138 // Fills SSL Certificate Request info |cert_request_info| and returns
139 // true when SSL is in use.
140 bool GetSSLCertRequestInfo(SSLCertRequestInfo* cert_request_info);
141
[email protected]34437af82009-11-06 02:28:49142 // Enable or disable SSL.
143 static void SetSSLMode(bool enable) { use_ssl_ = enable; }
[email protected]85c0ed82009-12-15 23:14:14144 static bool SSLMode() { return use_ssl_; }
[email protected]34437af82009-11-06 02:28:49145
[email protected]7349c6b12010-07-22 02:29:16146 // Enable or disable flow control.
[email protected]450c5022010-08-26 02:38:28147 static void set_flow_control(bool enable) { use_flow_control_ = enable; }
148 static bool flow_control() { return use_flow_control_; }
149
[email protected]f90a3a5e2010-10-25 05:17:24150 // Sets the max concurrent streams per session.
151 static void set_max_concurrent_streams(size_t value) {
152 max_concurrent_stream_limit_ = value;
153 }
154 static size_t max_concurrent_streams() {
155 return max_concurrent_stream_limit_;
156 }
157
[email protected]450c5022010-08-26 02:38:28158 // Send WINDOW_UPDATE frame, called by a stream whenever receive window
159 // size is increased.
160 void SendWindowUpdate(spdy::SpdyStreamId stream_id, int delta_window_size);
[email protected]7349c6b12010-07-22 02:29:16161
[email protected]b278eb72010-07-09 20:17:00162 // If session is closed, no new streams/transactions should be created.
163 bool IsClosed() const { return state_ == CLOSED; }
164
165 // Closes this session. This will close all active streams and mark
166 // the session as permanently closed.
167 // |err| should not be OK; this function is intended to be called on
168 // error.
[email protected]a01ea222010-08-19 16:50:53169 // |remove_from_pool| indicates whether to also remove the session from the
170 // session pool.
171 void CloseSessionOnError(net::Error err, bool remove_from_pool);
[email protected]b278eb72010-07-09 20:17:00172
[email protected]1ce7b66b2010-10-12 20:32:44173 // Retrieves information on the current state of the SPDY session as a
174 // Value. Caller takes possession of the returned value.
175 Value* GetInfoAsValue() const;
176
[email protected]8e6441ca2010-08-19 05:56:38177 // Indicates whether the session is being reused after having successfully
178 // used to send/receive data in the past.
179 bool IsReused() const {
[email protected]58cebf8f2010-07-31 19:20:16180 return frames_received_ > 0;
181 }
182
[email protected]fe2f62a2010-10-01 03:34:07183 // Returns true if the underlying transport socket ever had any reads or
184 // writes.
185 bool WasEverUsed() const {
186 return connection_->socket()->WasEverUsed();
187 }
188
[email protected]87bfa3f2010-09-30 14:54:56189 void set_spdy_session_pool(SpdySessionPool* pool) {
190 spdy_session_pool_ = NULL;
191 }
[email protected]a01ea222010-08-19 16:50:53192
[email protected]19ec8a72010-08-23 03:38:23193 // Access to the number of active and pending streams. These are primarily
194 // available for testing and diagnostics.
195 size_t num_active_streams() const { return active_streams_.size(); }
196 size_t num_unclaimed_pushed_streams() const {
197 return unclaimed_pushed_streams_.size();
198 }
199
[email protected]6cd3bd202010-08-30 05:23:06200 const BoundNetLog& net_log() const { return net_log_; }
201
[email protected]fe2f62a2010-10-01 03:34:07202 int GetPeerAddress(AddressList* address) const {
203 return connection_->socket()->GetPeerAddress(address);
204 }
205
[email protected]807c01a2010-04-21 16:57:45206 private:
207 friend class base::RefCounted<SpdySession>;
[email protected]8822f382010-07-30 21:49:03208 FRIEND_TEST_ALL_PREFIXES(SpdySessionTest, GetActivePushStream);
[email protected]aea80602009-09-18 00:55:08209
[email protected]2bd93022010-07-17 00:58:44210 struct PendingCreateStream {
[email protected]2bd93022010-07-17 00:58:44211 PendingCreateStream(const GURL& url, RequestPriority priority,
212 scoped_refptr<SpdyStream>* spdy_stream,
213 const BoundNetLog& stream_net_log,
[email protected]971746e2010-07-21 03:02:23214 CompletionCallback* callback)
[email protected]2bd93022010-07-17 00:58:44215 : url(&url), priority(priority), spdy_stream(spdy_stream),
[email protected]971746e2010-07-21 03:02:23216 stream_net_log(&stream_net_log), callback(callback) { }
[email protected]ad74a592011-01-21 18:40:55217
218 const GURL* url;
219 RequestPriority priority;
220 scoped_refptr<SpdyStream>* spdy_stream;
221 const BoundNetLog* stream_net_log;
222 CompletionCallback* callback;
[email protected]2bd93022010-07-17 00:58:44223 };
224 typedef std::queue<PendingCreateStream, std::list< PendingCreateStream> >
225 PendingCreateStreamQueue;
[email protected]955fc2e72010-02-08 20:37:30226 typedef std::map<int, scoped_refptr<SpdyStream> > ActiveStreamMap;
[email protected]65d56aa2010-06-14 04:13:40227 // Only HTTP push a stream.
[email protected]e3ebba0f2010-08-05 17:59:58228 typedef std::map<std::string, scoped_refptr<SpdyStream> > PushedStreamMap;
[email protected]955fc2e72010-02-08 20:37:30229 typedef std::priority_queue<SpdyIOBuffer> OutputQueue;
[email protected]a677f2b2009-11-22 00:43:00230
[email protected]06bdc8d2010-11-18 17:37:14231 struct CallbackResultPair {
232 CallbackResultPair() : callback(NULL), result(OK) {}
233 CallbackResultPair(CompletionCallback* callback_in, int result_in)
234 : callback(callback_in), result(result_in) {}
235
236 CompletionCallback* callback;
237 int result;
238 };
239
240 typedef std::map<const scoped_refptr<SpdyStream>*, CallbackResultPair>
241 PendingCallbackMap;
242
[email protected]ad74a592011-01-21 18:40:55243 enum State {
244 IDLE,
245 CONNECTING,
246 CONNECTED,
247 CLOSED
248 };
249
250 enum { kDefaultMaxConcurrentStreams = 10 };
251
[email protected]955fc2e72010-02-08 20:37:30252 virtual ~SpdySession();
[email protected]5389bc72009-11-05 23:34:24253
[email protected]2bd93022010-07-17 00:58:44254 void ProcessPendingCreateStreams();
255 int CreateStreamImpl(
256 const GURL& url,
257 RequestPriority priority,
258 scoped_refptr<SpdyStream>* spdy_stream,
259 const BoundNetLog& stream_net_log);
260
[email protected]aea80602009-09-18 00:55:08261 // Control frame handlers.
[email protected]651b77c2010-03-10 19:29:42262 void OnSyn(const spdy::SpdySynStreamControlFrame& frame,
[email protected]33c477b2010-05-13 19:21:07263 const linked_ptr<spdy::SpdyHeaderBlock>& headers);
[email protected]651b77c2010-03-10 19:29:42264 void OnSynReply(const spdy::SpdySynReplyControlFrame& frame,
[email protected]33c477b2010-05-13 19:21:07265 const linked_ptr<spdy::SpdyHeaderBlock>& headers);
[email protected]d08358502010-12-03 22:04:03266 void OnHeaders(const spdy::SpdyHeadersControlFrame& frame,
267 const linked_ptr<spdy::SpdyHeaderBlock>& headers);
[email protected]e3ebba0f2010-08-05 17:59:58268 void OnRst(const spdy::SpdyRstStreamControlFrame& frame);
[email protected]651b77c2010-03-10 19:29:42269 void OnGoAway(const spdy::SpdyGoAwayControlFrame& frame);
[email protected]74188f22010-04-09 20:18:50270 void OnSettings(const spdy::SpdySettingsControlFrame& frame);
[email protected]5af3c572010-07-20 14:16:27271 void OnWindowUpdate(const spdy::SpdyWindowUpdateControlFrame& frame);
[email protected]aea80602009-09-18 00:55:08272
273 // IO Callbacks
[email protected]aea80602009-09-18 00:55:08274 void OnReadComplete(int result);
275 void OnWriteComplete(int result);
276
[email protected]74188f22010-04-09 20:18:50277 // Send relevant SETTINGS. This is generally called on connection setup.
278 void SendSettings();
279
[email protected]2bd93022010-07-17 00:58:44280 // Handle SETTINGS. Either when we send settings, or when we receive a
281 // SETTINGS ontrol frame, update our SpdySession accordingly.
282 void HandleSettings(const spdy::SpdySettings& settings);
283
[email protected]aea80602009-09-18 00:55:08284 // Start reading from the socket.
[email protected]26ef6582010-06-24 02:30:47285 // Returns OK on success, or an error on failure.
286 net::Error ReadSocket();
[email protected]aea80602009-09-18 00:55:08287
288 // Write current data to the socket.
289 void WriteSocketLater();
290 void WriteSocket();
291
292 // Get a new stream id.
293 int GetNewStreamId();
294
[email protected]74188f22010-04-09 20:18:50295 // Queue a frame for sending.
296 // |frame| is the frame to send.
297 // |priority| is the priority for insertion into the queue.
298 // |stream| is the stream which this IO is associated with (or NULL).
299 void QueueFrame(spdy::SpdyFrame* frame, spdy::SpdyPriority priority,
300 SpdyStream* stream);
301
[email protected]aea80602009-09-18 00:55:08302 // Track active streams in the active stream list.
[email protected]955fc2e72010-02-08 20:37:30303 void ActivateStream(SpdyStream* stream);
[email protected]56e7c63d2010-07-12 18:42:17304 void DeleteStream(spdy::SpdyStreamId id, int status);
[email protected]aea80602009-09-18 00:55:08305
[email protected]4b4762a2010-04-23 16:04:14306 // Removes this session from the session pool.
307 void RemoveFromPool();
308
[email protected]aea80602009-09-18 00:55:08309 // Check if we have a pending pushed-stream for this url
310 // Returns the stream if found (and returns it from the pending
311 // list), returns NULL otherwise.
[email protected]9be804c82010-06-24 17:59:46312 scoped_refptr<SpdyStream> GetActivePushStream(const std::string& url);
[email protected]aea80602009-09-18 00:55:08313
[email protected]9be804c82010-06-24 17:59:46314 // Calls OnResponseReceived().
[email protected]3f662f12010-03-25 19:56:12315 // Returns true if successful.
316 bool Respond(const spdy::SpdyHeaderBlock& headers,
317 const scoped_refptr<SpdyStream> stream);
318
[email protected]0aebc002010-05-21 06:50:19319 void RecordHistograms();
320
[email protected]b278eb72010-07-09 20:17:00321 // Closes all streams. Used as part of shutdown.
322 void CloseAllStreams(net::Error status);
323
[email protected]2f898c42010-10-07 23:30:57324 // Invokes a user callback for stream creation. We provide this method so it
325 // can be deferred to the MessageLoop, so we avoid re-entrancy problems.
[email protected]06bdc8d2010-11-18 17:37:14326 void InvokeUserStreamCreationCallback(scoped_refptr<SpdyStream>* stream);
[email protected]2f898c42010-10-07 23:30:57327
[email protected]ad74a592011-01-21 18:40:55328 // SpdyFramerVisitorInterface:
329 virtual void OnError(spdy::SpdyFramer*);
330 virtual void OnStreamFrameData(spdy::SpdyStreamId stream_id,
331 const char* data,
332 size_t len);
333 virtual void OnControl(const spdy::SpdyControlFrame* frame);
334
[email protected]955fc2e72010-02-08 20:37:30335 // Callbacks for the Spdy session.
[email protected]955fc2e72010-02-08 20:37:30336 CompletionCallbackImpl<SpdySession> read_callback_;
337 CompletionCallbackImpl<SpdySession> write_callback_;
[email protected]aea80602009-09-18 00:55:08338
[email protected]023cee772010-09-29 20:59:40339 // Used for posting asynchronous IO tasks. We use this even though
340 // SpdySession is refcounted because we don't need to keep the SpdySession
341 // alive if the last reference is within a RunnableMethod. Just revoke the
342 // method.
343 ScopedRunnableMethodFactory<SpdySession> method_factory_;
344
[email protected]06bdc8d2010-11-18 17:37:14345 // Map of the SpdyStreams for which we have a pending Task to invoke a
346 // callback. This is necessary since, before we invoke said callback, it's
347 // possible that the request is cancelled.
348 PendingCallbackMap pending_callback_map_;
349
[email protected]aea80602009-09-18 00:55:08350 // The domain this session is connected to.
[email protected]b261d0e2010-08-02 19:13:24351 const HostPortProxyPair host_port_proxy_pair_;
[email protected]aea80602009-09-18 00:55:08352
[email protected]87bfa3f2010-09-30 14:54:56353 // |spdy_session_pool_| owns us, therefore its lifetime must exceed ours. We
354 // set this to NULL after we are removed from the pool.
355 SpdySessionPool* spdy_session_pool_;
[email protected]2f898c42010-10-07 23:30:57356 SpdySettingsStorage* const spdy_settings_;
[email protected]aea80602009-09-18 00:55:08357
358 // The socket handle for this session.
[email protected]1f14a912009-12-21 20:32:44359 scoped_ptr<ClientSocketHandle> connection_;
[email protected]aea80602009-09-18 00:55:08360
361 // The read buffer used to read data from the socket.
[email protected]230cadd2009-09-22 16:33:59362 scoped_refptr<IOBuffer> read_buffer_;
[email protected]aea80602009-09-18 00:55:08363 bool read_pending_;
364
365 int stream_hi_water_mark_; // The next stream id to use.
366
[email protected]2bd93022010-07-17 00:58:44367 // Queue, for each priority, of pending Create Streams that have not
368 // yet been satisfied
369 PendingCreateStreamQueue create_stream_queues_[NUM_PRIORITIES];
370
[email protected]a677f2b2009-11-22 00:43:00371 // Map from stream id to all active streams. Streams are active in the sense
[email protected]955fc2e72010-02-08 20:37:30372 // that they have a consumer (typically SpdyNetworkTransaction and regardless
[email protected]a677f2b2009-11-22 00:43:00373 // of whether or not there is currently any ongoing IO [might be waiting for
374 // the server to start pushing the stream]) or there are still network events
375 // incoming even though the consumer has already gone away (cancellation).
376 // TODO(willchan): Perhaps we should separate out cancelled streams and move
377 // them into a separate ActiveStreamMap, and not deliver network events to
378 // them?
379 ActiveStreamMap active_streams_;
[email protected]e3ebba0f2010-08-05 17:59:58380 // Map of all the streams that have already started to be pushed by the
[email protected]a677f2b2009-11-22 00:43:00381 // server, but do not have consumers yet.
[email protected]e3ebba0f2010-08-05 17:59:58382 PushedStreamMap unclaimed_pushed_streams_;
[email protected]aea80602009-09-18 00:55:08383
384 // As we gather data to be sent, we put it into the output queue.
[email protected]aea80602009-09-18 00:55:08385 OutputQueue queue_;
386
[email protected]aea80602009-09-18 00:55:08387 // The packet we are currently sending.
[email protected]e1245352009-11-30 19:42:42388 bool write_pending_; // Will be true when a write is in progress.
[email protected]955fc2e72010-02-08 20:37:30389 SpdyIOBuffer in_flight_write_; // This is the write buffer in progress.
[email protected]e1245352009-11-30 19:42:42390
391 // Flag if we have a pending message scheduled for WriteSocket.
[email protected]aea80602009-09-18 00:55:08392 bool delayed_write_pending_;
[email protected]aea80602009-09-18 00:55:08393
[email protected]955fc2e72010-02-08 20:37:30394 // Flag if we're using an SSL connection for this SpdySession.
[email protected]dcc6bbb2009-12-09 19:09:01395 bool is_secure_;
396
[email protected]bdbda462010-06-28 17:30:37397 // Certificate error code when using a secure connection.
398 int certificate_error_code_;
399
[email protected]955fc2e72010-02-08 20:37:30400 // Spdy Frame state.
401 spdy::SpdyFramer spdy_framer_;
[email protected]aea80602009-09-18 00:55:08402
[email protected]60253bd2009-12-01 01:16:39403 // If an error has occurred on the session, the session is effectively
404 // dead. Record this error here. When no error has occurred, |error_| will
405 // be OK.
406 net::Error error_;
407 State state_;
408
[email protected]2bd93022010-07-17 00:58:44409 // Limits
410 size_t max_concurrent_streams_; // 0 if no limit
411
[email protected]9b010802009-12-27 22:55:30412 // Some statistics counters for the session.
413 int streams_initiated_count_;
414 int streams_pushed_count_;
415 int streams_pushed_and_claimed_count_;
[email protected]56e7c63d2010-07-12 18:42:17416 int streams_abandoned_count_;
[email protected]58cebf8f2010-07-31 19:20:16417 int frames_received_;
[email protected]13b3a8e2010-12-10 01:53:33418 int bytes_received_;
[email protected]0aebc002010-05-21 06:50:19419 bool sent_settings_; // Did this session send settings when it started.
420 bool received_settings_; // Did this session receive at least one settings
421 // frame.
[email protected]a6187e12010-12-06 19:31:59422 int stalled_streams_; // Count of streams that were ever stalled.
[email protected]9b010802009-12-27 22:55:30423
[email protected]7349c6b12010-07-22 02:29:16424 // Initial send window size for the session; can be changed by an
425 // arriving SETTINGS frame; newly created streams use this value for the
426 // initial send window size.
427 int initial_send_window_size_;
[email protected]5af3c572010-07-20 14:16:27428
[email protected]450c5022010-08-26 02:38:28429 // Initial receive window size for the session; there are plans to add a
430 // command line switch that would cause a SETTINGS frame with window size
431 // announcement to be sent on startup; newly created streams will use
432 // this value for the initial receive window size.
433 int initial_recv_window_size_;
434
[email protected]635909f2010-05-12 18:19:36435 BoundNetLog net_log_;
436
[email protected]affe8fe2009-10-14 20:06:05437 static bool use_ssl_;
[email protected]7349c6b12010-07-22 02:29:16438 static bool use_flow_control_;
[email protected]f90a3a5e2010-10-25 05:17:24439 static size_t max_concurrent_stream_limit_;
[email protected]aea80602009-09-18 00:55:08440};
441
[email protected]3deb9a52010-11-11 00:24:40442class NetLogSpdySynParameter : public NetLog::EventParameters {
443 public:
444 NetLogSpdySynParameter(const linked_ptr<spdy::SpdyHeaderBlock>& headers,
445 spdy::SpdyControlFlags flags,
[email protected]d08358502010-12-03 22:04:03446 spdy::SpdyStreamId id,
447 spdy::SpdyStreamId associated_stream);
[email protected]3deb9a52010-11-11 00:24:40448
[email protected]3deb9a52010-11-11 00:24:40449 const linked_ptr<spdy::SpdyHeaderBlock>& GetHeaders() const {
450 return headers_;
451 }
452
[email protected]ad74a592011-01-21 18:40:55453 virtual Value* ToValue() const;
454
[email protected]3deb9a52010-11-11 00:24:40455 private:
456 virtual ~NetLogSpdySynParameter();
457
458 const linked_ptr<spdy::SpdyHeaderBlock> headers_;
459 const spdy::SpdyControlFlags flags_;
460 const spdy::SpdyStreamId id_;
[email protected]d08358502010-12-03 22:04:03461 const spdy::SpdyStreamId associated_stream_;
[email protected]3deb9a52010-11-11 00:24:40462
463 DISALLOW_COPY_AND_ASSIGN(NetLogSpdySynParameter);
464};
465
[email protected]aea80602009-09-18 00:55:08466} // namespace net
467
[email protected]dab9c7d2010-02-06 21:44:32468#endif // NET_SPDY_SPDY_SESSION_H_