James Robinson | 646469d | 2014-10-03 15:33:28 -0700 | [diff] [blame] | 1 | // Copyright (c) 2011 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_HTTP_HTTP_TRANSACTION_H_ |
| 6 | #define NET_HTTP_HTTP_TRANSACTION_H_ |
| 7 | |
| 8 | #include "net/base/completion_callback.h" |
| 9 | #include "net/base/load_states.h" |
| 10 | #include "net/base/net_export.h" |
| 11 | #include "net/base/request_priority.h" |
| 12 | #include "net/base/upload_progress.h" |
| 13 | #include "net/websockets/websocket_handshake_stream_base.h" |
| 14 | |
| 15 | namespace net { |
| 16 | |
| 17 | class AuthCredentials; |
| 18 | class BoundNetLog; |
| 19 | class HttpRequestHeaders; |
| 20 | struct HttpRequestInfo; |
| 21 | class HttpResponseInfo; |
| 22 | class IOBuffer; |
| 23 | struct LoadTimingInfo; |
| 24 | class ProxyInfo; |
| 25 | class QuicServerInfo; |
| 26 | class X509Certificate; |
| 27 | |
| 28 | // Represents a single HTTP transaction (i.e., a single request/response pair). |
| 29 | // HTTP redirects are not followed and authentication challenges are not |
| 30 | // answered. Cookies are assumed to be managed by the caller. |
| 31 | class NET_EXPORT_PRIVATE HttpTransaction { |
| 32 | public: |
| 33 | // If |*defer| is set to true, the transaction will wait until |
| 34 | // ResumeNetworkStart is called before establishing a connection. |
| 35 | typedef base::Callback<void(bool* defer)> BeforeNetworkStartCallback; |
| 36 | |
| 37 | // Provides an opportunity to add proxy-specific request headers. Called after |
| 38 | // it is determined that a proxy is being used and before the request headers |
| 39 | // are sent. |proxy_info| contains information about the proxy being used, |
| 40 | // and additional headers may be added to |request_headers|. |
| 41 | typedef base::Callback<void( |
| 42 | const ProxyInfo& proxy_info, |
| 43 | HttpRequestHeaders* request_headers)> BeforeProxyHeadersSentCallback; |
| 44 | |
| 45 | // Stops any pending IO and destroys the transaction object. |
| 46 | virtual ~HttpTransaction() {} |
| 47 | |
| 48 | // Starts the HTTP transaction (i.e., sends the HTTP request). |
| 49 | // |
| 50 | // Returns OK if the transaction could be started synchronously, which means |
| 51 | // that the request was served from the cache. ERR_IO_PENDING is returned to |
| 52 | // indicate that the CompletionCallback will be notified once response info is |
| 53 | // available or if an IO error occurs. Any other return value indicates that |
| 54 | // the transaction could not be started. |
| 55 | // |
| 56 | // Regardless of the return value, the caller is expected to keep the |
| 57 | // request_info object alive until Destroy is called on the transaction. |
| 58 | // |
| 59 | // NOTE: The transaction is not responsible for deleting the callback object. |
| 60 | // |
| 61 | // Profiling information for the request is saved to |net_log| if non-NULL. |
| 62 | virtual int Start(const HttpRequestInfo* request_info, |
| 63 | const CompletionCallback& callback, |
| 64 | const BoundNetLog& net_log) = 0; |
| 65 | |
| 66 | // Restarts the HTTP transaction, ignoring the last error. This call can |
| 67 | // only be made after a call to Start (or RestartIgnoringLastError) failed. |
| 68 | // Once Read has been called, this method cannot be called. This method is |
| 69 | // used, for example, to continue past various SSL related errors. |
| 70 | // |
| 71 | // Not all errors can be ignored using this method. See error code |
| 72 | // descriptions for details about errors that can be ignored. |
| 73 | // |
| 74 | // NOTE: The transaction is not responsible for deleting the callback object. |
| 75 | // |
| 76 | virtual int RestartIgnoringLastError(const CompletionCallback& callback) = 0; |
| 77 | |
| 78 | // Restarts the HTTP transaction with a client certificate. |
| 79 | virtual int RestartWithCertificate(X509Certificate* client_cert, |
| 80 | const CompletionCallback& callback) = 0; |
| 81 | |
| 82 | // Restarts the HTTP transaction with authentication credentials. |
| 83 | virtual int RestartWithAuth(const AuthCredentials& credentials, |
| 84 | const CompletionCallback& callback) = 0; |
| 85 | |
| 86 | // Returns true if auth is ready to be continued. Callers should check |
| 87 | // this value anytime Start() completes: if it is true, the transaction |
| 88 | // can be resumed with RestartWithAuth(L"", L"", callback) to resume |
| 89 | // the automatic auth exchange. This notification gives the caller a |
| 90 | // chance to process the response headers from all of the intermediate |
| 91 | // restarts needed for authentication. |
| 92 | virtual bool IsReadyToRestartForAuth() = 0; |
| 93 | |
| 94 | // Once response info is available for the transaction, response data may be |
| 95 | // read by calling this method. |
| 96 | // |
| 97 | // Response data is copied into the given buffer and the number of bytes |
| 98 | // copied is returned. ERR_IO_PENDING is returned if response data is not |
| 99 | // yet available. The CompletionCallback is notified when the data copy |
| 100 | // completes, and it is passed the number of bytes that were successfully |
| 101 | // copied. Or, if a read error occurs, the CompletionCallback is notified of |
| 102 | // the error. Any other negative return value indicates that the transaction |
| 103 | // could not be read. |
| 104 | // |
| 105 | // NOTE: The transaction is not responsible for deleting the callback object. |
| 106 | // If the operation is not completed immediately, the transaction must acquire |
| 107 | // a reference to the provided buffer. |
| 108 | // |
| 109 | virtual int Read(IOBuffer* buf, int buf_len, |
| 110 | const CompletionCallback& callback) = 0; |
| 111 | |
| 112 | // Stops further caching of this request by the HTTP cache, if there is any. |
| 113 | virtual void StopCaching() = 0; |
| 114 | |
| 115 | // Gets the full request headers sent to the server. This is guaranteed to |
| 116 | // work only if Start returns success and the underlying transaction supports |
| 117 | // it. (Right now, this is only network transactions, not cache ones.) |
| 118 | // |
| 119 | // Returns true and overwrites headers if it can get the request headers; |
| 120 | // otherwise, returns false and does not modify headers. |
| 121 | virtual bool GetFullRequestHeaders(HttpRequestHeaders* headers) const = 0; |
| 122 | |
| 123 | // Get the number of bytes received from network. |
| 124 | virtual int64 GetTotalReceivedBytes() const = 0; |
| 125 | |
| 126 | // Called to tell the transaction that we have successfully reached the end |
| 127 | // of the stream. This is equivalent to performing an extra Read() at the end |
| 128 | // that should return 0 bytes. This method should not be called if the |
| 129 | // transaction is busy processing a previous operation (like a pending Read). |
| 130 | // |
| 131 | // DoneReading may also be called before the first Read() to notify that the |
| 132 | // entire response body is to be ignored (e.g., in a redirect). |
| 133 | virtual void DoneReading() = 0; |
| 134 | |
| 135 | // Returns the response info for this transaction or NULL if the response |
| 136 | // info is not available. |
| 137 | virtual const HttpResponseInfo* GetResponseInfo() const = 0; |
| 138 | |
| 139 | // Returns the load state for this transaction. |
| 140 | virtual LoadState GetLoadState() const = 0; |
| 141 | |
| 142 | // Returns the upload progress in bytes. If there is no upload data, |
| 143 | // zero will be returned. This does not include the request headers. |
| 144 | virtual UploadProgress GetUploadProgress() const = 0; |
| 145 | |
| 146 | // SetQuicServerInfo sets a object which reads and writes public information |
| 147 | // about a QUIC server. |
| 148 | virtual void SetQuicServerInfo(QuicServerInfo* quic_server_info) = 0; |
| 149 | |
| 150 | // Populates all of load timing, except for request start times and receive |
| 151 | // headers time. |
| 152 | // |load_timing_info| must have all null times when called. Returns false and |
| 153 | // does not modify |load_timing_info| if there's no timing information to |
| 154 | // provide. |
| 155 | virtual bool GetLoadTimingInfo(LoadTimingInfo* load_timing_info) const = 0; |
| 156 | |
| 157 | // Called when the priority of the parent job changes. |
| 158 | virtual void SetPriority(RequestPriority priority) = 0; |
| 159 | |
| 160 | // Set the WebSocketHandshakeStreamBase::CreateHelper to be used for the |
| 161 | // request. Only relevant to WebSocket transactions. Must be called before |
| 162 | // Start(). Ownership of |create_helper| remains with the caller. |
| 163 | virtual void SetWebSocketHandshakeStreamCreateHelper( |
| 164 | WebSocketHandshakeStreamBase::CreateHelper* create_helper) = 0; |
| 165 | |
| 166 | // Set the callback to receive notification just before network use. |
| 167 | virtual void SetBeforeNetworkStartCallback( |
| 168 | const BeforeNetworkStartCallback& callback) = 0; |
| 169 | |
| 170 | // Set the callback to receive notification just before a proxy request |
| 171 | // is to be sent. |
| 172 | virtual void SetBeforeProxyHeadersSentCallback( |
| 173 | const BeforeProxyHeadersSentCallback& callback) = 0; |
| 174 | |
| 175 | // Resumes the transaction after being deferred. |
| 176 | virtual int ResumeNetworkStart() = 0; |
| 177 | }; |
| 178 | |
| 179 | } // namespace net |
| 180 | |
| 181 | #endif // NET_HTTP_HTTP_TRANSACTION_H_ |