| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #ifndef NET_QUIC_QUIC_HTTP_STREAM_H_ | |
| 6 #define NET_QUIC_QUIC_HTTP_STREAM_H_ | |
| 7 | |
| 8 #include <list> | |
| 9 | |
| 10 #include "base/memory/weak_ptr.h" | |
| 11 #include "net/base/io_buffer.h" | |
| 12 #include "net/http/http_stream.h" | |
| 13 #include "net/quic/quic_client_session.h" | |
| 14 #include "net/quic/quic_reliable_client_stream.h" | |
| 15 | |
| 16 namespace net { | |
| 17 | |
| 18 namespace test { | |
| 19 class QuicHttpStreamPeer; | |
| 20 } // namespace test | |
| 21 | |
| 22 // The QuicHttpStream is a QUIC-specific HttpStream subclass. It holds a | |
| 23 // non-owning pointer to a QuicReliableClientStream which it uses to | |
| 24 // send and receive data. | |
| 25 class NET_EXPORT_PRIVATE QuicHttpStream : | |
| 26 public QuicClientSession::Observer, | |
| 27 public QuicReliableClientStream::Delegate, | |
| 28 public HttpStream { | |
| 29 public: | |
| 30 explicit QuicHttpStream(const base::WeakPtr<QuicClientSession>& session); | |
| 31 | |
| 32 ~QuicHttpStream() override; | |
| 33 | |
| 34 // HttpStream implementation. | |
| 35 int InitializeStream(const HttpRequestInfo* request_info, | |
| 36 RequestPriority priority, | |
| 37 const BoundNetLog& net_log, | |
| 38 const CompletionCallback& callback) override; | |
| 39 int SendRequest(const HttpRequestHeaders& request_headers, | |
| 40 HttpResponseInfo* response, | |
| 41 const CompletionCallback& callback) override; | |
| 42 UploadProgress GetUploadProgress() const override; | |
| 43 int ReadResponseHeaders(const CompletionCallback& callback) override; | |
| 44 int ReadResponseBody(IOBuffer* buf, | |
| 45 int buf_len, | |
| 46 const CompletionCallback& callback) override; | |
| 47 void Close(bool not_reusable) override; | |
| 48 HttpStream* RenewStreamForAuth() override; | |
| 49 bool IsResponseBodyComplete() const override; | |
| 50 bool CanFindEndOfResponse() const override; | |
| 51 bool IsConnectionReused() const override; | |
| 52 void SetConnectionReused() override; | |
| 53 bool IsConnectionReusable() const override; | |
| 54 int64 GetTotalReceivedBytes() const override; | |
| 55 bool GetLoadTimingInfo(LoadTimingInfo* load_timing_info) const override; | |
| 56 void GetSSLInfo(SSLInfo* ssl_info) override; | |
| 57 void GetSSLCertRequestInfo(SSLCertRequestInfo* cert_request_info) override; | |
| 58 bool IsSpdyHttpStream() const override; | |
| 59 void Drain(HttpNetworkSession* session) override; | |
| 60 void SetPriority(RequestPriority priority) override; | |
| 61 | |
| 62 // QuicReliableClientStream::Delegate implementation | |
| 63 int OnDataReceived(const char* data, int length) override; | |
| 64 void OnClose(QuicErrorCode error) override; | |
| 65 void OnError(int error) override; | |
| 66 bool HasSendHeadersComplete() override; | |
| 67 | |
| 68 // QuicClientSession::Observer implementation | |
| 69 void OnCryptoHandshakeConfirmed() override; | |
| 70 void OnSessionClosed(int error) override; | |
| 71 | |
| 72 private: | |
| 73 friend class test::QuicHttpStreamPeer; | |
| 74 | |
| 75 enum State { | |
| 76 STATE_NONE, | |
| 77 STATE_SEND_HEADERS, | |
| 78 STATE_SEND_HEADERS_COMPLETE, | |
| 79 STATE_READ_REQUEST_BODY, | |
| 80 STATE_READ_REQUEST_BODY_COMPLETE, | |
| 81 STATE_SEND_BODY, | |
| 82 STATE_SEND_BODY_COMPLETE, | |
| 83 STATE_OPEN, | |
| 84 }; | |
| 85 | |
| 86 void OnStreamReady(int rv); | |
| 87 void OnIOComplete(int rv); | |
| 88 void DoCallback(int rv); | |
| 89 | |
| 90 int DoLoop(int); | |
| 91 int DoSendHeaders(); | |
| 92 int DoSendHeadersComplete(int rv); | |
| 93 int DoReadRequestBody(); | |
| 94 int DoReadRequestBodyComplete(int rv); | |
| 95 int DoSendBody(); | |
| 96 int DoSendBodyComplete(int rv); | |
| 97 int DoReadResponseHeaders(); | |
| 98 int DoReadResponseHeadersComplete(int rv); | |
| 99 | |
| 100 int ParseResponseHeaders(); | |
| 101 | |
| 102 void BufferResponseBody(const char* data, int length); | |
| 103 | |
| 104 State next_state_; | |
| 105 | |
| 106 base::WeakPtr<QuicClientSession> session_; | |
| 107 int session_error_; // Error code from the connection shutdown. | |
| 108 bool was_handshake_confirmed_; // True if the crypto handshake succeeded. | |
| 109 QuicClientSession::StreamRequest stream_request_; | |
| 110 QuicReliableClientStream* stream_; // Non-owning. | |
| 111 | |
| 112 // The following three fields are all owned by the caller and must | |
| 113 // outlive this object, according to the HttpStream contract. | |
| 114 | |
| 115 // The request to send. | |
| 116 const HttpRequestInfo* request_info_; | |
| 117 // The request body to send, if any, owned by the caller. | |
| 118 UploadDataStream* request_body_stream_; | |
| 119 // Time the request was issued. | |
| 120 base::Time request_time_; | |
| 121 // The priority of the request. | |
| 122 RequestPriority priority_; | |
| 123 // |response_info_| is the HTTP response data object which is filled in | |
| 124 // when a the response headers are read. It is not owned by this stream. | |
| 125 HttpResponseInfo* response_info_; | |
| 126 // Because response data is buffered, also buffer the response status if the | |
| 127 // stream is explicitly closed via OnError or OnClose with an error. | |
| 128 // Once all buffered data has been returned, this will be used as the final | |
| 129 // response. | |
| 130 int response_status_; | |
| 131 | |
| 132 // Serialized request headers. | |
| 133 SpdyHeaderBlock request_headers_; | |
| 134 | |
| 135 bool response_headers_received_; | |
| 136 | |
| 137 // Serialized HTTP request. | |
| 138 std::string request_; | |
| 139 | |
| 140 // Buffer into which response header data is read. | |
| 141 scoped_refptr<GrowableIOBuffer> read_buf_; | |
| 142 | |
| 143 // We buffer the response body as it arrives asynchronously from the stream. | |
| 144 // TODO(rch): This is infinite buffering, which is bad. | |
| 145 std::list<scoped_refptr<IOBufferWithSize> > response_body_; | |
| 146 | |
| 147 // Number of bytes received when the stream was closed. | |
| 148 int64 closed_stream_received_bytes_; | |
| 149 | |
| 150 // The caller's callback to be used for asynchronous operations. | |
| 151 CompletionCallback callback_; | |
| 152 | |
| 153 // Caller provided buffer for the ReadResponseBody() response. | |
| 154 scoped_refptr<IOBuffer> user_buffer_; | |
| 155 int user_buffer_len_; | |
| 156 | |
| 157 // Temporary buffer used to read the request body from UploadDataStream. | |
| 158 scoped_refptr<IOBufferWithSize> raw_request_body_buf_; | |
| 159 // Wraps raw_request_body_buf_ to read the remaining data progressively. | |
| 160 scoped_refptr<DrainableIOBuffer> request_body_buf_; | |
| 161 | |
| 162 BoundNetLog stream_net_log_; | |
| 163 | |
| 164 base::WeakPtrFactory<QuicHttpStream> weak_factory_; | |
| 165 | |
| 166 DISALLOW_COPY_AND_ASSIGN(QuicHttpStream); | |
| 167 }; | |
| 168 | |
| 169 } // namespace net | |
| 170 | |
| 171 #endif // NET_QUIC_QUIC_HTTP_STREAM_H_ | |
| OLD | NEW |