Index: net/quic/chromium/quic_chromium_client_stream.h |
diff --git a/net/quic/chromium/quic_chromium_client_stream.h b/net/quic/chromium/quic_chromium_client_stream.h |
index d65f2e5abfa03bff1adafde1761faff54b89e0e0..e8d05e96ba88735e189821e65d50ed7db657cef2 100644 |
--- a/net/quic/chromium/quic_chromium_client_stream.h |
+++ b/net/quic/chromium/quic_chromium_client_stream.h |
@@ -32,6 +32,8 @@ class QuicClientSessionBase; |
// are owned by the QuicClientSession which created them. |
class NET_EXPORT_PRIVATE QuicChromiumClientStream : public QuicSpdyStream { |
public: |
+ // TODO(rch): Remove this class completely in favor of async methods |
+ // on the Handle. |
// Delegate handles protocol specific behavior of a quic stream. |
class NET_EXPORT_PRIVATE Delegate { |
public: |
@@ -61,6 +63,114 @@ class NET_EXPORT_PRIVATE QuicChromiumClientStream : public QuicSpdyStream { |
DISALLOW_COPY_AND_ASSIGN(Delegate); |
}; |
+ // Wrapper for interacting with the session in a restricted fashion. |
+ class NET_EXPORT_PRIVATE Handle { |
+ public: |
+ ~Handle(); |
+ |
+ // Returns true if the stream is still connected. |
+ bool IsOpen() { return stream_ != nullptr; } |
+ |
+ // Writes |header_block| to the peer. Closes the write side if |fin| is |
+ // true. If non-null, |ack_notifier_delegate| will be notified when the |
+ // headers are ACK'd by the peer. |
+ size_t WriteHeaders(SpdyHeaderBlock header_block, |
+ bool fin, |
+ QuicReferenceCountedPointer<QuicAckListenerInterface> |
+ ack_notifier_delegate); |
+ |
+ // Writes |data| to the peer. Closes the write side if |fin| is true. |
+ // If the data could not be written immediately, returns ERR_IO_PENDING |
+ // and invokes |callback| asynchronously when the write completes. |
+ int WriteStreamData(base::StringPiece data, |
+ bool fin, |
+ const CompletionCallback& callback); |
+ |
+ // Same as WriteStreamData except it writes data from a vector of IOBuffers, |
+ // with the length of each buffer at the corresponding index in |lengths|. |
+ int WritevStreamData(const std::vector<scoped_refptr<IOBuffer>>& buffers, |
+ const std::vector<int>& lengths, |
+ bool fin, |
+ const CompletionCallback& callback); |
+ |
+ // Reads at most |buf_len| bytes into |buf|. Returns the number of bytes |
+ // read. |
+ int Read(IOBuffer* buf, int buf_len); |
+ |
+ // Called to notify the stream when the final incoming data is read. |
+ void OnFinRead(); |
+ |
+ // Prevents the connection from migrating to a new network while this |
+ // stream is open. |
+ void DisableConnectionMigration(); |
+ |
+ // Sets the priority of the stream to |priority|. |
+ void SetPriority(SpdyPriority priority); |
+ |
+ // Sends a RST_STREAM frame to the peer and closes the streams. |
+ void Reset(QuicRstStreamErrorCode error_code); |
+ |
+ // Clears |delegate_| from this Handle, but does not disconnect the Handle |
+ // from |stream_|. |
+ void ClearDelegate(); |
+ |
+ QuicStreamId id() const; |
+ QuicErrorCode connection_error() const; |
+ QuicRstStreamErrorCode stream_error() const; |
+ bool fin_sent() const; |
+ bool fin_received() const; |
+ uint64_t stream_bytes_read() const; |
+ uint64_t stream_bytes_written() const; |
+ size_t NumBytesConsumed() const; |
+ bool IsDoneReading() const; |
+ bool IsFirstStream() const; |
+ |
+ // TODO(rch): Move these test-only methods to a peer, or else remove. |
+ void OnPromiseHeaderList(QuicStreamId promised_id, |
+ size_t frame_len, |
+ const QuicHeaderList& header_list); |
+ SpdyPriority priority() const; |
+ bool can_migrate(); |
+ |
+ Delegate* GetDelegate(); |
+ |
+ private: |
+ friend class QuicChromiumClientStream; |
+ |
+ // Constucts a new Handle for |stream| with |delegate| set to receive |
+ // up calls on various events. |
+ Handle(QuicChromiumClientStream* stream, Delegate* delegate); |
+ |
+ // Methods invoked by the stream. |
+ void OnInitialHeadersAvailable(const SpdyHeaderBlock& headers, |
+ size_t frame_len); |
+ void OnTrailingHeadersAvailable(const SpdyHeaderBlock& headers, |
+ size_t frame_len); |
+ void OnDataAvailable(); |
+ void OnClose(); |
+ void OnError(int error); |
+ |
+ // Saves various fields from the stream before the stream goes away. |
+ void SaveState(); |
+ |
+ QuicChromiumClientStream* stream_; // Unowned. |
+ Delegate* delegate_; // Owns this. |
+ |
+ QuicStreamId id_; |
+ QuicErrorCode connection_error_; |
+ QuicRstStreamErrorCode stream_error_; |
+ bool fin_sent_; |
+ bool fin_received_; |
+ uint64_t stream_bytes_read_; |
+ uint64_t stream_bytes_written_; |
+ bool is_done_reading_; |
+ bool is_first_stream_; |
+ size_t num_bytes_consumed_; |
+ SpdyPriority priority_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(Handle); |
+ }; |
+ |
QuicChromiumClientStream(QuicStreamId id, |
QuicClientSessionBase* session, |
const NetLogWithSource& net_log); |
@@ -99,11 +209,15 @@ class NET_EXPORT_PRIVATE QuicChromiumClientStream : public QuicSpdyStream { |
const std::vector<int>& lengths, |
bool fin, |
const CompletionCallback& callback); |
- // Set new |delegate|. |delegate| must not be NULL. |
- // If this stream has already received data, OnDataReceived() will be |
- // called on the delegate. |
- void SetDelegate(Delegate* delegate); |
- Delegate* GetDelegate() { return delegate_; } |
+ |
+ // Creates a new Handle for this stream and sets |delegate| on the handle. |
+ // Must only be called once. |
+ std::unique_ptr<QuicChromiumClientStream::Handle> CreateHandle( |
+ QuicChromiumClientStream::Delegate* delegate); |
+ |
+ // Clears |handle_| from this stream. |
+ void ClearHandle(); |
+ |
void OnError(int error); |
// Reads at most |buf_len| bytes into |buf|. Returns the number of bytes read. |
@@ -124,19 +238,19 @@ class NET_EXPORT_PRIVATE QuicChromiumClientStream : public QuicSpdyStream { |
using QuicStream::sequencer; |
private: |
- void NotifyDelegateOfInitialHeadersAvailableLater(SpdyHeaderBlock headers, |
- size_t frame_len); |
- void NotifyDelegateOfInitialHeadersAvailable(SpdyHeaderBlock headers, |
- size_t frame_len); |
- void NotifyDelegateOfTrailingHeadersAvailableLater(SpdyHeaderBlock headers, |
- size_t frame_len); |
- void NotifyDelegateOfTrailingHeadersAvailable(SpdyHeaderBlock headers, |
- size_t frame_len); |
- void NotifyDelegateOfDataAvailableLater(); |
- void NotifyDelegateOfDataAvailable(); |
+ void NotifyHandleOfInitialHeadersAvailableLater(SpdyHeaderBlock headers, |
+ size_t frame_len); |
+ void NotifyHandleOfInitialHeadersAvailable(SpdyHeaderBlock headers, |
+ size_t frame_len); |
+ void NotifyHandleOfTrailingHeadersAvailableLater(SpdyHeaderBlock headers, |
+ size_t frame_len); |
+ void NotifyHandleOfTrailingHeadersAvailable(SpdyHeaderBlock headers, |
+ size_t frame_len); |
+ void NotifyHandleOfDataAvailableLater(); |
+ void NotifyHandleOfDataAvailable(); |
NetLogWithSource net_log_; |
- Delegate* delegate_; |
+ Handle* handle_; |
bool headers_delivered_; |