| Index: net/spdy/spdy_stream.h
|
| diff --git a/net/spdy/spdy_stream.h b/net/spdy/spdy_stream.h
|
| index 883e7a3d4818044a4ed18aed4ccb7e0cba388bf0..91f24006c096661ae3676be1e287ee082cf477b5 100644
|
| --- a/net/spdy/spdy_stream.h
|
| +++ b/net/spdy/spdy_stream.h
|
| @@ -21,10 +21,10 @@
|
| #include "net/base/net_log.h"
|
| #include "net/base/request_priority.h"
|
| #include "net/socket/ssl_client_socket.h"
|
| +#include "net/spdy/spdy_buffer.h"
|
| #include "net/spdy/spdy_framer.h"
|
| #include "net/spdy/spdy_header_block.h"
|
| #include "net/spdy/spdy_protocol.h"
|
| -#include "net/spdy/spdy_session.h"
|
| #include "net/ssl/server_bound_cert_service.h"
|
| #include "net/ssl/ssl_client_cert_type.h"
|
|
|
| @@ -34,6 +34,19 @@ class AddressList;
|
| class IPEndPoint;
|
| class SSLCertRequestInfo;
|
| class SSLInfo;
|
| +class SpdySession;
|
| +
|
| +enum SpdyStreamType {
|
| + // The most general type of stream; there are no restrictions on
|
| + // when data can be sent and received.
|
| + SPDY_BIDIRECTIONAL_STREAM,
|
| + // A stream where the client sends a request with possibly a body,
|
| + // and the server then sends a response with a body.
|
| + SPDY_REQUEST_RESPONSE_STREAM,
|
| + // A server-initiated stream where the server just sends a response
|
| + // with a body and the client does not send anything.
|
| + SPDY_PUSH_STREAM
|
| +};
|
|
|
| // Returned by some SpdyStream::Delegate functions to indicate whether
|
| // there's more data to send.
|
| @@ -56,32 +69,24 @@ class NET_EXPORT_PRIVATE SpdyStream {
|
| public:
|
| Delegate() {}
|
|
|
| - // Called when the request headers have been sent. Must return
|
| - // whether there's body data to send.
|
| - //
|
| - // There's some redundancy in SendRequestHeaders() taking a
|
| - // SpdySendStatus and this function returning one, but it's
|
| - // necessary. Bidirectional streams always pass in
|
| - // MORE_DATA_TO_SEND to SendRequestHeaders() but must return
|
| - // NO_MORE_DATA_TO_SEND from OnSendRequestHeadersComplete(), while
|
| - // request/response streams always return the same value from
|
| - // OnSendRequestHeadersComplete() as the one they pass into
|
| - // SendRequestHeaders().
|
| - //
|
| - // TODO(akalin): Have a less subtle way of differentiating
|
| - // request/response streams from bidirectional ones.
|
| - virtual SpdySendStatus OnSendRequestHeadersComplete() = 0;
|
| + // Called when the request headers have been sent. Never called
|
| + // for push streams.
|
| + virtual void OnSendRequestHeadersComplete() = 0;
|
|
|
| // Called when the stream is ready to send body data. The
|
| // delegate must call SendStreamData() on the stream, either
|
| // immediately or asynchronously (e.g., if the data to be send has
|
| // to be read asynchronously).
|
| //
|
| - // Called only when OnSendRequestHeadersComplete() or
|
| - // OnSendBodyComplete() returns MORE_DATA_TO_SEND.
|
| + // Called only for request/response streams when
|
| + // SendRequestHeaders() is called with MORE_DATA_TO_SEND.
|
| + //
|
| + // TODO(akalin): Unify this with OnSendRequestHeadersComplete().
|
| virtual void OnSendBody() = 0;
|
|
|
| // Called when body data has been sent.
|
| + //
|
| + // TODO(akalin): Unify this with OnDataSent().
|
| virtual void OnSendBodyComplete() = 0;
|
|
|
| // Called when the SYN_STREAM, SYN_REPLY, or HEADERS frames are received.
|
| @@ -115,12 +120,12 @@ class NET_EXPORT_PRIVATE SpdyStream {
|
| };
|
|
|
| // SpdyStream constructor
|
| - SpdyStream(SpdySession* session,
|
| + SpdyStream(SpdyStreamType type,
|
| + SpdySession* session,
|
| const std::string& path,
|
| RequestPriority priority,
|
| int32 initial_send_window_size,
|
| int32 initial_recv_window_size,
|
| - bool pushed,
|
| const BoundNetLog& net_log);
|
|
|
| ~SpdyStream();
|
| @@ -135,8 +140,7 @@ class NET_EXPORT_PRIVATE SpdyStream {
|
| // closed, and cancel it.
|
| void DetachDelegate();
|
|
|
| - // Is this stream a pushed stream from the server.
|
| - bool pushed() const { return pushed_; }
|
| + SpdyStreamType type() const { return type_; }
|
|
|
| SpdyStreamId stream_id() const { return stream_id_; }
|
| void set_stream_id(SpdyStreamId stream_id) { stream_id_ = stream_id; }
|
| @@ -144,7 +148,6 @@ class NET_EXPORT_PRIVATE SpdyStream {
|
| bool response_received() const { return response_received_; }
|
| void set_response_received() { response_received_ = true; }
|
|
|
| - // For pushed streams, we track a path to identify them.
|
| const std::string& path() const { return path_; }
|
|
|
| RequestPriority priority() const { return priority_; }
|
| @@ -241,8 +244,9 @@ class NET_EXPORT_PRIVATE SpdyStream {
|
| base::Time GetRequestTime() const;
|
| void SetRequestTime(base::Time t);
|
|
|
| - // Called by the SpdySession when a response (e.g. a SYN_STREAM or SYN_REPLY)
|
| - // has been received for this stream. Returns a status code.
|
| + // Called by the SpdySession when a response (e.g. a SYN_STREAM or
|
| + // SYN_REPLY) has been received for this stream. This is the entry
|
| + // point for a push stream. Returns a status code.
|
| int OnResponseReceived(const SpdyHeaderBlock& response);
|
|
|
| // Called by the SpdySession when late-bound headers are received for a
|
| @@ -294,19 +298,26 @@ class NET_EXPORT_PRIVATE SpdyStream {
|
| bool body_sent() const { return io_state_ > STATE_SEND_BODY_COMPLETE; }
|
|
|
| // Interface for the delegate to use.
|
| - //
|
| - // TODO(akalin): Mandate that only one send can be in flight at one
|
| - // time.
|
|
|
| - // Sends the request headers.
|
| - // For non push stream, it will send SYN_STREAM frame.
|
| + // Only one send can be in flight at a time, except for push
|
| + // streams, which must not send anything.
|
| +
|
| + // Sends the request headers. The delegate is called back via
|
| + // OnSendRequestHeadersComplete() when the request headers have
|
| + // completed sending. |send_status| must be MORE_DATA_TO_SEND for
|
| + // bidirectional streams; for request/response streams, it must be
|
| + // MORE_DATA_TO_SEND if the request has data to upload, or
|
| + // NO_MORE_DATA_TO_SEND if not.
|
| int SendRequestHeaders(scoped_ptr<SpdyHeaderBlock> headers,
|
| SpdySendStatus send_status);
|
|
|
| // Sends a DATA frame. The delegate will be notified via
|
| // OnSendBodyComplete() (if the response hasn't been received yet)
|
| // or OnDataSent() (if the response has been received) when the send
|
| - // is complete. Only one data send can be in flight at one time.
|
| + // is complete. |send_status| must be MORE_DATA_TO_SEND for
|
| + // bidirectional streams; for request/response streams, it must be
|
| + // MORE_DATA_TO_SEND if there is more data to upload, or
|
| + // NO_MORE_DATA_TO_SEND if not.
|
| void SendStreamData(IOBuffer* data, int length, SpdySendStatus send_status);
|
|
|
| // Fills SSL info in |ssl_info| and returns true when SSL is in use.
|
| @@ -409,6 +420,8 @@ class NET_EXPORT_PRIVATE SpdyStream {
|
| // |pending_send_data_| and |pending_send_flags_| are set.
|
| void QueueNextDataFrame();
|
|
|
| + const SpdyStreamType type_;
|
| +
|
| base::WeakPtrFactory<SpdyStream> weak_ptr_factory_;
|
|
|
| // Sentinel variable used to make sure we don't get destroyed by a
|
| @@ -431,7 +444,6 @@ class NET_EXPORT_PRIVATE SpdyStream {
|
| int32 recv_window_size_;
|
| int32 unacked_recv_window_bytes_;
|
|
|
| - const bool pushed_;
|
| ScopedBandwidthMetrics metrics_;
|
| bool response_received_;
|
|
|
| @@ -444,6 +456,9 @@ class NET_EXPORT_PRIVATE SpdyStream {
|
| SpdySendStatus send_status_;
|
|
|
| // The headers for the request to send.
|
| + //
|
| + // TODO(akalin): Hang onto this only until we send it. This
|
| + // necessitates stashing the URL separately.
|
| scoped_ptr<SpdyHeaderBlock> request_;
|
|
|
| // The data waiting to be sent.
|
|
|