| Index: net/spdy/spdy_session.h
|
| diff --git a/net/spdy/spdy_session.h b/net/spdy/spdy_session.h
|
| index e129d572c2a4857ae941dec1d3957595ccbd32e7..b306831e6585107da81236f66e9080f7f000f738 100644
|
| --- a/net/spdy/spdy_session.h
|
| +++ b/net/spdy/spdy_session.h
|
| @@ -31,6 +31,7 @@
|
|
|
| namespace net {
|
|
|
| +class SpdyHttpStream;
|
| class SpdyStream;
|
| class HttpNetworkSession;
|
| class BoundNetLog;
|
| @@ -67,12 +68,17 @@ class SpdySession : public base::RefCounted<SpdySession>,
|
| const BoundNetLog& stream_net_log);
|
|
|
| // Create a new stream for a given |url|. Writes it out to |spdy_stream|.
|
| - // Returns a net error code.
|
| + // Returns a net error code, possibly ERR_IO_PENDING.
|
| int CreateStream(
|
| const GURL& url,
|
| RequestPriority priority,
|
| scoped_refptr<SpdyStream>* spdy_stream,
|
| - const BoundNetLog& stream_net_log);
|
| + const BoundNetLog& stream_net_log,
|
| + CompletionCallback* callback,
|
| + const SpdyHttpStream* spdy_http_stream);
|
| +
|
| + // Remove PendingCreateStream objects on transaction deletion
|
| + void CancelPendingCreateStreams(const SpdyHttpStream* trans);
|
|
|
| // Used by SpdySessionPool to initialize with a pre-existing SSL socket.
|
| // Returns OK on success, or an error on failure.
|
| @@ -128,6 +134,28 @@ class SpdySession : public base::RefCounted<SpdySession>,
|
| CLOSED
|
| };
|
|
|
| + enum { kDefaultMaxConcurrentStreams = 100 }; // TODO(mbelshe) remove this
|
| +
|
| + struct PendingCreateStream {
|
| + const GURL* url;
|
| + RequestPriority priority;
|
| + scoped_refptr<SpdyStream>* spdy_stream;
|
| + const BoundNetLog* stream_net_log;
|
| + CompletionCallback* callback;
|
| +
|
| + const SpdyHttpStream* spdy_http_stream;
|
| +
|
| + PendingCreateStream(const GURL& url, RequestPriority priority,
|
| + scoped_refptr<SpdyStream>* spdy_stream,
|
| + const BoundNetLog& stream_net_log,
|
| + CompletionCallback* callback,
|
| + const SpdyHttpStream* spdy_http_stream)
|
| + : url(&url), priority(priority), spdy_stream(spdy_stream),
|
| + stream_net_log(&stream_net_log), callback(callback),
|
| + spdy_http_stream(spdy_http_stream) { }
|
| + };
|
| + typedef std::queue<PendingCreateStream, std::list< PendingCreateStream> >
|
| + PendingCreateStreamQueue;
|
| typedef std::map<int, scoped_refptr<SpdyStream> > ActiveStreamMap;
|
| // Only HTTP push a stream.
|
| typedef std::list<scoped_refptr<SpdyStream> > ActivePushedStreamList;
|
| @@ -136,6 +164,13 @@ class SpdySession : public base::RefCounted<SpdySession>,
|
|
|
| virtual ~SpdySession();
|
|
|
| + void ProcessPendingCreateStreams();
|
| + int CreateStreamImpl(
|
| + const GURL& url,
|
| + RequestPriority priority,
|
| + scoped_refptr<SpdyStream>* spdy_stream,
|
| + const BoundNetLog& stream_net_log);
|
| +
|
| // SpdyFramerVisitorInterface
|
| virtual void OnError(spdy::SpdyFramer*);
|
| virtual void OnStreamFrameData(spdy::SpdyStreamId stream_id,
|
| @@ -161,6 +196,10 @@ class SpdySession : public base::RefCounted<SpdySession>,
|
| // Send relevant SETTINGS. This is generally called on connection setup.
|
| void SendSettings();
|
|
|
| + // Handle SETTINGS. Either when we send settings, or when we receive a
|
| + // SETTINGS ontrol frame, update our SpdySession accordingly.
|
| + void HandleSettings(const spdy::SpdySettings& settings);
|
| +
|
| // Start reading from the socket.
|
| // Returns OK on success, or an error on failure.
|
| net::Error ReadSocket();
|
| @@ -223,6 +262,10 @@ class SpdySession : public base::RefCounted<SpdySession>,
|
|
|
| int stream_hi_water_mark_; // The next stream id to use.
|
|
|
| + // Queue, for each priority, of pending Create Streams that have not
|
| + // yet been satisfied
|
| + PendingCreateStreamQueue create_stream_queues_[NUM_PRIORITIES];
|
| +
|
| // TODO(mbelshe): We need to track these stream lists better.
|
| // I suspect it is possible to remove a stream from
|
| // one list, but not the other.
|
| @@ -269,6 +312,9 @@ class SpdySession : public base::RefCounted<SpdySession>,
|
| net::Error error_;
|
| State state_;
|
|
|
| + // Limits
|
| + size_t max_concurrent_streams_; // 0 if no limit
|
| +
|
| // Some statistics counters for the session.
|
| int streams_initiated_count_;
|
| int streams_pushed_count_;
|
|
|