[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" |
Bence Béky | 6b44abf | 2018-04-11 10:32:51 | [diff] [blame^] | 25 | #include "net/http/http_stream_request.h" |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 26 | #include "net/http/http_transaction.h" |
mikecirone | f22f981 | 2016-10-04 03:40:19 | [diff] [blame] | 27 | #include "net/log/net_log_with_source.h" |
Lily Houghton | ffe89daa0 | 2018-03-09 18:30:03 | [diff] [blame] | 28 | #include "net/proxy_resolution/proxy_resolution_service.h" |
ttuttle | 1f2d7e9 | 2015-04-28 16:17:47 | [diff] [blame] | 29 | #include "net/socket/connection_attempts.h" |
nharper | b7441ef | 2016-01-25 23:54:14 | [diff] [blame] | 30 | #include "net/ssl/channel_id_service.h" |
[email protected] | 536fd0b | 2013-03-14 17:41:57 | [diff] [blame] | 31 | #include "net/ssl/ssl_config_service.h" |
[email protected] | 831e4a3 | 2013-11-14 02:14:44 | [diff] [blame] | 32 | #include "net/websockets/websocket_handshake_stream_base.h" |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 33 | |
nharper | b7441ef | 2016-01-25 23:54:14 | [diff] [blame] | 34 | namespace crypto { |
| 35 | class ECPrivateKey; |
| 36 | } |
| 37 | |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 38 | namespace net { |
| 39 | |
xunjieli | 5749218c | 2016-03-22 16:43:06 | [diff] [blame] | 40 | class BidirectionalStreamImpl; |
[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] | 8e6441ca | 2010-08-19 05:56:38 | [diff] [blame] | 44 | class IOBuffer; |
[email protected] | 597a1ab | 2014-06-26 08:12:27 | [diff] [blame] | 45 | class ProxyInfo; |
svaldez | 7872fd0 | 2015-11-19 21:10:54 | [diff] [blame] | 46 | class SSLPrivateKey; |
[email protected] | 82918cc | 2010-08-25 17:24:50 | [diff] [blame] | 47 | struct HttpRequestInfo; |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 48 | |
[email protected] | 172da1b | 2011-08-12 15:52:26 | [diff] [blame] | 49 | class NET_EXPORT_PRIVATE HttpNetworkTransaction |
| 50 | : public HttpTransaction, |
Helen Li | b495c380 | 2018-03-30 13:46:09 | [diff] [blame] | 51 | public HttpStreamRequest::Delegate { |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 52 | public: |
[email protected] | 262eec8 | 2013-03-19 21:01:36 | [diff] [blame] | 53 | HttpNetworkTransaction(RequestPriority priority, |
| 54 | HttpNetworkSession* session); |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 55 | |
dcheng | b03027d | 2014-10-21 12:00:20 | [diff] [blame] | 56 | ~HttpNetworkTransaction() override; |
[email protected] | af4876d | 2008-10-21 23:10:57 | [diff] [blame] | 57 | |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 58 | // HttpTransaction methods: |
dcheng | b03027d | 2014-10-21 12:00:20 | [diff] [blame] | 59 | int Start(const HttpRequestInfo* request_info, |
| 60 | const CompletionCallback& callback, |
tfarina | 4283411 | 2016-09-22 13:38:20 | [diff] [blame] | 61 | const NetLogWithSource& net_log) override; |
dcheng | b03027d | 2014-10-21 12:00:20 | [diff] [blame] | 62 | int RestartIgnoringLastError(const CompletionCallback& callback) override; |
mattm | 436ccfe | 2017-06-19 20:24:08 | [diff] [blame] | 63 | int RestartWithCertificate(scoped_refptr<X509Certificate> client_cert, |
| 64 | scoped_refptr<SSLPrivateKey> client_private_key, |
dcheng | b03027d | 2014-10-21 12:00:20 | [diff] [blame] | 65 | const CompletionCallback& callback) override; |
| 66 | int RestartWithAuth(const AuthCredentials& credentials, |
| 67 | const CompletionCallback& callback) override; |
| 68 | bool IsReadyToRestartForAuth() override; |
[email protected] | 0757e770 | 2009-03-27 04:00:22 | [diff] [blame] | 69 | |
dcheng | b03027d | 2014-10-21 12:00:20 | [diff] [blame] | 70 | int Read(IOBuffer* buf, |
| 71 | int buf_len, |
| 72 | const CompletionCallback& callback) override; |
| 73 | void StopCaching() override; |
| 74 | bool GetFullRequestHeaders(HttpRequestHeaders* headers) const override; |
sclittle | 4de1bab9 | 2015-09-22 21:28:24 | [diff] [blame] | 75 | int64_t GetTotalReceivedBytes() const override; |
sclittle | fb24989 | 2015-09-10 21:33:22 | [diff] [blame] | 76 | int64_t GetTotalSentBytes() const override; |
dcheng | b03027d | 2014-10-21 12:00:20 | [diff] [blame] | 77 | void DoneReading() override; |
| 78 | const HttpResponseInfo* GetResponseInfo() const override; |
| 79 | LoadState GetLoadState() const override; |
dcheng | b03027d | 2014-10-21 12:00:20 | [diff] [blame] | 80 | void SetQuicServerInfo(QuicServerInfo* quic_server_info) override; |
| 81 | bool GetLoadTimingInfo(LoadTimingInfo* load_timing_info) const override; |
ttuttle | d9dbc65 | 2015-09-29 20:00:59 | [diff] [blame] | 82 | bool GetRemoteEndpoint(IPEndPoint* endpoint) const override; |
zhongyi | 48704c18 | 2015-12-07 07:52:02 | [diff] [blame] | 83 | void PopulateNetErrorDetails(NetErrorDetails* details) const override; |
dcheng | b03027d | 2014-10-21 12:00:20 | [diff] [blame] | 84 | void SetPriority(RequestPriority priority) override; |
| 85 | void SetWebSocketHandshakeStreamCreateHelper( |
mostynb | ba063d603 | 2014-10-09 11:01:13 | [diff] [blame] | 86 | WebSocketHandshakeStreamBase::CreateHelper* create_helper) override; |
dcheng | b03027d | 2014-10-21 12:00:20 | [diff] [blame] | 87 | void SetBeforeNetworkStartCallback( |
mostynb | ba063d603 | 2014-10-09 11:01:13 | [diff] [blame] | 88 | const BeforeNetworkStartCallback& callback) override; |
ryansturm | 49a8cb1 | 2016-06-15 16:51:09 | [diff] [blame] | 89 | void SetBeforeHeadersSentCallback( |
| 90 | const BeforeHeadersSentCallback& callback) override; |
Andrey Kosyakov | 2e893e6 | 2017-08-31 17:00:52 | [diff] [blame] | 91 | void SetRequestHeadersCallback(RequestHeadersCallback callback) override; |
| 92 | void SetResponseHeadersCallback(ResponseHeadersCallback callback) override; |
Andrey Kosyakov | 83a6eee | 2017-08-14 19:20:04 | [diff] [blame] | 93 | |
dcheng | b03027d | 2014-10-21 12:00:20 | [diff] [blame] | 94 | int ResumeNetworkStart() override; |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 95 | |
[email protected] | 102e27c | 2011-02-23 01:01:31 | [diff] [blame] | 96 | // HttpStreamRequest::Delegate methods: |
dcheng | b03027d | 2014-10-21 12:00:20 | [diff] [blame] | 97 | void OnStreamReady(const SSLConfig& used_ssl_config, |
| 98 | const ProxyInfo& used_proxy_info, |
bnc | 5029f463 | 2017-06-08 16:19:00 | [diff] [blame] | 99 | std::unique_ptr<HttpStream> stream) override; |
| 100 | void OnBidirectionalStreamImplReady( |
| 101 | const SSLConfig& used_ssl_config, |
| 102 | const ProxyInfo& used_proxy_info, |
| 103 | std::unique_ptr<BidirectionalStreamImpl> stream) override; |
dcheng | b03027d | 2014-10-21 12:00:20 | [diff] [blame] | 104 | void OnWebSocketHandshakeStreamReady( |
[email protected] | 3732cea | 2013-06-21 06:50:50 | [diff] [blame] | 105 | const SSLConfig& used_ssl_config, |
| 106 | const ProxyInfo& used_proxy_info, |
bnc | 5029f463 | 2017-06-08 16:19:00 | [diff] [blame] | 107 | std::unique_ptr<WebSocketHandshakeStreamBase> stream) override; |
Ryan Hamilton | 75f19726 | 2017-08-17 14:00:07 | [diff] [blame] | 108 | void OnStreamFailed(int status, |
| 109 | const NetErrorDetails& net_error_details, |
| 110 | const SSLConfig& used_ssl_config) override; |
dcheng | b03027d | 2014-10-21 12:00:20 | [diff] [blame] | 111 | void OnCertificateError(int status, |
| 112 | const SSLConfig& used_ssl_config, |
| 113 | const SSLInfo& ssl_info) override; |
| 114 | void OnNeedsProxyAuth(const HttpResponseInfo& response_info, |
| 115 | const SSLConfig& used_ssl_config, |
| 116 | const ProxyInfo& used_proxy_info, |
| 117 | HttpAuthController* auth_controller) override; |
| 118 | void OnNeedsClientAuth(const SSLConfig& used_ssl_config, |
| 119 | SSLCertRequestInfo* cert_info) override; |
| 120 | void OnHttpsProxyTunnelResponse(const HttpResponseInfo& response_info, |
[email protected] | 102e27c | 2011-02-23 01:01:31 | [diff] [blame] | 121 | const SSLConfig& used_ssl_config, |
dcheng | b03027d | 2014-10-21 12:00:20 | [diff] [blame] | 122 | const ProxyInfo& used_proxy_info, |
Bence Béky | 6d05ebd | 2017-05-16 00:09:01 | [diff] [blame] | 123 | std::unique_ptr<HttpStream> stream) override; |
[email protected] | 8e6441ca | 2010-08-19 05:56:38 | [diff] [blame] | 124 | |
zhongyi | 48704c18 | 2015-12-07 07:52:02 | [diff] [blame] | 125 | void OnQuicBroken() override; |
ttuttle | 1f2d7e9 | 2015-04-28 16:17:47 | [diff] [blame] | 126 | void GetConnectionAttempts(ConnectionAttempts* out) const override; |
| 127 | |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 128 | private: |
bnc | 1f61cdf | 2016-11-28 18:03:45 | [diff] [blame] | 129 | FRIEND_TEST_ALL_PREFIXES(HttpNetworkTransactionTest, ResetStateForRestart); |
Bence Béky | 2fcf4fa | 2018-04-06 20:06:01 | [diff] [blame] | 130 | FRIEND_TEST_ALL_PREFIXES(HttpNetworkTransactionTest, |
| 131 | CreateWebSocketHandshakeStream); |
bnc | 1f61cdf | 2016-11-28 18:03:45 | [diff] [blame] | 132 | FRIEND_TEST_ALL_PREFIXES(SpdyNetworkTransactionTest, WindowUpdateReceived); |
| 133 | FRIEND_TEST_ALL_PREFIXES(SpdyNetworkTransactionTest, WindowUpdateSent); |
| 134 | FRIEND_TEST_ALL_PREFIXES(SpdyNetworkTransactionTest, WindowUpdateOverflow); |
| 135 | FRIEND_TEST_ALL_PREFIXES(SpdyNetworkTransactionTest, FlowControlStallResume); |
[email protected] | 513963e | 2013-06-15 01:53:04 | [diff] [blame] | 136 | FRIEND_TEST_ALL_PREFIXES(SpdyNetworkTransactionTest, |
[email protected] | ca6459f86 | 2012-04-11 19:43:20 | [diff] [blame] | 137 | FlowControlStallResumeAfterSettings); |
[email protected] | 513963e | 2013-06-15 01:53:04 | [diff] [blame] | 138 | FRIEND_TEST_ALL_PREFIXES(SpdyNetworkTransactionTest, |
[email protected] | ca6459f86 | 2012-04-11 19:43:20 | [diff] [blame] | 139 | FlowControlNegativeSendWindowSize); |
[email protected] | 89ceba9a | 2009-03-21 03:46:06 | [diff] [blame] | 140 | |
[email protected] | d207a5f | 2009-06-04 05:28:40 | [diff] [blame] | 141 | enum State { |
[email protected] | 1826a40 | 2014-01-08 15:40:48 | [diff] [blame] | 142 | STATE_NOTIFY_BEFORE_CREATE_STREAM, |
[email protected] | 82918cc | 2010-08-25 17:24:50 | [diff] [blame] | 143 | STATE_CREATE_STREAM, |
| 144 | STATE_CREATE_STREAM_COMPLETE, |
[email protected] | 351ab64 | 2010-08-05 16:55:31 | [diff] [blame] | 145 | STATE_INIT_STREAM, |
| 146 | STATE_INIT_STREAM_COMPLETE, |
[email protected] | 044de064 | 2010-06-17 10:42:15 | [diff] [blame] | 147 | STATE_GENERATE_PROXY_AUTH_TOKEN, |
| 148 | STATE_GENERATE_PROXY_AUTH_TOKEN_COMPLETE, |
| 149 | STATE_GENERATE_SERVER_AUTH_TOKEN, |
| 150 | STATE_GENERATE_SERVER_AUTH_TOKEN_COMPLETE, |
nharper | d6e6582 | 2016-03-30 23:05:48 | [diff] [blame] | 151 | STATE_GET_PROVIDED_TOKEN_BINDING_KEY, |
| 152 | STATE_GET_PROVIDED_TOKEN_BINDING_KEY_COMPLETE, |
| 153 | STATE_GET_REFERRED_TOKEN_BINDING_KEY, |
| 154 | STATE_GET_REFERRED_TOKEN_BINDING_KEY_COMPLETE, |
[email protected] | daddea6 | 2012-09-19 05:51:13 | [diff] [blame] | 155 | STATE_INIT_REQUEST_BODY, |
| 156 | STATE_INIT_REQUEST_BODY_COMPLETE, |
[email protected] | 4875ba1 | 2011-03-30 22:31:51 | [diff] [blame] | 157 | STATE_BUILD_REQUEST, |
| 158 | STATE_BUILD_REQUEST_COMPLETE, |
[email protected] | 0877e3d | 2009-10-17 22:29:57 | [diff] [blame] | 159 | STATE_SEND_REQUEST, |
| 160 | STATE_SEND_REQUEST_COMPLETE, |
[email protected] | d207a5f | 2009-06-04 05:28:40 | [diff] [blame] | 161 | STATE_READ_HEADERS, |
| 162 | STATE_READ_HEADERS_COMPLETE, |
| 163 | STATE_READ_BODY, |
| 164 | STATE_READ_BODY_COMPLETE, |
| 165 | STATE_DRAIN_BODY_FOR_AUTH_RESTART, |
| 166 | STATE_DRAIN_BODY_FOR_AUTH_RESTART_COMPLETE, |
| 167 | STATE_NONE |
| 168 | }; |
| 169 | |
Adam Rice | cb76ac6 | 2015-02-20 05:33:25 | [diff] [blame] | 170 | bool IsSecureRequest() const; |
nharper | b7441ef | 2016-01-25 23:54:14 | [diff] [blame] | 171 | bool IsTokenBindingEnabled() const; |
| 172 | void RecordTokenBindingSupport() const; |
[email protected] | 564b491 | 2010-03-09 16:30:42 | [diff] [blame] | 173 | |
Adam Rice | 425cf12 | 2015-01-19 06:18:24 | [diff] [blame] | 174 | // Returns true if the request is using an HTTP(S) proxy without being |
| 175 | // tunneled via the CONNECT method. |
| 176 | bool UsingHttpProxyWithoutTunnel() const; |
| 177 | |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 178 | void DoCallback(int result); |
| 179 | void OnIOComplete(int result); |
| 180 | |
| 181 | // Runs the state transition loop. |
| 182 | int DoLoop(int result); |
| 183 | |
| 184 | // Each of these methods corresponds to a State value. Those with an input |
| 185 | // argument receive the result from the previous state. If a method returns |
| 186 | // ERR_IO_PENDING, then the result from OnIOComplete will be passed to the |
| 187 | // next state method as the result arg. |
[email protected] | 1826a40 | 2014-01-08 15:40:48 | [diff] [blame] | 188 | int DoNotifyBeforeCreateStream(); |
[email protected] | 82918cc | 2010-08-25 17:24:50 | [diff] [blame] | 189 | int DoCreateStream(); |
| 190 | int DoCreateStreamComplete(int result); |
[email protected] | 351ab64 | 2010-08-05 16:55:31 | [diff] [blame] | 191 | int DoInitStream(); |
| 192 | int DoInitStreamComplete(int result); |
[email protected] | 044de064 | 2010-06-17 10:42:15 | [diff] [blame] | 193 | int DoGenerateProxyAuthToken(); |
| 194 | int DoGenerateProxyAuthTokenComplete(int result); |
| 195 | int DoGenerateServerAuthToken(); |
| 196 | int DoGenerateServerAuthTokenComplete(int result); |
nharper | d6e6582 | 2016-03-30 23:05:48 | [diff] [blame] | 197 | int DoGetProvidedTokenBindingKey(); |
| 198 | int DoGetProvidedTokenBindingKeyComplete(int result); |
| 199 | int DoGetReferredTokenBindingKey(); |
| 200 | int DoGetReferredTokenBindingKeyComplete(int result); |
[email protected] | daddea6 | 2012-09-19 05:51:13 | [diff] [blame] | 201 | int DoInitRequestBody(); |
| 202 | int DoInitRequestBodyComplete(int result); |
[email protected] | 4875ba1 | 2011-03-30 22:31:51 | [diff] [blame] | 203 | int DoBuildRequest(); |
| 204 | int DoBuildRequestComplete(int result); |
[email protected] | 0877e3d | 2009-10-17 22:29:57 | [diff] [blame] | 205 | int DoSendRequest(); |
| 206 | int DoSendRequestComplete(int result); |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 207 | int DoReadHeaders(); |
| 208 | int DoReadHeadersComplete(int result); |
| 209 | int DoReadBody(); |
| 210 | int DoReadBodyComplete(int result); |
[email protected] | 2d2697f9 | 2009-02-18 21:00:32 | [diff] [blame] | 211 | int DoDrainBodyForAuthRestart(); |
| 212 | int DoDrainBodyForAuthRestartComplete(int result); |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 213 | |
nharper | b7441ef | 2016-01-25 23:54:14 | [diff] [blame] | 214 | int BuildRequestHeaders(bool using_http_proxy_without_tunnel); |
| 215 | int BuildTokenBindingHeader(std::string* out); |
[email protected] | 2979a49 | 2011-04-06 00:29:14 | [diff] [blame] | 216 | |
[email protected] | 9f9f86c | 2009-03-12 22:32:42 | [diff] [blame] | 217 | // Writes a log message to help debugging in the field when we block a proxy |
| 218 | // response to a CONNECT request. |
[email protected] | af89ba6 | 2009-03-16 20:26:38 | [diff] [blame] | 219 | void LogBlockedTunnelResponse(int response_code) const; |
[email protected] | 9f9f86c | 2009-03-12 22:32:42 | [diff] [blame] | 220 | |
[email protected] | 0b45559b | 2009-06-12 21:45:11 | [diff] [blame] | 221 | // Called to handle a client certificate request. |
[email protected] | 5e36396 | 2009-06-19 19:57:01 | [diff] [blame] | 222 | int HandleCertificateRequest(int error); |
[email protected] | 0b45559b | 2009-06-12 21:45:11 | [diff] [blame] | 223 | |
bnc | facdd85 | 2015-01-09 19:22:54 | [diff] [blame] | 224 | // Called wherever ERR_HTTP_1_1_REQUIRED or |
| 225 | // ERR_PROXY_HTTP_1_1_REQUIRED has to be handled. |
| 226 | int HandleHttp11Required(int error); |
| 227 | |
David Benjamin | 76a40ad | 2018-02-24 22:22:08 | [diff] [blame] | 228 | // Called to possibly handle a client authentication error. Sets next_state_ |
[email protected] | bd0b677 | 2011-01-11 19:59:30 | [diff] [blame] | 229 | // and returns OK if recovering from the error. Otherwise, the same error |
| 230 | // code is returned. |
David Benjamin | 76a40ad | 2018-02-24 22:22:08 | [diff] [blame] | 231 | int HandleSSLClientAuthError(int error); |
[email protected] | bd0b677 | 2011-01-11 19:59:30 | [diff] [blame] | 232 | |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 233 | // Called to possibly recover from the given error. Sets next_state_ and |
| 234 | // returns OK if recovering from the error. Otherwise, the same error code |
| 235 | // is returned. |
| 236 | int HandleIOError(int error); |
| 237 | |
[email protected] | 0877e3d | 2009-10-17 22:29:57 | [diff] [blame] | 238 | // Gets the response headers from the HttpStream. |
| 239 | HttpResponseHeaders* GetResponseHeaders() const; |
| 240 | |
[email protected] | a34f61ee | 2014-03-18 20:59:49 | [diff] [blame] | 241 | // Called when the socket is unexpectedly closed. Returns true if the request |
| 242 | // should be resent in case of a socket reuse/close race. |
| 243 | bool ShouldResendRequest() const; |
[email protected] | 1c773ea1 | 2009-04-28 19:58:42 | [diff] [blame] | 244 | |
Biljith Jayan | 45a4172 | 2017-08-16 18:43:14 | [diff] [blame] | 245 | // Returns true if there have already been |kMaxRetryAttempts| retries for |
| 246 | // HTTP2 or QUIC network errors, and no further retries should be attempted. |
| 247 | bool HasExceededMaxRetries() const; |
| 248 | |
David Benjamin | 83ddfb3 | 2018-03-30 01:07:52 | [diff] [blame] | 249 | // Increments the number of restarts and returns true if the restart may |
| 250 | // proceed. |
| 251 | bool CheckMaxRestarts(); |
| 252 | |
[email protected] | 1c773ea1 | 2009-04-28 19:58:42 | [diff] [blame] | 253 | // Resets the connection and the request headers for resend. Called when |
| 254 | // ShouldResendRequest() is true. |
| 255 | void ResetConnectionAndRequestForResend(); |
[email protected] | 2a5c76b | 2008-09-25 22:15:16 | [diff] [blame] | 256 | |
[email protected] | f9ee6b5 | 2008-11-08 06:46:23 | [diff] [blame] | 257 | // Sets up the state machine to restart the transaction with auth. |
| 258 | void PrepareForAuthRestart(HttpAuth::Target target); |
| 259 | |
[email protected] | 2d2697f9 | 2009-02-18 21:00:32 | [diff] [blame] | 260 | // Called when we don't need to drain the response body or have drained it. |
| 261 | // Resets |connection_| unless |keep_alive| is true, then calls |
| 262 | // ResetStateForRestart. Sets |next_state_| appropriately. |
| 263 | void DidDrainBodyForAuthRestart(bool keep_alive); |
| 264 | |
[email protected] | f9ee6b5 | 2008-11-08 06:46:23 | [diff] [blame] | 265 | // Resets the members of the transaction so it can be restarted. |
[email protected] | c3b35c2 | 2008-09-27 03:19:42 | [diff] [blame] | 266 | void ResetStateForRestart(); |
| 267 | |
[email protected] | 697ef4c | 2010-10-14 16:38:58 | [diff] [blame] | 268 | // Resets the members of the transaction, except |stream_|, which needs |
| 269 | // to be maintained for multi-round auth. |
| 270 | void ResetStateForAuthRestart(); |
| 271 | |
zhongyi | ca364fbb | 2015-12-12 03:39:12 | [diff] [blame] | 272 | // Caches network error details from the stream if available |
| 273 | // and resets the stream. |
| 274 | void CacheNetErrorDetailsAndResetStream(); |
| 275 | |
[email protected] | 1c773ea1 | 2009-04-28 19:58:42 | [diff] [blame] | 276 | // Returns true if we should try to add a Proxy-Authorization header |
| 277 | bool ShouldApplyProxyAuth() const; |
[email protected] | c3b35c2 | 2008-09-27 03:19:42 | [diff] [blame] | 278 | |
[email protected] | 1c773ea1 | 2009-04-28 19:58:42 | [diff] [blame] | 279 | // Returns true if we should try to add an Authorization header. |
| 280 | bool ShouldApplyServerAuth() const; |
| 281 | |
[email protected] | f9ee6b5 | 2008-11-08 06:46:23 | [diff] [blame] | 282 | // Handles HTTP status code 401 or 407. |
[email protected] | 0757e770 | 2009-03-27 04:00:22 | [diff] [blame] | 283 | // HandleAuthChallenge() returns a network error code, or OK on success. |
| 284 | // May update |pending_auth_target_| or |response_.auth_challenge|. |
[email protected] | e772db3f | 2010-07-12 18:11:13 | [diff] [blame] | 285 | int HandleAuthChallenge(); |
[email protected] | f9ee6b5 | 2008-11-08 06:46:23 | [diff] [blame] | 286 | |
[email protected] | 8e6441ca | 2010-08-19 05:56:38 | [diff] [blame] | 287 | // Returns true if we have auth credentials for the given target. |
| 288 | bool HaveAuth(HttpAuth::Target target) const; |
[email protected] | c3b35c2 | 2008-09-27 03:19:42 | [diff] [blame] | 289 | |
[email protected] | 228404f | 2010-06-24 04:31:41 | [diff] [blame] | 290 | // Get the {scheme, host, path, port} for the authentication target |
| 291 | GURL AuthURL(HttpAuth::Target target) const; |
[email protected] | 044de064 | 2010-06-17 10:42:15 | [diff] [blame] | 292 | |
[email protected] | 831e4a3 | 2013-11-14 02:14:44 | [diff] [blame] | 293 | // Returns true if this transaction is for a WebSocket handshake |
| 294 | bool ForWebSocketHandshake() const; |
| 295 | |
ttuttle | 1f2d7e9 | 2015-04-28 16:17:47 | [diff] [blame] | 296 | void CopyConnectionAttemptsFromStreamRequest(); |
| 297 | |
eustas | c7d27da | 2017-04-06 10:33:20 | [diff] [blame] | 298 | // Returns true if response "Content-Encoding" headers respect |
| 299 | // "Accept-Encoding". |
| 300 | bool ContentEncodingsValid() const; |
| 301 | |
[email protected] | e772db3f | 2010-07-12 18:11:13 | [diff] [blame] | 302 | scoped_refptr<HttpAuthController> |
| 303 | auth_controllers_[HttpAuth::AUTH_NUM_TARGETS]; |
[email protected] | c3b35c2 | 2008-09-27 03:19:42 | [diff] [blame] | 304 | |
[email protected] | 0757e770 | 2009-03-27 04:00:22 | [diff] [blame] | 305 | // Whether this transaction is waiting for proxy auth, server auth, or is |
| 306 | // not waiting for any auth at all. |pending_auth_target_| is read and |
| 307 | // cleared by RestartWithAuth(). |
| 308 | HttpAuth::Target pending_auth_target_; |
| 309 | |
[email protected] | 49639fa | 2011-12-20 23:22:41 | [diff] [blame] | 310 | CompletionCallback io_callback_; |
| 311 | CompletionCallback callback_; |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 312 | |
[email protected] | 3fe8d2f8 | 2013-10-17 08:56:07 | [diff] [blame] | 313 | HttpNetworkSession* session_; |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 314 | |
tfarina | 4283411 | 2016-09-22 13:38:20 | [diff] [blame] | 315 | NetLogWithSource net_log_; |
shivanisha | 0b44085 | 2016-10-18 15:48:15 | [diff] [blame] | 316 | |
| 317 | // Reset to null at the start of the Read state machine. |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 318 | const HttpRequestInfo* request_; |
shivanisha | 0b44085 | 2016-10-18 15:48:15 | [diff] [blame] | 319 | |
| 320 | // The requested URL. |
| 321 | GURL url_; |
[email protected] | 262eec8 | 2013-03-19 21:01:36 | [diff] [blame] | 322 | RequestPriority priority_; |
[email protected] | a7e4131 | 2009-12-16 23:18:14 | [diff] [blame] | 323 | HttpResponseInfo response_; |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 324 | |
[email protected] | 102e27c | 2011-02-23 01:01:31 | [diff] [blame] | 325 | // |proxy_info_| is the ProxyInfo used by the HttpStreamRequest. |
[email protected] | 928fb58 | 2008-08-11 15:40:23 | [diff] [blame] | 326 | ProxyInfo proxy_info_; |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 327 | |
danakj | 1fd259a0 | 2016-04-16 03:17:09 | [diff] [blame] | 328 | std::unique_ptr<HttpStreamRequest> stream_request_; |
| 329 | std::unique_ptr<HttpStream> stream_; |
[email protected] | 8e6441ca | 2010-08-19 05:56:38 | [diff] [blame] | 330 | |
[email protected] | 0877e3d | 2009-10-17 22:29:57 | [diff] [blame] | 331 | // True if we've validated the headers that the stream parser has returned. |
| 332 | bool headers_valid_; |
| 333 | |
Steven Valdez | b4ff041 | 2018-01-18 22:39:27 | [diff] [blame] | 334 | // True if we can send the request over early data. |
| 335 | bool can_send_early_data_; |
| 336 | |
David Benjamin | 76a40ad | 2018-02-24 22:22:08 | [diff] [blame] | 337 | // True if |server_ssl_config_.client_cert| was looked up from the |
| 338 | // SSLClientAuthCache, rather than provided externally by the caller. |
| 339 | bool server_ssl_client_cert_was_cached_; |
| 340 | |
David Benjamin | 5cb9113 | 2018-04-06 05:54:49 | [diff] [blame] | 341 | // SSL configuration used for the server and proxy, respectively. Note |
| 342 | // |server_ssl_config_| may be updated from the HttpStreamFactory, which will |
| 343 | // be applied on retry. |
| 344 | // |
| 345 | // TODO(davidben): Mutating it is weird and relies on HttpStreamFactory |
| 346 | // modifications being idempotent. Address this as part of other work to make |
| 347 | // sense of SSLConfig (related to https://crbug.com/488043). |
[email protected] | 102957f | 2011-09-02 17:10:14 | [diff] [blame] | 348 | SSLConfig server_ssl_config_; |
| 349 | SSLConfig proxy_ssl_config_; |
[email protected] | c5949a3 | 2008-10-08 17:28:23 | [diff] [blame] | 350 | |
nharper | d6e6582 | 2016-03-30 23:05:48 | [diff] [blame] | 351 | // Keys to use for signing message in Token Binding header. |
danakj | 1fd259a0 | 2016-04-16 03:17:09 | [diff] [blame] | 352 | std::unique_ptr<crypto::ECPrivateKey> provided_token_binding_key_; |
| 353 | std::unique_ptr<crypto::ECPrivateKey> referred_token_binding_key_; |
nharper | d6e6582 | 2016-03-30 23:05:48 | [diff] [blame] | 354 | // Object to manage lookup of |provided_token_binding_key_| and |
| 355 | // |referred_token_binding_key_|. |
nharper | b7441ef | 2016-01-25 23:54:14 | [diff] [blame] | 356 | ChannelIDService::Request token_binding_request_; |
| 357 | |
[email protected] | b94f92d | 2010-10-27 16:45:20 | [diff] [blame] | 358 | HttpRequestHeaders request_headers_; |
[email protected] | 4ddaf250 | 2008-10-23 18:26:19 | [diff] [blame] | 359 | |
[email protected] | 2d2697f9 | 2009-02-18 21:00:32 | [diff] [blame] | 360 | // The size in bytes of the buffer we use to drain the response body that |
| 361 | // we want to throw away. The response body is typically a small error |
| 362 | // page just a few hundred bytes long. |
[email protected] | 81854c4 | 2010-09-22 03:39:36 | [diff] [blame] | 363 | static const int kDrainBodyBufferSize = 1024; |
[email protected] | 2d2697f9 | 2009-02-18 21:00:32 | [diff] [blame] | 364 | |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 365 | // User buffer and length passed to the Read method. |
[email protected] | 9dea9e1f | 2009-01-29 00:30:47 | [diff] [blame] | 366 | scoped_refptr<IOBuffer> read_buf_; |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 367 | int read_buf_len_; |
| 368 | |
sclittle | fb24989 | 2015-09-10 21:33:22 | [diff] [blame] | 369 | // Total number of bytes received on all destroyed HttpStreams for this |
| 370 | // transaction. |
sclittle | 4de1bab9 | 2015-09-22 21:28:24 | [diff] [blame] | 371 | int64_t total_received_bytes_; |
[email protected] | b8015c4 | 2013-12-24 15:18:19 | [diff] [blame] | 372 | |
sclittle | fb24989 | 2015-09-10 21:33:22 | [diff] [blame] | 373 | // Total number of bytes sent on all destroyed HttpStreams for this |
| 374 | // transaction. |
| 375 | int64_t total_sent_bytes_; |
| 376 | |
[email protected] | 58e32bb | 2013-01-21 18:23:25 | [diff] [blame] | 377 | // When the transaction started / finished sending the request, including |
| 378 | // the body, if present. |
| 379 | base::TimeTicks send_start_time_; |
| 380 | base::TimeTicks send_end_time_; |
| 381 | |
[email protected] | d207a5f | 2009-06-04 05:28:40 | [diff] [blame] | 382 | // The next state in the state machine. |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 383 | State next_state_; |
[email protected] | 2ff8b31 | 2010-04-26 22:20:54 | [diff] [blame] | 384 | |
[email protected] | a7ea883 | 2010-07-12 17:54:54 | [diff] [blame] | 385 | // True when the tunnel is in the process of being established - we can't |
| 386 | // read from the socket until the tunnel is done. |
| 387 | bool establishing_tunnel_; |
| 388 | |
bnc | 8016c1f | 2017-03-31 02:11:29 | [diff] [blame] | 389 | // Enable pooling to a SpdySession with matching IP and certificate |
| 390 | // even if the SpdySessionKey is different. |
| 391 | bool enable_ip_based_pooling_; |
| 392 | |
bnc | accd496 | 2017-04-06 21:00:26 | [diff] [blame] | 393 | // Enable using alternative services for the request. |
| 394 | bool enable_alternative_services_; |
| 395 | |
rch | 2f2991c | 2017-04-13 19:28:17 | [diff] [blame] | 396 | // When a request is retried because of errors with the alternative service, |
| 397 | // this will store the alternative service used. |
| 398 | AlternativeService retried_alternative_service_; |
| 399 | |
[email protected] | 831e4a3 | 2013-11-14 02:14:44 | [diff] [blame] | 400 | // The helper object to use to create WebSocketHandshakeStreamBase |
| 401 | // objects. Only relevant when establishing a WebSocket connection. |
| 402 | WebSocketHandshakeStreamBase::CreateHelper* |
| 403 | websocket_handshake_stream_base_create_helper_; |
| 404 | |
[email protected] | 1826a40 | 2014-01-08 15:40:48 | [diff] [blame] | 405 | BeforeNetworkStartCallback before_network_start_callback_; |
ryansturm | 49a8cb1 | 2016-06-15 16:51:09 | [diff] [blame] | 406 | BeforeHeadersSentCallback before_headers_sent_callback_; |
Andrey Kosyakov | 83a6eee | 2017-08-14 19:20:04 | [diff] [blame] | 407 | RequestHeadersCallback request_headers_callback_; |
Andrey Kosyakov | 2e893e6 | 2017-08-31 17:00:52 | [diff] [blame] | 408 | ResponseHeadersCallback response_headers_callback_; |
[email protected] | 1826a40 | 2014-01-08 15:40:48 | [diff] [blame] | 409 | |
ttuttle | 1f2d7e9 | 2015-04-28 16:17:47 | [diff] [blame] | 410 | ConnectionAttempts connection_attempts_; |
ttuttle | d9dbc65 | 2015-09-29 20:00:59 | [diff] [blame] | 411 | IPEndPoint remote_endpoint_; |
zhongyi | ca364fbb | 2015-12-12 03:39:12 | [diff] [blame] | 412 | // Network error details for this transaction. |
| 413 | NetErrorDetails net_error_details_; |
rdsmith | 1d343be5 | 2016-10-21 20:37:50 | [diff] [blame] | 414 | |
Biljith Jayan | 45a4172 | 2017-08-16 18:43:14 | [diff] [blame] | 415 | // Number of retries made for network errors like ERR_SPDY_PING_FAILED, |
| 416 | // ERR_SPDY_SERVER_REFUSED_STREAM, ERR_QUIC_HANDSHAKE_FAILED and |
| 417 | // ERR_QUIC_PROTOCOL_ERROR. Currently we stop after 3 tries |
| 418 | // (including the initial request) and fail the request. |
| 419 | // This count excludes retries on reused sockets since a well |
| 420 | // behaved server may time those out and thus the number |
| 421 | // of times we can retry a request on reused sockets is limited. |
| 422 | size_t retry_attempts_; |
| 423 | |
David Benjamin | 83ddfb3 | 2018-03-30 01:07:52 | [diff] [blame] | 424 | // Number of times the transaction was restarted via a RestartWith* call. |
| 425 | size_t num_restarts_; |
| 426 | |
David Benjamin | 5cb9113 | 2018-04-06 05:54:49 | [diff] [blame] | 427 | // The net::Error which triggered a TLS 1.3 version interference probe, or OK |
| 428 | // if none was triggered. |
| 429 | int ssl_version_interference_error_; |
| 430 | |
[email protected] | 2ff8b31 | 2010-04-26 22:20:54 | [diff] [blame] | 431 | DISALLOW_COPY_AND_ASSIGN(HttpNetworkTransaction); |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 432 | }; |
| 433 | |
| 434 | } // namespace net |
| 435 | |
| 436 | #endif // NET_HTTP_HTTP_NETWORK_TRANSACTION_H_ |