[email protected] | 448d4ca5 | 2012-03-04 04:12:23 | [diff] [blame] | 1 | // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
license.bot | bf09a50 | 2008-08-24 00:55:55 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 4 | |
| 5 | #ifndef NET_HTTP_HTTP_NETWORK_TRANSACTION_H_ |
| 6 | #define NET_HTTP_HTTP_NETWORK_TRANSACTION_H_ |
| 7 | |
sclittle | fb24989 | 2015-09-10 21:33:22 | [diff] [blame] | 8 | #include <stdint.h> |
| 9 | |
danakj | 1fd259a0 | 2016-04-16 03:17:09 | [diff] [blame] | 10 | #include <memory> |
[email protected] | 96d570e4 | 2008-08-05 22:43:04 | [diff] [blame] | 11 | #include <string> |
| 12 | |
[email protected] | 8822f38 | 2010-07-30 21:49:03 | [diff] [blame] | 13 | #include "base/gtest_prod_util.h" |
Avi Drissman | 13fc893 | 2015-12-20 04:40:46 | [diff] [blame] | 14 | #include "base/macros.h" |
[email protected] | 3b63f8f4 | 2011-03-28 01:54:15 | [diff] [blame] | 15 | #include "base/memory/ref_counted.h" |
[email protected] | 66e96c4 | 2013-06-28 15:20:31 | [diff] [blame] | 16 | #include "base/time/time.h" |
nharper | b7441ef | 2016-01-25 23:54:14 | [diff] [blame] | 17 | #include "crypto/ec_private_key.h" |
zhongyi | 48704c18 | 2015-12-07 07:52:02 | [diff] [blame] | 18 | #include "net/base/net_error_details.h" |
bnc | 81c46c1f | 2016-10-04 16:25:59 | [diff] [blame^] | 19 | #include "net/base/net_export.h" |
[email protected] | 8e6441ca | 2010-08-19 05:56:38 | [diff] [blame] | 20 | #include "net/base/request_priority.h" |
[email protected] | c3b35c2 | 2008-09-27 03:19:42 | [diff] [blame] | 21 | #include "net/http/http_auth.h" |
[email protected] | b94f92d | 2010-10-27 16:45:20 | [diff] [blame] | 22 | #include "net/http/http_request_headers.h" |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 23 | #include "net/http/http_response_info.h" |
[email protected] | 102e27c | 2011-02-23 01:01:31 | [diff] [blame] | 24 | #include "net/http/http_stream_factory.h" |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 25 | #include "net/http/http_transaction.h" |
mikecirone | f22f981 | 2016-10-04 03:40:19 | [diff] [blame] | 26 | #include "net/log/net_log_with_source.h" |
[email protected] | 928fb58 | 2008-08-11 15:40:23 | [diff] [blame] | 27 | #include "net/proxy/proxy_service.h" |
ttuttle | 1f2d7e9 | 2015-04-28 16:17:47 | [diff] [blame] | 28 | #include "net/socket/connection_attempts.h" |
nharper | b7441ef | 2016-01-25 23:54:14 | [diff] [blame] | 29 | #include "net/ssl/channel_id_service.h" |
[email protected] | 536fd0b | 2013-03-14 17:41:57 | [diff] [blame] | 30 | #include "net/ssl/ssl_config_service.h" |
[email protected] | 831e4a3 | 2013-11-14 02:14:44 | [diff] [blame] | 31 | #include "net/websockets/websocket_handshake_stream_base.h" |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 32 | |
nharper | b7441ef | 2016-01-25 23:54:14 | [diff] [blame] | 33 | namespace crypto { |
| 34 | class ECPrivateKey; |
| 35 | } |
| 36 | |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 37 | namespace net { |
| 38 | |
xunjieli | 5749218c | 2016-03-22 16:43:06 | [diff] [blame] | 39 | class BidirectionalStreamImpl; |
[email protected] | 3732cea | 2013-06-21 06:50:50 | [diff] [blame] | 40 | class ClientSocketHandle; |
[email protected] | 8e6441ca | 2010-08-19 05:56:38 | [diff] [blame] | 41 | class HttpAuthController; |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 42 | class HttpNetworkSession; |
yhirano | a7e05bb | 2014-11-06 05:40:39 | [diff] [blame] | 43 | class HttpStream; |
[email protected] | 4d4a516 | 2010-09-21 22:44:04 | [diff] [blame] | 44 | class HttpStreamRequest; |
[email protected] | 8e6441ca | 2010-08-19 05:56:38 | [diff] [blame] | 45 | class IOBuffer; |
[email protected] | 597a1ab | 2014-06-26 08:12:27 | [diff] [blame] | 46 | class ProxyInfo; |
[email protected] | 3732cea | 2013-06-21 06:50:50 | [diff] [blame] | 47 | class SpdySession; |
svaldez | 7872fd0 | 2015-11-19 21:10:54 | [diff] [blame] | 48 | class SSLPrivateKey; |
[email protected] | 82918cc | 2010-08-25 17:24:50 | [diff] [blame] | 49 | struct HttpRequestInfo; |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 50 | |
[email protected] | 172da1b | 2011-08-12 15:52:26 | [diff] [blame] | 51 | class NET_EXPORT_PRIVATE HttpNetworkTransaction |
| 52 | : public HttpTransaction, |
| 53 | public HttpStreamRequest::Delegate { |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 54 | public: |
[email protected] | 262eec8 | 2013-03-19 21:01:36 | [diff] [blame] | 55 | HttpNetworkTransaction(RequestPriority priority, |
| 56 | HttpNetworkSession* session); |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 57 | |
dcheng | b03027d | 2014-10-21 12:00:20 | [diff] [blame] | 58 | ~HttpNetworkTransaction() override; |
[email protected] | af4876d | 2008-10-21 23:10:57 | [diff] [blame] | 59 | |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 60 | // HttpTransaction methods: |
dcheng | b03027d | 2014-10-21 12:00:20 | [diff] [blame] | 61 | int Start(const HttpRequestInfo* request_info, |
| 62 | const CompletionCallback& callback, |
tfarina | 4283411 | 2016-09-22 13:38:20 | [diff] [blame] | 63 | const NetLogWithSource& net_log) override; |
dcheng | b03027d | 2014-10-21 12:00:20 | [diff] [blame] | 64 | int RestartIgnoringLastError(const CompletionCallback& callback) override; |
| 65 | int RestartWithCertificate(X509Certificate* client_cert, |
svaldez | 7872fd0 | 2015-11-19 21:10:54 | [diff] [blame] | 66 | SSLPrivateKey* client_private_key, |
dcheng | b03027d | 2014-10-21 12:00:20 | [diff] [blame] | 67 | const CompletionCallback& callback) override; |
| 68 | int RestartWithAuth(const AuthCredentials& credentials, |
| 69 | const CompletionCallback& callback) override; |
| 70 | bool IsReadyToRestartForAuth() override; |
[email protected] | 0757e770 | 2009-03-27 04:00:22 | [diff] [blame] | 71 | |
dcheng | b03027d | 2014-10-21 12:00:20 | [diff] [blame] | 72 | int Read(IOBuffer* buf, |
| 73 | int buf_len, |
| 74 | const CompletionCallback& callback) override; |
| 75 | void StopCaching() override; |
| 76 | bool GetFullRequestHeaders(HttpRequestHeaders* headers) const override; |
sclittle | 4de1bab9 | 2015-09-22 21:28:24 | [diff] [blame] | 77 | int64_t GetTotalReceivedBytes() const override; |
sclittle | fb24989 | 2015-09-10 21:33:22 | [diff] [blame] | 78 | int64_t GetTotalSentBytes() const override; |
dcheng | b03027d | 2014-10-21 12:00:20 | [diff] [blame] | 79 | void DoneReading() override; |
| 80 | const HttpResponseInfo* GetResponseInfo() const override; |
| 81 | LoadState GetLoadState() const override; |
dcheng | b03027d | 2014-10-21 12:00:20 | [diff] [blame] | 82 | void SetQuicServerInfo(QuicServerInfo* quic_server_info) override; |
| 83 | bool GetLoadTimingInfo(LoadTimingInfo* load_timing_info) const override; |
ttuttle | d9dbc65 | 2015-09-29 20:00:59 | [diff] [blame] | 84 | bool GetRemoteEndpoint(IPEndPoint* endpoint) const override; |
zhongyi | 48704c18 | 2015-12-07 07:52:02 | [diff] [blame] | 85 | void PopulateNetErrorDetails(NetErrorDetails* details) const override; |
dcheng | b03027d | 2014-10-21 12:00:20 | [diff] [blame] | 86 | void SetPriority(RequestPriority priority) override; |
| 87 | void SetWebSocketHandshakeStreamCreateHelper( |
mostynb | ba063d603 | 2014-10-09 11:01:13 | [diff] [blame] | 88 | WebSocketHandshakeStreamBase::CreateHelper* create_helper) override; |
dcheng | b03027d | 2014-10-21 12:00:20 | [diff] [blame] | 89 | void SetBeforeNetworkStartCallback( |
mostynb | ba063d603 | 2014-10-09 11:01:13 | [diff] [blame] | 90 | const BeforeNetworkStartCallback& callback) override; |
ryansturm | 49a8cb1 | 2016-06-15 16:51:09 | [diff] [blame] | 91 | void SetBeforeHeadersSentCallback( |
| 92 | const BeforeHeadersSentCallback& callback) override; |
dcheng | b03027d | 2014-10-21 12:00:20 | [diff] [blame] | 93 | int ResumeNetworkStart() override; |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 94 | |
[email protected] | 102e27c | 2011-02-23 01:01:31 | [diff] [blame] | 95 | // HttpStreamRequest::Delegate methods: |
dcheng | b03027d | 2014-10-21 12:00:20 | [diff] [blame] | 96 | void OnStreamReady(const SSLConfig& used_ssl_config, |
| 97 | const ProxyInfo& used_proxy_info, |
yhirano | a7e05bb | 2014-11-06 05:40:39 | [diff] [blame] | 98 | HttpStream* stream) override; |
xunjieli | 5749218c | 2016-03-22 16:43:06 | [diff] [blame] | 99 | void OnBidirectionalStreamImplReady(const SSLConfig& used_ssl_config, |
| 100 | const ProxyInfo& used_proxy_info, |
| 101 | BidirectionalStreamImpl* stream) override; |
dcheng | b03027d | 2014-10-21 12:00:20 | [diff] [blame] | 102 | void OnWebSocketHandshakeStreamReady( |
[email protected] | 3732cea | 2013-06-21 06:50:50 | [diff] [blame] | 103 | const SSLConfig& used_ssl_config, |
| 104 | const ProxyInfo& used_proxy_info, |
mostynb | ba063d603 | 2014-10-09 11:01:13 | [diff] [blame] | 105 | WebSocketHandshakeStreamBase* stream) override; |
davidben | 84936542 | 2016-06-24 19:04:13 | [diff] [blame] | 106 | void OnStreamFailed(int status, const SSLConfig& used_ssl_config) override; |
dcheng | b03027d | 2014-10-21 12:00:20 | [diff] [blame] | 107 | void OnCertificateError(int status, |
| 108 | const SSLConfig& used_ssl_config, |
| 109 | const SSLInfo& ssl_info) override; |
| 110 | void OnNeedsProxyAuth(const HttpResponseInfo& response_info, |
| 111 | const SSLConfig& used_ssl_config, |
| 112 | const ProxyInfo& used_proxy_info, |
| 113 | HttpAuthController* auth_controller) override; |
| 114 | void OnNeedsClientAuth(const SSLConfig& used_ssl_config, |
| 115 | SSLCertRequestInfo* cert_info) override; |
| 116 | void OnHttpsProxyTunnelResponse(const HttpResponseInfo& response_info, |
[email protected] | 102e27c | 2011-02-23 01:01:31 | [diff] [blame] | 117 | const SSLConfig& used_ssl_config, |
dcheng | b03027d | 2014-10-21 12:00:20 | [diff] [blame] | 118 | const ProxyInfo& used_proxy_info, |
yhirano | a7e05bb | 2014-11-06 05:40:39 | [diff] [blame] | 119 | HttpStream* stream) override; |
[email protected] | 8e6441ca | 2010-08-19 05:56:38 | [diff] [blame] | 120 | |
zhongyi | 48704c18 | 2015-12-07 07:52:02 | [diff] [blame] | 121 | void OnQuicBroken() override; |
ttuttle | 1f2d7e9 | 2015-04-28 16:17:47 | [diff] [blame] | 122 | void GetConnectionAttempts(ConnectionAttempts* out) const override; |
| 123 | |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 124 | private: |
[email protected] | 158ac97 | 2013-04-19 23:29:23 | [diff] [blame] | 125 | friend class HttpNetworkTransactionSSLTest; |
| 126 | |
[email protected] | 23e48228 | 2013-06-14 16:08:02 | [diff] [blame] | 127 | FRIEND_TEST_ALL_PREFIXES(HttpNetworkTransactionTest, |
[email protected] | 448d4ca5 | 2012-03-04 04:12:23 | [diff] [blame] | 128 | ResetStateForRestart); |
bnc | f458840 | 2015-11-24 13:33:18 | [diff] [blame] | 129 | FRIEND_TEST_ALL_PREFIXES(HttpNetworkTransactionTest, EnableNPN); |
| 130 | FRIEND_TEST_ALL_PREFIXES(HttpNetworkTransactionTest, DisableNPN); |
[email protected] | 23e48228 | 2013-06-14 16:08:02 | [diff] [blame] | 131 | FRIEND_TEST_ALL_PREFIXES(SpdyNetworkTransactionTest, |
[email protected] | 448d4ca5 | 2012-03-04 04:12:23 | [diff] [blame] | 132 | WindowUpdateReceived); |
[email protected] | 23e48228 | 2013-06-14 16:08:02 | [diff] [blame] | 133 | FRIEND_TEST_ALL_PREFIXES(SpdyNetworkTransactionTest, |
[email protected] | 448d4ca5 | 2012-03-04 04:12:23 | [diff] [blame] | 134 | WindowUpdateSent); |
[email protected] | 23e48228 | 2013-06-14 16:08:02 | [diff] [blame] | 135 | FRIEND_TEST_ALL_PREFIXES(SpdyNetworkTransactionTest, |
[email protected] | 448d4ca5 | 2012-03-04 04:12:23 | [diff] [blame] | 136 | WindowUpdateOverflow); |
[email protected] | 23e48228 | 2013-06-14 16:08:02 | [diff] [blame] | 137 | FRIEND_TEST_ALL_PREFIXES(SpdyNetworkTransactionTest, |
[email protected] | 448d4ca5 | 2012-03-04 04:12:23 | [diff] [blame] | 138 | FlowControlStallResume); |
[email protected] | 513963e | 2013-06-15 01:53:04 | [diff] [blame] | 139 | FRIEND_TEST_ALL_PREFIXES(SpdyNetworkTransactionTest, |
[email protected] | ca6459f86 | 2012-04-11 19:43:20 | [diff] [blame] | 140 | FlowControlStallResumeAfterSettings); |
[email protected] | 513963e | 2013-06-15 01:53:04 | [diff] [blame] | 141 | FRIEND_TEST_ALL_PREFIXES(SpdyNetworkTransactionTest, |
[email protected] | ca6459f86 | 2012-04-11 19:43:20 | [diff] [blame] | 142 | FlowControlNegativeSendWindowSize); |
[email protected] | 89ceba9a | 2009-03-21 03:46:06 | [diff] [blame] | 143 | |
[email protected] | d207a5f | 2009-06-04 05:28:40 | [diff] [blame] | 144 | enum State { |
[email protected] | 1826a40 | 2014-01-08 15:40:48 | [diff] [blame] | 145 | STATE_NOTIFY_BEFORE_CREATE_STREAM, |
[email protected] | 82918cc | 2010-08-25 17:24:50 | [diff] [blame] | 146 | STATE_CREATE_STREAM, |
| 147 | STATE_CREATE_STREAM_COMPLETE, |
[email protected] | 351ab64 | 2010-08-05 16:55:31 | [diff] [blame] | 148 | STATE_INIT_STREAM, |
| 149 | STATE_INIT_STREAM_COMPLETE, |
[email protected] | 044de064 | 2010-06-17 10:42:15 | [diff] [blame] | 150 | STATE_GENERATE_PROXY_AUTH_TOKEN, |
| 151 | STATE_GENERATE_PROXY_AUTH_TOKEN_COMPLETE, |
| 152 | STATE_GENERATE_SERVER_AUTH_TOKEN, |
| 153 | STATE_GENERATE_SERVER_AUTH_TOKEN_COMPLETE, |
nharper | d6e6582 | 2016-03-30 23:05:48 | [diff] [blame] | 154 | STATE_GET_PROVIDED_TOKEN_BINDING_KEY, |
| 155 | STATE_GET_PROVIDED_TOKEN_BINDING_KEY_COMPLETE, |
| 156 | STATE_GET_REFERRED_TOKEN_BINDING_KEY, |
| 157 | STATE_GET_REFERRED_TOKEN_BINDING_KEY_COMPLETE, |
[email protected] | daddea6 | 2012-09-19 05:51:13 | [diff] [blame] | 158 | STATE_INIT_REQUEST_BODY, |
| 159 | STATE_INIT_REQUEST_BODY_COMPLETE, |
[email protected] | 4875ba1 | 2011-03-30 22:31:51 | [diff] [blame] | 160 | STATE_BUILD_REQUEST, |
| 161 | STATE_BUILD_REQUEST_COMPLETE, |
[email protected] | 0877e3d | 2009-10-17 22:29:57 | [diff] [blame] | 162 | STATE_SEND_REQUEST, |
| 163 | STATE_SEND_REQUEST_COMPLETE, |
[email protected] | d207a5f | 2009-06-04 05:28:40 | [diff] [blame] | 164 | STATE_READ_HEADERS, |
| 165 | STATE_READ_HEADERS_COMPLETE, |
| 166 | STATE_READ_BODY, |
| 167 | STATE_READ_BODY_COMPLETE, |
| 168 | STATE_DRAIN_BODY_FOR_AUTH_RESTART, |
| 169 | STATE_DRAIN_BODY_FOR_AUTH_RESTART_COMPLETE, |
| 170 | STATE_NONE |
| 171 | }; |
| 172 | |
Adam Rice | cb76ac6 | 2015-02-20 05:33:25 | [diff] [blame] | 173 | bool IsSecureRequest() const; |
nharper | b7441ef | 2016-01-25 23:54:14 | [diff] [blame] | 174 | bool IsTokenBindingEnabled() const; |
| 175 | void RecordTokenBindingSupport() const; |
[email protected] | 564b491 | 2010-03-09 16:30:42 | [diff] [blame] | 176 | |
Adam Rice | 425cf12 | 2015-01-19 06:18:24 | [diff] [blame] | 177 | // Returns true if the request is using an HTTP(S) proxy without being |
| 178 | // tunneled via the CONNECT method. |
| 179 | bool UsingHttpProxyWithoutTunnel() const; |
| 180 | |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 181 | void DoCallback(int result); |
| 182 | void OnIOComplete(int result); |
| 183 | |
| 184 | // Runs the state transition loop. |
| 185 | int DoLoop(int result); |
| 186 | |
| 187 | // Each of these methods corresponds to a State value. Those with an input |
| 188 | // argument receive the result from the previous state. If a method returns |
| 189 | // ERR_IO_PENDING, then the result from OnIOComplete will be passed to the |
| 190 | // next state method as the result arg. |
[email protected] | 1826a40 | 2014-01-08 15:40:48 | [diff] [blame] | 191 | int DoNotifyBeforeCreateStream(); |
[email protected] | 82918cc | 2010-08-25 17:24:50 | [diff] [blame] | 192 | int DoCreateStream(); |
| 193 | int DoCreateStreamComplete(int result); |
[email protected] | 351ab64 | 2010-08-05 16:55:31 | [diff] [blame] | 194 | int DoInitStream(); |
| 195 | int DoInitStreamComplete(int result); |
[email protected] | 044de064 | 2010-06-17 10:42:15 | [diff] [blame] | 196 | int DoGenerateProxyAuthToken(); |
| 197 | int DoGenerateProxyAuthTokenComplete(int result); |
| 198 | int DoGenerateServerAuthToken(); |
| 199 | int DoGenerateServerAuthTokenComplete(int result); |
nharper | d6e6582 | 2016-03-30 23:05:48 | [diff] [blame] | 200 | int DoGetProvidedTokenBindingKey(); |
| 201 | int DoGetProvidedTokenBindingKeyComplete(int result); |
| 202 | int DoGetReferredTokenBindingKey(); |
| 203 | int DoGetReferredTokenBindingKeyComplete(int result); |
[email protected] | daddea6 | 2012-09-19 05:51:13 | [diff] [blame] | 204 | int DoInitRequestBody(); |
| 205 | int DoInitRequestBodyComplete(int result); |
[email protected] | 4875ba1 | 2011-03-30 22:31:51 | [diff] [blame] | 206 | int DoBuildRequest(); |
| 207 | int DoBuildRequestComplete(int result); |
[email protected] | 0877e3d | 2009-10-17 22:29:57 | [diff] [blame] | 208 | int DoSendRequest(); |
| 209 | int DoSendRequestComplete(int result); |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 210 | int DoReadHeaders(); |
| 211 | int DoReadHeadersComplete(int result); |
| 212 | int DoReadBody(); |
| 213 | int DoReadBodyComplete(int result); |
[email protected] | 2d2697f9 | 2009-02-18 21:00:32 | [diff] [blame] | 214 | int DoDrainBodyForAuthRestart(); |
| 215 | int DoDrainBodyForAuthRestartComplete(int result); |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 216 | |
nharper | b7441ef | 2016-01-25 23:54:14 | [diff] [blame] | 217 | int BuildRequestHeaders(bool using_http_proxy_without_tunnel); |
| 218 | int BuildTokenBindingHeader(std::string* out); |
[email protected] | 2979a49 | 2011-04-06 00:29:14 | [diff] [blame] | 219 | |
[email protected] | 9f9f86c | 2009-03-12 22:32:42 | [diff] [blame] | 220 | // Writes a log message to help debugging in the field when we block a proxy |
| 221 | // response to a CONNECT request. |
[email protected] | af89ba6 | 2009-03-16 20:26:38 | [diff] [blame] | 222 | void LogBlockedTunnelResponse(int response_code) const; |
[email protected] | 9f9f86c | 2009-03-12 22:32:42 | [diff] [blame] | 223 | |
[email protected] | 0b45559b | 2009-06-12 21:45:11 | [diff] [blame] | 224 | // Called to handle a client certificate request. |
[email protected] | 5e36396 | 2009-06-19 19:57:01 | [diff] [blame] | 225 | int HandleCertificateRequest(int error); |
[email protected] | 0b45559b | 2009-06-12 21:45:11 | [diff] [blame] | 226 | |
bnc | facdd85 | 2015-01-09 19:22:54 | [diff] [blame] | 227 | // Called wherever ERR_HTTP_1_1_REQUIRED or |
| 228 | // ERR_PROXY_HTTP_1_1_REQUIRED has to be handled. |
| 229 | int HandleHttp11Required(int error); |
| 230 | |
[email protected] | 384cc73a | 2013-12-08 22:41:03 | [diff] [blame] | 231 | // Called to possibly handle a client authentication error. |
| 232 | void HandleClientAuthError(int error); |
| 233 | |
[email protected] | bd0b677 | 2011-01-11 19:59:30 | [diff] [blame] | 234 | // Called to possibly recover from an SSL handshake error. Sets next_state_ |
| 235 | // and returns OK if recovering from the error. Otherwise, the same error |
| 236 | // code is returned. |
| 237 | int HandleSSLHandshakeError(int error); |
| 238 | |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 239 | // Called to possibly recover from the given error. Sets next_state_ and |
| 240 | // returns OK if recovering from the error. Otherwise, the same error code |
| 241 | // is returned. |
| 242 | int HandleIOError(int error); |
| 243 | |
[email protected] | 0877e3d | 2009-10-17 22:29:57 | [diff] [blame] | 244 | // Gets the response headers from the HttpStream. |
| 245 | HttpResponseHeaders* GetResponseHeaders() const; |
| 246 | |
[email protected] | a34f61ee | 2014-03-18 20:59:49 | [diff] [blame] | 247 | // Called when the socket is unexpectedly closed. Returns true if the request |
| 248 | // should be resent in case of a socket reuse/close race. |
| 249 | bool ShouldResendRequest() const; |
[email protected] | 1c773ea1 | 2009-04-28 19:58:42 | [diff] [blame] | 250 | |
| 251 | // Resets the connection and the request headers for resend. Called when |
| 252 | // ShouldResendRequest() is true. |
| 253 | void ResetConnectionAndRequestForResend(); |
[email protected] | 2a5c76b | 2008-09-25 22:15:16 | [diff] [blame] | 254 | |
[email protected] | f9ee6b5 | 2008-11-08 06:46:23 | [diff] [blame] | 255 | // Sets up the state machine to restart the transaction with auth. |
| 256 | void PrepareForAuthRestart(HttpAuth::Target target); |
| 257 | |
[email protected] | 2d2697f9 | 2009-02-18 21:00:32 | [diff] [blame] | 258 | // Called when we don't need to drain the response body or have drained it. |
| 259 | // Resets |connection_| unless |keep_alive| is true, then calls |
| 260 | // ResetStateForRestart. Sets |next_state_| appropriately. |
| 261 | void DidDrainBodyForAuthRestart(bool keep_alive); |
| 262 | |
[email protected] | f9ee6b5 | 2008-11-08 06:46:23 | [diff] [blame] | 263 | // Resets the members of the transaction so it can be restarted. |
[email protected] | c3b35c2 | 2008-09-27 03:19:42 | [diff] [blame] | 264 | void ResetStateForRestart(); |
| 265 | |
[email protected] | 697ef4c | 2010-10-14 16:38:58 | [diff] [blame] | 266 | // Resets the members of the transaction, except |stream_|, which needs |
| 267 | // to be maintained for multi-round auth. |
| 268 | void ResetStateForAuthRestart(); |
| 269 | |
zhongyi | ca364fbb | 2015-12-12 03:39:12 | [diff] [blame] | 270 | // Caches network error details from the stream if available |
| 271 | // and resets the stream. |
| 272 | void CacheNetErrorDetailsAndResetStream(); |
| 273 | |
davidben | ca9d6916 | 2015-05-04 20:18:45 | [diff] [blame] | 274 | // Records metrics relating to SSL fallbacks. |
davidben | 701ca98 | 2015-05-18 21:21:42 | [diff] [blame] | 275 | void RecordSSLFallbackMetrics(int result); |
davidben | ca9d6916 | 2015-05-04 20:18:45 | [diff] [blame] | 276 | |
[email protected] | 1c773ea1 | 2009-04-28 19:58:42 | [diff] [blame] | 277 | // Returns true if we should try to add a Proxy-Authorization header |
| 278 | bool ShouldApplyProxyAuth() const; |
[email protected] | c3b35c2 | 2008-09-27 03:19:42 | [diff] [blame] | 279 | |
[email protected] | 1c773ea1 | 2009-04-28 19:58:42 | [diff] [blame] | 280 | // Returns true if we should try to add an Authorization header. |
| 281 | bool ShouldApplyServerAuth() const; |
| 282 | |
[email protected] | f9ee6b5 | 2008-11-08 06:46:23 | [diff] [blame] | 283 | // Handles HTTP status code 401 or 407. |
[email protected] | 0757e770 | 2009-03-27 04:00:22 | [diff] [blame] | 284 | // HandleAuthChallenge() returns a network error code, or OK on success. |
| 285 | // May update |pending_auth_target_| or |response_.auth_challenge|. |
[email protected] | e772db3f | 2010-07-12 18:11:13 | [diff] [blame] | 286 | int HandleAuthChallenge(); |
[email protected] | f9ee6b5 | 2008-11-08 06:46:23 | [diff] [blame] | 287 | |
[email protected] | 8e6441ca | 2010-08-19 05:56:38 | [diff] [blame] | 288 | // Returns true if we have auth credentials for the given target. |
| 289 | bool HaveAuth(HttpAuth::Target target) const; |
[email protected] | c3b35c2 | 2008-09-27 03:19:42 | [diff] [blame] | 290 | |
[email protected] | 228404f | 2010-06-24 04:31:41 | [diff] [blame] | 291 | // Get the {scheme, host, path, port} for the authentication target |
| 292 | GURL AuthURL(HttpAuth::Target target) const; |
[email protected] | 044de064 | 2010-06-17 10:42:15 | [diff] [blame] | 293 | |
[email protected] | 831e4a3 | 2013-11-14 02:14:44 | [diff] [blame] | 294 | // Returns true if this transaction is for a WebSocket handshake |
| 295 | bool ForWebSocketHandshake() const; |
| 296 | |
yhirano | a7e05bb | 2014-11-06 05:40:39 | [diff] [blame] | 297 | void SetStream(HttpStream* stream); |
[email protected] | b8015c4 | 2013-12-24 15:18:19 | [diff] [blame] | 298 | |
ttuttle | 1f2d7e9 | 2015-04-28 16:17:47 | [diff] [blame] | 299 | void CopyConnectionAttemptsFromStreamRequest(); |
| 300 | |
[email protected] | e772db3f | 2010-07-12 18:11:13 | [diff] [blame] | 301 | scoped_refptr<HttpAuthController> |
| 302 | auth_controllers_[HttpAuth::AUTH_NUM_TARGETS]; |
[email protected] | c3b35c2 | 2008-09-27 03:19:42 | [diff] [blame] | 303 | |
[email protected] | 0757e770 | 2009-03-27 04:00:22 | [diff] [blame] | 304 | // Whether this transaction is waiting for proxy auth, server auth, or is |
| 305 | // not waiting for any auth at all. |pending_auth_target_| is read and |
| 306 | // cleared by RestartWithAuth(). |
| 307 | HttpAuth::Target pending_auth_target_; |
| 308 | |
[email protected] | 49639fa | 2011-12-20 23:22:41 | [diff] [blame] | 309 | CompletionCallback io_callback_; |
| 310 | CompletionCallback callback_; |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 311 | |
[email protected] | 3fe8d2f8 | 2013-10-17 08:56:07 | [diff] [blame] | 312 | HttpNetworkSession* session_; |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 313 | |
tfarina | 4283411 | 2016-09-22 13:38:20 | [diff] [blame] | 314 | NetLogWithSource net_log_; |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 315 | const HttpRequestInfo* request_; |
[email protected] | 262eec8 | 2013-03-19 21:01:36 | [diff] [blame] | 316 | RequestPriority priority_; |
[email protected] | a7e4131 | 2009-12-16 23:18:14 | [diff] [blame] | 317 | HttpResponseInfo response_; |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 318 | |
[email protected] | 102e27c | 2011-02-23 01:01:31 | [diff] [blame] | 319 | // |proxy_info_| is the ProxyInfo used by the HttpStreamRequest. |
[email protected] | 928fb58 | 2008-08-11 15:40:23 | [diff] [blame] | 320 | ProxyInfo proxy_info_; |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 321 | |
danakj | 1fd259a0 | 2016-04-16 03:17:09 | [diff] [blame] | 322 | std::unique_ptr<HttpStreamRequest> stream_request_; |
| 323 | std::unique_ptr<HttpStream> stream_; |
[email protected] | 8e6441ca | 2010-08-19 05:56:38 | [diff] [blame] | 324 | |
[email protected] | 0877e3d | 2009-10-17 22:29:57 | [diff] [blame] | 325 | // True if we've validated the headers that the stream parser has returned. |
| 326 | bool headers_valid_; |
| 327 | |
[email protected] | 102957f | 2011-09-02 17:10:14 | [diff] [blame] | 328 | SSLConfig server_ssl_config_; |
| 329 | SSLConfig proxy_ssl_config_; |
[email protected] | c5949a3 | 2008-10-08 17:28:23 | [diff] [blame] | 330 | |
nharper | d6e6582 | 2016-03-30 23:05:48 | [diff] [blame] | 331 | // Keys to use for signing message in Token Binding header. |
danakj | 1fd259a0 | 2016-04-16 03:17:09 | [diff] [blame] | 332 | std::unique_ptr<crypto::ECPrivateKey> provided_token_binding_key_; |
| 333 | std::unique_ptr<crypto::ECPrivateKey> referred_token_binding_key_; |
nharper | d6e6582 | 2016-03-30 23:05:48 | [diff] [blame] | 334 | // Object to manage lookup of |provided_token_binding_key_| and |
| 335 | // |referred_token_binding_key_|. |
nharper | b7441ef | 2016-01-25 23:54:14 | [diff] [blame] | 336 | ChannelIDService::Request token_binding_request_; |
| 337 | |
[email protected] | b94f92d | 2010-10-27 16:45:20 | [diff] [blame] | 338 | HttpRequestHeaders request_headers_; |
[email protected] | 4ddaf250 | 2008-10-23 18:26:19 | [diff] [blame] | 339 | |
[email protected] | 2d2697f9 | 2009-02-18 21:00:32 | [diff] [blame] | 340 | // The size in bytes of the buffer we use to drain the response body that |
| 341 | // we want to throw away. The response body is typically a small error |
| 342 | // page just a few hundred bytes long. |
[email protected] | 81854c4 | 2010-09-22 03:39:36 | [diff] [blame] | 343 | static const int kDrainBodyBufferSize = 1024; |
[email protected] | 2d2697f9 | 2009-02-18 21:00:32 | [diff] [blame] | 344 | |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 345 | // User buffer and length passed to the Read method. |
[email protected] | 9dea9e1f | 2009-01-29 00:30:47 | [diff] [blame] | 346 | scoped_refptr<IOBuffer> read_buf_; |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 347 | int read_buf_len_; |
| 348 | |
sclittle | fb24989 | 2015-09-10 21:33:22 | [diff] [blame] | 349 | // Total number of bytes received on all destroyed HttpStreams for this |
| 350 | // transaction. |
sclittle | 4de1bab9 | 2015-09-22 21:28:24 | [diff] [blame] | 351 | int64_t total_received_bytes_; |
[email protected] | b8015c4 | 2013-12-24 15:18:19 | [diff] [blame] | 352 | |
sclittle | fb24989 | 2015-09-10 21:33:22 | [diff] [blame] | 353 | // Total number of bytes sent on all destroyed HttpStreams for this |
| 354 | // transaction. |
| 355 | int64_t total_sent_bytes_; |
| 356 | |
[email protected] | 58e32bb | 2013-01-21 18:23:25 | [diff] [blame] | 357 | // When the transaction started / finished sending the request, including |
| 358 | // the body, if present. |
| 359 | base::TimeTicks send_start_time_; |
| 360 | base::TimeTicks send_end_time_; |
| 361 | |
[email protected] | d207a5f | 2009-06-04 05:28:40 | [diff] [blame] | 362 | // The next state in the state machine. |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 363 | State next_state_; |
[email protected] | 2ff8b31 | 2010-04-26 22:20:54 | [diff] [blame] | 364 | |
[email protected] | a7ea883 | 2010-07-12 17:54:54 | [diff] [blame] | 365 | // True when the tunnel is in the process of being established - we can't |
| 366 | // read from the socket until the tunnel is done. |
| 367 | bool establishing_tunnel_; |
| 368 | |
[email protected] | 831e4a3 | 2013-11-14 02:14:44 | [diff] [blame] | 369 | // The helper object to use to create WebSocketHandshakeStreamBase |
| 370 | // objects. Only relevant when establishing a WebSocket connection. |
| 371 | WebSocketHandshakeStreamBase::CreateHelper* |
| 372 | websocket_handshake_stream_base_create_helper_; |
| 373 | |
[email protected] | 1826a40 | 2014-01-08 15:40:48 | [diff] [blame] | 374 | BeforeNetworkStartCallback before_network_start_callback_; |
ryansturm | 49a8cb1 | 2016-06-15 16:51:09 | [diff] [blame] | 375 | BeforeHeadersSentCallback before_headers_sent_callback_; |
[email protected] | 1826a40 | 2014-01-08 15:40:48 | [diff] [blame] | 376 | |
ttuttle | 1f2d7e9 | 2015-04-28 16:17:47 | [diff] [blame] | 377 | ConnectionAttempts connection_attempts_; |
ttuttle | d9dbc65 | 2015-09-29 20:00:59 | [diff] [blame] | 378 | IPEndPoint remote_endpoint_; |
zhongyi | ca364fbb | 2015-12-12 03:39:12 | [diff] [blame] | 379 | // Network error details for this transaction. |
| 380 | NetErrorDetails net_error_details_; |
[email protected] | 2ff8b31 | 2010-04-26 22:20:54 | [diff] [blame] | 381 | DISALLOW_COPY_AND_ASSIGN(HttpNetworkTransaction); |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 382 | }; |
| 383 | |
| 384 | } // namespace net |
| 385 | |
| 386 | #endif // NET_HTTP_HTTP_NETWORK_TRANSACTION_H_ |