| // Copyright (c) 2013 Google Inc. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef NET_HTTP_HTTP_STREAM_SHELL_H_ |
| #define NET_HTTP_HTTP_STREAM_SHELL_H_ |
| |
| #include <string> |
| |
| #include "base/basictypes.h" |
| #include "net/base/completion_callback.h" |
| #include "net/base/io_buffer.h" |
| #include "net/base/net_export.h" |
| #include "net/http/http_request_info.h" |
| #include "net/http/http_response_info.h" |
| #include "net/http/shell/http_stream_shell_loader.h" |
| |
| // This is a special HttpStream implementation designed to work with |
| // HttpStreamShellLoader and different HTTP libraries. Most functions |
| // have the same name as the same function in the original HttpStream |
| // and very similar functionality. However this class is NOT a sub class |
| // of HttpStream. |
| |
| namespace net { |
| |
| class ProxyInfo; |
| // Represents a single HTTP transaction (i.e., a single request/response pair). |
| // HTTP redirects are not followed and authentication challenges are not |
| // answered. Cookies are assumed to be managed by the caller. |
| class NET_EXPORT_PRIVATE HttpStreamShell { |
| public: |
| explicit HttpStreamShell(HttpStreamShellLoader* loader); |
| virtual ~HttpStreamShell(); |
| |
| // Initialize stream. Must be called before calling SendRequest(). |
| // |request_info| must outlive the HttpStream. |
| // Returns a net error code, possibly ERR_IO_PENDING. |
| int InitializeStream(const HttpRequestInfo* request_info, |
| const BoundNetLog& net_log, |
| const CompletionCallback& callback); |
| |
| // Writes the headers and uploads body data to the underlying loader. |
| // ERR_IO_PENDING is returned if the operation could not be completed |
| // synchronously, in which case the result will be passed to the callback |
| // when available. Returns OK on success. |
| // |response| must outlive the HttpStream. |
| int SendRequest(const HttpRequestHeaders& request_headers, |
| HttpResponseInfo* response, |
| const CompletionCallback& callback); |
| |
| // Reads from the underlying loader until the response headers have been |
| // completely received. ERR_IO_PENDING is returned if the operation could |
| // not be completed synchronously, in which case the result will be passed |
| // to the callback when available. Returns OK on success. The response |
| // headers are available in the HttpResponseInfo returned by GetResponseInfo |
| int ReadResponseHeaders(const CompletionCallback& callback); |
| |
| |
| // Provides access to HttpResponseInfo. |
| const HttpResponseInfo* GetResponseInfo() const; |
| |
| // Reads response body data, up to |buf_len| bytes. |buf_len| should be a |
| // reasonable size (<2MB). The number of bytes read is returned, or an |
| // error is returned upon failure. 0 indicates that the request has been |
| // fully satisfied and there is no more data to read. |
| // ERR_CONNECTION_CLOSED is returned when the connection has been closed |
| // prematurely. ERR_IO_PENDING is returned if the operation could not be |
| // completed synchronously, in which case the result will be passed to the |
| // callback when available. If the operation is not completed immediately, |
| // the loader acquires a reference to the provided buffer until the callback |
| // is invoked or the loader is destroyed. |
| int ReadResponseBody(IOBuffer* buf, int buf_len, |
| const CompletionCallback& callback); |
| |
| // Closes the stream. |
| // |not_reusable| indicates if the stream can be used for further requests. |
| // In the case of HTTP, where we re-use the byte-stream (e.g. the connection) |
| // this means we need to close the connection. |
| void Close(bool not_reusable); |
| |
| // Indicates if the response body has been completely read. |
| bool IsResponseBodyComplete() const; |
| |
| // Set proxy information |
| void SetProxy(const ProxyInfo* info); |
| |
| // Get underlying stream loader. |
| HttpStreamShellLoader* GetStreamLoader() const { return loader_.get(); } |
| |
| protected: |
| scoped_refptr<HttpStreamShellLoader> loader_; |
| |
| std::string request_line_; |
| const HttpRequestInfo* request_info_; |
| const HttpResponseInfo* response_; |
| }; |
| |
| } // namespace net |
| |
| #endif // NET_HTTP_HTTP_STREAM_SHELL_H_ |