Chromium Code Reviews| 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 |
|
Ryan Hamilton
2013/05/26 15:33:49
What if a bidirectional stream knew (because of so
akalin
2013/05/27 08:13:35
Yeah, I think we eventually want to allow that. Fo
|
| + // 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. |