blob: 8ef6543c210fbd76d2fc3a09b22339fb1918c8c2 [file] [log] [blame]
[email protected]5af3c572010-07-20 14:16:271// Copyright (c) 2010 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]33c477b2010-05-13 19:21:0716#include "base/linked_ptr.h"
[email protected]aea80602009-09-18 00:55:0817#include "base/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]9be804c82010-06-24 17:59:46100 // Send the SYN frame for |stream_id|.
101 int WriteSynStream(
102 spdy::SpdyStreamId stream_id,
103 RequestPriority priority,
104 spdy::SpdyControlFlags flags,
105 const linked_ptr<spdy::SpdyHeaderBlock>& headers);
106
[email protected]ff57bb82009-11-12 06:52:14107 // Write a data frame to the stream.
108 // Used to create and queue a data frame for the given stream.
[email protected]955fc2e72010-02-08 20:37:30109 int WriteStreamData(spdy::SpdyStreamId stream_id, net::IOBuffer* data,
[email protected]4f386422010-07-20 04:19:49110 int len,
111 spdy::SpdyDataFlags flags);
[email protected]ff57bb82009-11-12 06:52:14112
[email protected]56e7c63d2010-07-12 18:42:17113 // Close a stream.
114 void CloseStream(spdy::SpdyStreamId stream_id, int status);
[email protected]aea80602009-09-18 00:55:08115
[email protected]5af3c572010-07-20 14:16:27116 // Reset a stream by sending a RST_STREAM frame with given status code.
117 // Also closes the stream. Was not piggybacked to CloseStream since not
118 // all of the calls to CloseStream necessitate sending a RST_STREAM.
119 void ResetStream(spdy::SpdyStreamId stream_id, spdy::SpdyStatusCodes status);
120
[email protected]aea80602009-09-18 00:55:08121 // Check if a stream is active.
[email protected]955fc2e72010-02-08 20:37:30122 bool IsStreamActive(spdy::SpdyStreamId stream_id) const;
[email protected]aea80602009-09-18 00:55:08123
124 // The LoadState is used for informing the user of the current network
125 // status, such as "resolving host", "connecting", etc.
126 LoadState GetLoadState() const;
[email protected]d1eda932009-11-04 01:03:10127
[email protected]9be804c82010-06-24 17:59:46128 // Fills SSL info in |ssl_info| and returns true when SSL is in use.
129 bool GetSSLInfo(SSLInfo* ssl_info, bool* was_npn_negotiated);
130
[email protected]8e6441ca2010-08-19 05:56:38131 // Fills SSL Certificate Request info |cert_request_info| and returns
132 // true when SSL is in use.
133 bool GetSSLCertRequestInfo(SSLCertRequestInfo* cert_request_info);
134
[email protected]34437af82009-11-06 02:28:49135 // Enable or disable SSL.
136 static void SetSSLMode(bool enable) { use_ssl_ = enable; }
[email protected]85c0ed82009-12-15 23:14:14137 static bool SSLMode() { return use_ssl_; }
[email protected]34437af82009-11-06 02:28:49138
[email protected]7349c6b12010-07-22 02:29:16139 // Enable or disable flow control.
[email protected]450c5022010-08-26 02:38:28140 static void set_flow_control(bool enable) { use_flow_control_ = enable; }
141 static bool flow_control() { return use_flow_control_; }
142
143 // Send WINDOW_UPDATE frame, called by a stream whenever receive window
144 // size is increased.
145 void SendWindowUpdate(spdy::SpdyStreamId stream_id, int delta_window_size);
[email protected]7349c6b12010-07-22 02:29:16146
[email protected]b278eb72010-07-09 20:17:00147 // If session is closed, no new streams/transactions should be created.
148 bool IsClosed() const { return state_ == CLOSED; }
149
150 // Closes this session. This will close all active streams and mark
151 // the session as permanently closed.
152 // |err| should not be OK; this function is intended to be called on
153 // error.
[email protected]a01ea222010-08-19 16:50:53154 // |remove_from_pool| indicates whether to also remove the session from the
155 // session pool.
156 void CloseSessionOnError(net::Error err, bool remove_from_pool);
[email protected]b278eb72010-07-09 20:17:00157
[email protected]8e6441ca2010-08-19 05:56:38158 // Indicates whether the session is being reused after having successfully
159 // used to send/receive data in the past.
160 bool IsReused() const {
[email protected]58cebf8f2010-07-31 19:20:16161 return frames_received_ > 0;
162 }
163
[email protected]fe2f62a2010-10-01 03:34:07164 // Returns true if the underlying transport socket ever had any reads or
165 // writes.
166 bool WasEverUsed() const {
167 return connection_->socket()->WasEverUsed();
168 }
169
[email protected]87bfa3f2010-09-30 14:54:56170 void set_spdy_session_pool(SpdySessionPool* pool) {
171 spdy_session_pool_ = NULL;
172 }
[email protected]a01ea222010-08-19 16:50:53173
[email protected]19ec8a72010-08-23 03:38:23174 // Access to the number of active and pending streams. These are primarily
175 // available for testing and diagnostics.
176 size_t num_active_streams() const { return active_streams_.size(); }
177 size_t num_unclaimed_pushed_streams() const {
178 return unclaimed_pushed_streams_.size();
179 }
180
[email protected]6cd3bd202010-08-30 05:23:06181 const BoundNetLog& net_log() const { return net_log_; }
182
[email protected]fe2f62a2010-10-01 03:34:07183 int GetPeerAddress(AddressList* address) const {
184 return connection_->socket()->GetPeerAddress(address);
185 }
186
[email protected]807c01a2010-04-21 16:57:45187 private:
188 friend class base::RefCounted<SpdySession>;
[email protected]8822f382010-07-30 21:49:03189 FRIEND_TEST_ALL_PREFIXES(SpdySessionTest, GetActivePushStream);
[email protected]aea80602009-09-18 00:55:08190
[email protected]60253bd2009-12-01 01:16:39191 enum State {
192 IDLE,
193 CONNECTING,
194 CONNECTED,
195 CLOSED
196 };
197
[email protected]2bd93022010-07-17 00:58:44198 enum { kDefaultMaxConcurrentStreams = 100 }; // TODO(mbelshe) remove this
199
200 struct PendingCreateStream {
201 const GURL* url;
202 RequestPriority priority;
203 scoped_refptr<SpdyStream>* spdy_stream;
204 const BoundNetLog* stream_net_log;
205 CompletionCallback* callback;
206
[email protected]2bd93022010-07-17 00:58:44207 PendingCreateStream(const GURL& url, RequestPriority priority,
208 scoped_refptr<SpdyStream>* spdy_stream,
209 const BoundNetLog& stream_net_log,
[email protected]971746e2010-07-21 03:02:23210 CompletionCallback* callback)
[email protected]2bd93022010-07-17 00:58:44211 : url(&url), priority(priority), spdy_stream(spdy_stream),
[email protected]971746e2010-07-21 03:02:23212 stream_net_log(&stream_net_log), callback(callback) { }
[email protected]2bd93022010-07-17 00:58:44213 };
214 typedef std::queue<PendingCreateStream, std::list< PendingCreateStream> >
215 PendingCreateStreamQueue;
[email protected]955fc2e72010-02-08 20:37:30216 typedef std::map<int, scoped_refptr<SpdyStream> > ActiveStreamMap;
[email protected]65d56aa2010-06-14 04:13:40217 // Only HTTP push a stream.
[email protected]e3ebba0f2010-08-05 17:59:58218 typedef std::map<std::string, scoped_refptr<SpdyStream> > PushedStreamMap;
[email protected]955fc2e72010-02-08 20:37:30219 typedef std::priority_queue<SpdyIOBuffer> OutputQueue;
[email protected]a677f2b2009-11-22 00:43:00220
[email protected]955fc2e72010-02-08 20:37:30221 virtual ~SpdySession();
[email protected]5389bc72009-11-05 23:34:24222
[email protected]2bd93022010-07-17 00:58:44223 void ProcessPendingCreateStreams();
224 int CreateStreamImpl(
225 const GURL& url,
226 RequestPriority priority,
227 scoped_refptr<SpdyStream>* spdy_stream,
228 const BoundNetLog& stream_net_log);
229
[email protected]955fc2e72010-02-08 20:37:30230 // SpdyFramerVisitorInterface
231 virtual void OnError(spdy::SpdyFramer*);
232 virtual void OnStreamFrameData(spdy::SpdyStreamId stream_id,
[email protected]aea80602009-09-18 00:55:08233 const char* data,
[email protected]aeac1e42009-10-10 00:26:01234 size_t len);
[email protected]955fc2e72010-02-08 20:37:30235 virtual void OnControl(const spdy::SpdyControlFrame* frame);
[email protected]aea80602009-09-18 00:55:08236
237 // Control frame handlers.
[email protected]651b77c2010-03-10 19:29:42238 void OnSyn(const spdy::SpdySynStreamControlFrame& frame,
[email protected]33c477b2010-05-13 19:21:07239 const linked_ptr<spdy::SpdyHeaderBlock>& headers);
[email protected]651b77c2010-03-10 19:29:42240 void OnSynReply(const spdy::SpdySynReplyControlFrame& frame,
[email protected]33c477b2010-05-13 19:21:07241 const linked_ptr<spdy::SpdyHeaderBlock>& headers);
[email protected]e3ebba0f2010-08-05 17:59:58242 void OnRst(const spdy::SpdyRstStreamControlFrame& frame);
[email protected]651b77c2010-03-10 19:29:42243 void OnGoAway(const spdy::SpdyGoAwayControlFrame& frame);
[email protected]74188f22010-04-09 20:18:50244 void OnSettings(const spdy::SpdySettingsControlFrame& frame);
[email protected]5af3c572010-07-20 14:16:27245 void OnWindowUpdate(const spdy::SpdyWindowUpdateControlFrame& frame);
[email protected]aea80602009-09-18 00:55:08246
247 // IO Callbacks
[email protected]aea80602009-09-18 00:55:08248 void OnReadComplete(int result);
249 void OnWriteComplete(int result);
250
[email protected]74188f22010-04-09 20:18:50251 // Send relevant SETTINGS. This is generally called on connection setup.
252 void SendSettings();
253
[email protected]2bd93022010-07-17 00:58:44254 // Handle SETTINGS. Either when we send settings, or when we receive a
255 // SETTINGS ontrol frame, update our SpdySession accordingly.
256 void HandleSettings(const spdy::SpdySettings& settings);
257
[email protected]aea80602009-09-18 00:55:08258 // Start reading from the socket.
[email protected]26ef6582010-06-24 02:30:47259 // Returns OK on success, or an error on failure.
260 net::Error ReadSocket();
[email protected]aea80602009-09-18 00:55:08261
262 // Write current data to the socket.
263 void WriteSocketLater();
264 void WriteSocket();
265
266 // Get a new stream id.
267 int GetNewStreamId();
268
[email protected]74188f22010-04-09 20:18:50269 // Queue a frame for sending.
270 // |frame| is the frame to send.
271 // |priority| is the priority for insertion into the queue.
272 // |stream| is the stream which this IO is associated with (or NULL).
273 void QueueFrame(spdy::SpdyFrame* frame, spdy::SpdyPriority priority,
274 SpdyStream* stream);
275
[email protected]aea80602009-09-18 00:55:08276 // Track active streams in the active stream list.
[email protected]955fc2e72010-02-08 20:37:30277 void ActivateStream(SpdyStream* stream);
[email protected]56e7c63d2010-07-12 18:42:17278 void DeleteStream(spdy::SpdyStreamId id, int status);
[email protected]aea80602009-09-18 00:55:08279
[email protected]4b4762a2010-04-23 16:04:14280 // Removes this session from the session pool.
281 void RemoveFromPool();
282
[email protected]aea80602009-09-18 00:55:08283 // Check if we have a pending pushed-stream for this url
284 // Returns the stream if found (and returns it from the pending
285 // list), returns NULL otherwise.
[email protected]9be804c82010-06-24 17:59:46286 scoped_refptr<SpdyStream> GetActivePushStream(const std::string& url);
[email protected]aea80602009-09-18 00:55:08287
[email protected]9be804c82010-06-24 17:59:46288 // Calls OnResponseReceived().
[email protected]3f662f12010-03-25 19:56:12289 // Returns true if successful.
290 bool Respond(const spdy::SpdyHeaderBlock& headers,
291 const scoped_refptr<SpdyStream> stream);
292
[email protected]0aebc002010-05-21 06:50:19293 void RecordHistograms();
294
[email protected]b278eb72010-07-09 20:17:00295 // Closes all streams. Used as part of shutdown.
296 void CloseAllStreams(net::Error status);
297
[email protected]955fc2e72010-02-08 20:37:30298 // Callbacks for the Spdy session.
[email protected]955fc2e72010-02-08 20:37:30299 CompletionCallbackImpl<SpdySession> read_callback_;
300 CompletionCallbackImpl<SpdySession> write_callback_;
[email protected]aea80602009-09-18 00:55:08301
[email protected]023cee772010-09-29 20:59:40302 // Used for posting asynchronous IO tasks. We use this even though
303 // SpdySession is refcounted because we don't need to keep the SpdySession
304 // alive if the last reference is within a RunnableMethod. Just revoke the
305 // method.
306 ScopedRunnableMethodFactory<SpdySession> method_factory_;
307
[email protected]aea80602009-09-18 00:55:08308 // The domain this session is connected to.
[email protected]b261d0e2010-08-02 19:13:24309 const HostPortProxyPair host_port_proxy_pair_;
[email protected]aea80602009-09-18 00:55:08310
[email protected]87bfa3f2010-09-30 14:54:56311 // |spdy_session_pool_| owns us, therefore its lifetime must exceed ours. We
312 // set this to NULL after we are removed from the pool.
313 SpdySessionPool* spdy_session_pool_;
[email protected]f4580332010-09-25 21:20:27314 SpdySettingsStorage* spdy_settings_;
[email protected]aea80602009-09-18 00:55:08315
316 // The socket handle for this session.
[email protected]1f14a912009-12-21 20:32:44317 scoped_ptr<ClientSocketHandle> connection_;
[email protected]aea80602009-09-18 00:55:08318
319 // The read buffer used to read data from the socket.
[email protected]230cadd2009-09-22 16:33:59320 scoped_refptr<IOBuffer> read_buffer_;
[email protected]aea80602009-09-18 00:55:08321 bool read_pending_;
322
323 int stream_hi_water_mark_; // The next stream id to use.
324
[email protected]2bd93022010-07-17 00:58:44325 // Queue, for each priority, of pending Create Streams that have not
326 // yet been satisfied
327 PendingCreateStreamQueue create_stream_queues_[NUM_PRIORITIES];
328
[email protected]a677f2b2009-11-22 00:43:00329 // Map from stream id to all active streams. Streams are active in the sense
[email protected]955fc2e72010-02-08 20:37:30330 // that they have a consumer (typically SpdyNetworkTransaction and regardless
[email protected]a677f2b2009-11-22 00:43:00331 // of whether or not there is currently any ongoing IO [might be waiting for
332 // the server to start pushing the stream]) or there are still network events
333 // incoming even though the consumer has already gone away (cancellation).
334 // TODO(willchan): Perhaps we should separate out cancelled streams and move
335 // them into a separate ActiveStreamMap, and not deliver network events to
336 // them?
337 ActiveStreamMap active_streams_;
[email protected]e3ebba0f2010-08-05 17:59:58338 // Map of all the streams that have already started to be pushed by the
[email protected]a677f2b2009-11-22 00:43:00339 // server, but do not have consumers yet.
[email protected]e3ebba0f2010-08-05 17:59:58340 PushedStreamMap unclaimed_pushed_streams_;
[email protected]aea80602009-09-18 00:55:08341
342 // As we gather data to be sent, we put it into the output queue.
[email protected]aea80602009-09-18 00:55:08343 OutputQueue queue_;
344
[email protected]aea80602009-09-18 00:55:08345 // The packet we are currently sending.
[email protected]e1245352009-11-30 19:42:42346 bool write_pending_; // Will be true when a write is in progress.
[email protected]955fc2e72010-02-08 20:37:30347 SpdyIOBuffer in_flight_write_; // This is the write buffer in progress.
[email protected]e1245352009-11-30 19:42:42348
349 // Flag if we have a pending message scheduled for WriteSocket.
[email protected]aea80602009-09-18 00:55:08350 bool delayed_write_pending_;
[email protected]aea80602009-09-18 00:55:08351
[email protected]955fc2e72010-02-08 20:37:30352 // Flag if we're using an SSL connection for this SpdySession.
[email protected]dcc6bbb2009-12-09 19:09:01353 bool is_secure_;
354
[email protected]bdbda462010-06-28 17:30:37355 // Certificate error code when using a secure connection.
356 int certificate_error_code_;
357
[email protected]955fc2e72010-02-08 20:37:30358 // Spdy Frame state.
359 spdy::SpdyFramer spdy_framer_;
[email protected]aea80602009-09-18 00:55:08360
[email protected]60253bd2009-12-01 01:16:39361 // If an error has occurred on the session, the session is effectively
362 // dead. Record this error here. When no error has occurred, |error_| will
363 // be OK.
364 net::Error error_;
365 State state_;
366
[email protected]2bd93022010-07-17 00:58:44367 // Limits
368 size_t max_concurrent_streams_; // 0 if no limit
369
[email protected]9b010802009-12-27 22:55:30370 // Some statistics counters for the session.
371 int streams_initiated_count_;
372 int streams_pushed_count_;
373 int streams_pushed_and_claimed_count_;
[email protected]56e7c63d2010-07-12 18:42:17374 int streams_abandoned_count_;
[email protected]58cebf8f2010-07-31 19:20:16375 int frames_received_;
[email protected]0aebc002010-05-21 06:50:19376 bool sent_settings_; // Did this session send settings when it started.
377 bool received_settings_; // Did this session receive at least one settings
378 // frame.
[email protected]9b010802009-12-27 22:55:30379
[email protected]7349c6b12010-07-22 02:29:16380 // Initial send window size for the session; can be changed by an
381 // arriving SETTINGS frame; newly created streams use this value for the
382 // initial send window size.
383 int initial_send_window_size_;
[email protected]5af3c572010-07-20 14:16:27384
[email protected]450c5022010-08-26 02:38:28385 // Initial receive window size for the session; there are plans to add a
386 // command line switch that would cause a SETTINGS frame with window size
387 // announcement to be sent on startup; newly created streams will use
388 // this value for the initial receive window size.
389 int initial_recv_window_size_;
390
[email protected]635909f2010-05-12 18:19:36391 BoundNetLog net_log_;
392
[email protected]affe8fe2009-10-14 20:06:05393 static bool use_ssl_;
[email protected]7349c6b12010-07-22 02:29:16394 static bool use_flow_control_;
[email protected]aea80602009-09-18 00:55:08395};
396
397} // namespace net
398
[email protected]dab9c7d2010-02-06 21:44:32399#endif // NET_SPDY_SPDY_SESSION_H_