[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" |
Bence Béky | 046f8c8 | 2018-06-12 02:26:04 | [diff] [blame^] | 18 | #include "net/base/completion_once_callback.h" |
Bence Béky | 61f756c | 2018-04-25 14:17:53 | [diff] [blame] | 19 | #include "net/base/completion_repeating_callback.h" |
zhongyi | 48704c18 | 2015-12-07 07:52:02 | [diff] [blame] | 20 | #include "net/base/net_error_details.h" |
bnc | 81c46c1f | 2016-10-04 16:25:59 | [diff] [blame] | 21 | #include "net/base/net_export.h" |
[email protected] | 8e6441ca | 2010-08-19 05:56:38 | [diff] [blame] | 22 | #include "net/base/request_priority.h" |
[email protected] | c3b35c2 | 2008-09-27 03:19:42 | [diff] [blame] | 23 | #include "net/http/http_auth.h" |
[email protected] | b94f92d | 2010-10-27 16:45:20 | [diff] [blame] | 24 | #include "net/http/http_request_headers.h" |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 25 | #include "net/http/http_response_info.h" |
[email protected] | 102e27c | 2011-02-23 01:01:31 | [diff] [blame] | 26 | #include "net/http/http_stream_factory.h" |
Bence Béky | 6b44abf | 2018-04-11 10:32:51 | [diff] [blame] | 27 | #include "net/http/http_stream_request.h" |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 28 | #include "net/http/http_transaction.h" |
mikecirone | f22f981 | 2016-10-04 03:40:19 | [diff] [blame] | 29 | #include "net/log/net_log_with_source.h" |
Lily Houghton | ffe89daa0 | 2018-03-09 18:30:03 | [diff] [blame] | 30 | #include "net/proxy_resolution/proxy_resolution_service.h" |
ttuttle | 1f2d7e9 | 2015-04-28 16:17:47 | [diff] [blame] | 31 | #include "net/socket/connection_attempts.h" |
nharper | b7441ef | 2016-01-25 23:54:14 | [diff] [blame] | 32 | #include "net/ssl/channel_id_service.h" |
[email protected] | 536fd0b | 2013-03-14 17:41:57 | [diff] [blame] | 33 | #include "net/ssl/ssl_config_service.h" |
[email protected] | 831e4a3 | 2013-11-14 02:14:44 | [diff] [blame] | 34 | #include "net/websockets/websocket_handshake_stream_base.h" |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 35 | |
nharper | b7441ef | 2016-01-25 23:54:14 | [diff] [blame] | 36 | namespace crypto { |
| 37 | class ECPrivateKey; |
| 38 | } |
| 39 | |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 40 | namespace net { |
| 41 | |
xunjieli | 5749218c | 2016-03-22 16:43:06 | [diff] [blame] | 42 | class BidirectionalStreamImpl; |
[email protected] | 8e6441ca | 2010-08-19 05:56:38 | [diff] [blame] | 43 | class HttpAuthController; |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 44 | class HttpNetworkSession; |
yhirano | a7e05bb | 2014-11-06 05:40:39 | [diff] [blame] | 45 | class HttpStream; |
[email protected] | 8e6441ca | 2010-08-19 05:56:38 | [diff] [blame] | 46 | class IOBuffer; |
[email protected] | 597a1ab | 2014-06-26 08:12:27 | [diff] [blame] | 47 | class ProxyInfo; |
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, |
Helen Li | b495c380 | 2018-03-30 13:46:09 | [diff] [blame] | 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, |
Bence Béky | 046f8c8 | 2018-06-12 02:26:04 | [diff] [blame^] | 62 | CompletionOnceCallback callback, |
tfarina | 4283411 | 2016-09-22 13:38:20 | [diff] [blame] | 63 | const NetLogWithSource& net_log) override; |
Bence Béky | 046f8c8 | 2018-06-12 02:26:04 | [diff] [blame^] | 64 | int RestartIgnoringLastError(CompletionOnceCallback callback) override; |
mattm | 436ccfe | 2017-06-19 20:24:08 | [diff] [blame] | 65 | int RestartWithCertificate(scoped_refptr<X509Certificate> client_cert, |
| 66 | scoped_refptr<SSLPrivateKey> client_private_key, |
Bence Béky | 046f8c8 | 2018-06-12 02:26:04 | [diff] [blame^] | 67 | CompletionOnceCallback callback) override; |
dcheng | b03027d | 2014-10-21 12:00:20 | [diff] [blame] | 68 | int RestartWithAuth(const AuthCredentials& credentials, |
Bence Béky | 046f8c8 | 2018-06-12 02:26:04 | [diff] [blame^] | 69 | CompletionOnceCallback callback) override; |
dcheng | b03027d | 2014-10-21 12:00:20 | [diff] [blame] | 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, |
Bence Béky | 046f8c8 | 2018-06-12 02:26:04 | [diff] [blame^] | 74 | CompletionOnceCallback callback) override; |
dcheng | b03027d | 2014-10-21 12:00:20 | [diff] [blame] | 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; |
Andrey Kosyakov | 2e893e6 | 2017-08-31 17:00:52 | [diff] [blame] | 93 | void SetRequestHeadersCallback(RequestHeadersCallback callback) override; |
| 94 | void SetResponseHeadersCallback(ResponseHeadersCallback callback) override; |
Andrey Kosyakov | 83a6eee | 2017-08-14 19:20:04 | [diff] [blame] | 95 | |
dcheng | b03027d | 2014-10-21 12:00:20 | [diff] [blame] | 96 | int ResumeNetworkStart() override; |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 97 | |
[email protected] | 102e27c | 2011-02-23 01:01:31 | [diff] [blame] | 98 | // HttpStreamRequest::Delegate methods: |
dcheng | b03027d | 2014-10-21 12:00:20 | [diff] [blame] | 99 | void OnStreamReady(const SSLConfig& used_ssl_config, |
| 100 | const ProxyInfo& used_proxy_info, |
bnc | 5029f463 | 2017-06-08 16:19:00 | [diff] [blame] | 101 | std::unique_ptr<HttpStream> stream) override; |
| 102 | void OnBidirectionalStreamImplReady( |
| 103 | const SSLConfig& used_ssl_config, |
| 104 | const ProxyInfo& used_proxy_info, |
| 105 | std::unique_ptr<BidirectionalStreamImpl> stream) override; |
dcheng | b03027d | 2014-10-21 12:00:20 | [diff] [blame] | 106 | void OnWebSocketHandshakeStreamReady( |
[email protected] | 3732cea | 2013-06-21 06:50:50 | [diff] [blame] | 107 | const SSLConfig& used_ssl_config, |
| 108 | const ProxyInfo& used_proxy_info, |
bnc | 5029f463 | 2017-06-08 16:19:00 | [diff] [blame] | 109 | std::unique_ptr<WebSocketHandshakeStreamBase> stream) override; |
Ryan Hamilton | 75f19726 | 2017-08-17 14:00:07 | [diff] [blame] | 110 | void OnStreamFailed(int status, |
| 111 | const NetErrorDetails& net_error_details, |
| 112 | const SSLConfig& used_ssl_config) override; |
dcheng | b03027d | 2014-10-21 12:00:20 | [diff] [blame] | 113 | void OnCertificateError(int status, |
| 114 | const SSLConfig& used_ssl_config, |
| 115 | const SSLInfo& ssl_info) override; |
| 116 | void OnNeedsProxyAuth(const HttpResponseInfo& response_info, |
| 117 | const SSLConfig& used_ssl_config, |
| 118 | const ProxyInfo& used_proxy_info, |
| 119 | HttpAuthController* auth_controller) override; |
| 120 | void OnNeedsClientAuth(const SSLConfig& used_ssl_config, |
| 121 | SSLCertRequestInfo* cert_info) override; |
| 122 | void OnHttpsProxyTunnelResponse(const HttpResponseInfo& response_info, |
[email protected] | 102e27c | 2011-02-23 01:01:31 | [diff] [blame] | 123 | const SSLConfig& used_ssl_config, |
dcheng | b03027d | 2014-10-21 12:00:20 | [diff] [blame] | 124 | const ProxyInfo& used_proxy_info, |
Bence Béky | 6d05ebd | 2017-05-16 00:09:01 | [diff] [blame] | 125 | std::unique_ptr<HttpStream> stream) override; |
[email protected] | 8e6441ca | 2010-08-19 05:56:38 | [diff] [blame] | 126 | |
zhongyi | 48704c18 | 2015-12-07 07:52:02 | [diff] [blame] | 127 | void OnQuicBroken() override; |
ttuttle | 1f2d7e9 | 2015-04-28 16:17:47 | [diff] [blame] | 128 | void GetConnectionAttempts(ConnectionAttempts* out) const override; |
| 129 | |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 130 | private: |
bnc | 1f61cdf | 2016-11-28 18:03:45 | [diff] [blame] | 131 | FRIEND_TEST_ALL_PREFIXES(HttpNetworkTransactionTest, ResetStateForRestart); |
Bence Béky | 2fcf4fa | 2018-04-06 20:06:01 | [diff] [blame] | 132 | FRIEND_TEST_ALL_PREFIXES(HttpNetworkTransactionTest, |
| 133 | CreateWebSocketHandshakeStream); |
Nick Harper | 1e5757d4 | 2018-05-02 23:08:57 | [diff] [blame] | 134 | FRIEND_TEST_ALL_PREFIXES(HttpNetworkTransactionSSLTest, ChannelID); |
bnc | 1f61cdf | 2016-11-28 18:03:45 | [diff] [blame] | 135 | FRIEND_TEST_ALL_PREFIXES(SpdyNetworkTransactionTest, WindowUpdateReceived); |
| 136 | FRIEND_TEST_ALL_PREFIXES(SpdyNetworkTransactionTest, WindowUpdateSent); |
| 137 | FRIEND_TEST_ALL_PREFIXES(SpdyNetworkTransactionTest, WindowUpdateOverflow); |
| 138 | FRIEND_TEST_ALL_PREFIXES(SpdyNetworkTransactionTest, 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 | |
David Benjamin | 76a40ad | 2018-02-24 22:22:08 | [diff] [blame] | 231 | // Called to possibly handle a client authentication error. Sets next_state_ |
[email protected] | bd0b677 | 2011-01-11 19:59:30 | [diff] [blame] | 232 | // and returns OK if recovering from the error. Otherwise, the same error |
| 233 | // code is returned. |
David Benjamin | 76a40ad | 2018-02-24 22:22:08 | [diff] [blame] | 234 | int HandleSSLClientAuthError(int error); |
[email protected] | bd0b677 | 2011-01-11 19:59:30 | [diff] [blame] | 235 | |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 236 | // Called to possibly recover from the given error. Sets next_state_ and |
| 237 | // returns OK if recovering from the error. Otherwise, the same error code |
| 238 | // is returned. |
| 239 | int HandleIOError(int error); |
| 240 | |
[email protected] | 0877e3d | 2009-10-17 22:29:57 | [diff] [blame] | 241 | // Gets the response headers from the HttpStream. |
| 242 | HttpResponseHeaders* GetResponseHeaders() const; |
| 243 | |
[email protected] | a34f61ee | 2014-03-18 20:59:49 | [diff] [blame] | 244 | // Called when the socket is unexpectedly closed. Returns true if the request |
| 245 | // should be resent in case of a socket reuse/close race. |
| 246 | bool ShouldResendRequest() const; |
[email protected] | 1c773ea1 | 2009-04-28 19:58:42 | [diff] [blame] | 247 | |
Biljith Jayan | 45a4172 | 2017-08-16 18:43:14 | [diff] [blame] | 248 | // Returns true if there have already been |kMaxRetryAttempts| retries for |
| 249 | // HTTP2 or QUIC network errors, and no further retries should be attempted. |
| 250 | bool HasExceededMaxRetries() const; |
| 251 | |
David Benjamin | 83ddfb3 | 2018-03-30 01:07:52 | [diff] [blame] | 252 | // Increments the number of restarts and returns true if the restart may |
| 253 | // proceed. |
| 254 | bool CheckMaxRestarts(); |
| 255 | |
[email protected] | 1c773ea1 | 2009-04-28 19:58:42 | [diff] [blame] | 256 | // Resets the connection and the request headers for resend. Called when |
| 257 | // ShouldResendRequest() is true. |
| 258 | void ResetConnectionAndRequestForResend(); |
[email protected] | 2a5c76b | 2008-09-25 22:15:16 | [diff] [blame] | 259 | |
[email protected] | f9ee6b5 | 2008-11-08 06:46:23 | [diff] [blame] | 260 | // Sets up the state machine to restart the transaction with auth. |
| 261 | void PrepareForAuthRestart(HttpAuth::Target target); |
| 262 | |
[email protected] | 2d2697f9 | 2009-02-18 21:00:32 | [diff] [blame] | 263 | // Called when we don't need to drain the response body or have drained it. |
| 264 | // Resets |connection_| unless |keep_alive| is true, then calls |
| 265 | // ResetStateForRestart. Sets |next_state_| appropriately. |
| 266 | void DidDrainBodyForAuthRestart(bool keep_alive); |
| 267 | |
[email protected] | f9ee6b5 | 2008-11-08 06:46:23 | [diff] [blame] | 268 | // Resets the members of the transaction so it can be restarted. |
[email protected] | c3b35c2 | 2008-09-27 03:19:42 | [diff] [blame] | 269 | void ResetStateForRestart(); |
| 270 | |
[email protected] | 697ef4c | 2010-10-14 16:38:58 | [diff] [blame] | 271 | // Resets the members of the transaction, except |stream_|, which needs |
| 272 | // to be maintained for multi-round auth. |
| 273 | void ResetStateForAuthRestart(); |
| 274 | |
zhongyi | ca364fbb | 2015-12-12 03:39:12 | [diff] [blame] | 275 | // Caches network error details from the stream if available |
| 276 | // and resets the stream. |
| 277 | void CacheNetErrorDetailsAndResetStream(); |
| 278 | |
[email protected] | 1c773ea1 | 2009-04-28 19:58:42 | [diff] [blame] | 279 | // Returns true if we should try to add a Proxy-Authorization header |
| 280 | bool ShouldApplyProxyAuth() const; |
[email protected] | c3b35c2 | 2008-09-27 03:19:42 | [diff] [blame] | 281 | |
[email protected] | 1c773ea1 | 2009-04-28 19:58:42 | [diff] [blame] | 282 | // Returns true if we should try to add an Authorization header. |
| 283 | bool ShouldApplyServerAuth() const; |
| 284 | |
[email protected] | f9ee6b5 | 2008-11-08 06:46:23 | [diff] [blame] | 285 | // Handles HTTP status code 401 or 407. |
[email protected] | 0757e770 | 2009-03-27 04:00:22 | [diff] [blame] | 286 | // HandleAuthChallenge() returns a network error code, or OK on success. |
| 287 | // May update |pending_auth_target_| or |response_.auth_challenge|. |
[email protected] | e772db3f | 2010-07-12 18:11:13 | [diff] [blame] | 288 | int HandleAuthChallenge(); |
[email protected] | f9ee6b5 | 2008-11-08 06:46:23 | [diff] [blame] | 289 | |
[email protected] | 8e6441ca | 2010-08-19 05:56:38 | [diff] [blame] | 290 | // Returns true if we have auth credentials for the given target. |
| 291 | bool HaveAuth(HttpAuth::Target target) const; |
[email protected] | c3b35c2 | 2008-09-27 03:19:42 | [diff] [blame] | 292 | |
[email protected] | 228404f | 2010-06-24 04:31:41 | [diff] [blame] | 293 | // Get the {scheme, host, path, port} for the authentication target |
| 294 | GURL AuthURL(HttpAuth::Target target) const; |
[email protected] | 044de064 | 2010-06-17 10:42:15 | [diff] [blame] | 295 | |
[email protected] | 831e4a3 | 2013-11-14 02:14:44 | [diff] [blame] | 296 | // Returns true if this transaction is for a WebSocket handshake |
| 297 | bool ForWebSocketHandshake() const; |
| 298 | |
ttuttle | 1f2d7e9 | 2015-04-28 16:17:47 | [diff] [blame] | 299 | void CopyConnectionAttemptsFromStreamRequest(); |
| 300 | |
eustas | c7d27da | 2017-04-06 10:33:20 | [diff] [blame] | 301 | // Returns true if response "Content-Encoding" headers respect |
| 302 | // "Accept-Encoding". |
| 303 | bool ContentEncodingsValid() const; |
| 304 | |
[email protected] | e772db3f | 2010-07-12 18:11:13 | [diff] [blame] | 305 | scoped_refptr<HttpAuthController> |
| 306 | auth_controllers_[HttpAuth::AUTH_NUM_TARGETS]; |
[email protected] | c3b35c2 | 2008-09-27 03:19:42 | [diff] [blame] | 307 | |
[email protected] | 0757e770 | 2009-03-27 04:00:22 | [diff] [blame] | 308 | // Whether this transaction is waiting for proxy auth, server auth, or is |
| 309 | // not waiting for any auth at all. |pending_auth_target_| is read and |
| 310 | // cleared by RestartWithAuth(). |
| 311 | HttpAuth::Target pending_auth_target_; |
| 312 | |
Bence Béky | 61f756c | 2018-04-25 14:17:53 | [diff] [blame] | 313 | CompletionRepeatingCallback io_callback_; |
Bence Béky | 046f8c8 | 2018-06-12 02:26:04 | [diff] [blame^] | 314 | CompletionOnceCallback callback_; |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 315 | |
[email protected] | 3fe8d2f8 | 2013-10-17 08:56:07 | [diff] [blame] | 316 | HttpNetworkSession* session_; |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 317 | |
tfarina | 4283411 | 2016-09-22 13:38:20 | [diff] [blame] | 318 | NetLogWithSource net_log_; |
shivanisha | 0b44085 | 2016-10-18 15:48:15 | [diff] [blame] | 319 | |
| 320 | // Reset to null at the start of the Read state machine. |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 321 | const HttpRequestInfo* request_; |
shivanisha | 0b44085 | 2016-10-18 15:48:15 | [diff] [blame] | 322 | |
| 323 | // The requested URL. |
| 324 | GURL url_; |
[email protected] | 262eec8 | 2013-03-19 21:01:36 | [diff] [blame] | 325 | RequestPriority priority_; |
[email protected] | a7e4131 | 2009-12-16 23:18:14 | [diff] [blame] | 326 | HttpResponseInfo response_; |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 327 | |
[email protected] | 102e27c | 2011-02-23 01:01:31 | [diff] [blame] | 328 | // |proxy_info_| is the ProxyInfo used by the HttpStreamRequest. |
[email protected] | 928fb58 | 2008-08-11 15:40:23 | [diff] [blame] | 329 | ProxyInfo proxy_info_; |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 330 | |
danakj | 1fd259a0 | 2016-04-16 03:17:09 | [diff] [blame] | 331 | std::unique_ptr<HttpStreamRequest> stream_request_; |
| 332 | std::unique_ptr<HttpStream> stream_; |
[email protected] | 8e6441ca | 2010-08-19 05:56:38 | [diff] [blame] | 333 | |
[email protected] | 0877e3d | 2009-10-17 22:29:57 | [diff] [blame] | 334 | // True if we've validated the headers that the stream parser has returned. |
| 335 | bool headers_valid_; |
| 336 | |
Steven Valdez | b4ff041 | 2018-01-18 22:39:27 | [diff] [blame] | 337 | // True if we can send the request over early data. |
| 338 | bool can_send_early_data_; |
| 339 | |
David Benjamin | 76a40ad | 2018-02-24 22:22:08 | [diff] [blame] | 340 | // True if |server_ssl_config_.client_cert| was looked up from the |
| 341 | // SSLClientAuthCache, rather than provided externally by the caller. |
| 342 | bool server_ssl_client_cert_was_cached_; |
| 343 | |
David Benjamin | 5cb9113 | 2018-04-06 05:54:49 | [diff] [blame] | 344 | // SSL configuration used for the server and proxy, respectively. Note |
| 345 | // |server_ssl_config_| may be updated from the HttpStreamFactory, which will |
| 346 | // be applied on retry. |
| 347 | // |
| 348 | // TODO(davidben): Mutating it is weird and relies on HttpStreamFactory |
| 349 | // modifications being idempotent. Address this as part of other work to make |
| 350 | // sense of SSLConfig (related to https://crbug.com/488043). |
[email protected] | 102957f | 2011-09-02 17:10:14 | [diff] [blame] | 351 | SSLConfig server_ssl_config_; |
| 352 | SSLConfig proxy_ssl_config_; |
[email protected] | c5949a3 | 2008-10-08 17:28:23 | [diff] [blame] | 353 | |
nharper | d6e6582 | 2016-03-30 23:05:48 | [diff] [blame] | 354 | // Keys to use for signing message in Token Binding header. |
danakj | 1fd259a0 | 2016-04-16 03:17:09 | [diff] [blame] | 355 | std::unique_ptr<crypto::ECPrivateKey> provided_token_binding_key_; |
| 356 | std::unique_ptr<crypto::ECPrivateKey> referred_token_binding_key_; |
nharper | d6e6582 | 2016-03-30 23:05:48 | [diff] [blame] | 357 | // Object to manage lookup of |provided_token_binding_key_| and |
| 358 | // |referred_token_binding_key_|. |
nharper | b7441ef | 2016-01-25 23:54:14 | [diff] [blame] | 359 | ChannelIDService::Request token_binding_request_; |
| 360 | |
[email protected] | b94f92d | 2010-10-27 16:45:20 | [diff] [blame] | 361 | HttpRequestHeaders request_headers_; |
[email protected] | 4ddaf250 | 2008-10-23 18:26:19 | [diff] [blame] | 362 | |
[email protected] | 2d2697f9 | 2009-02-18 21:00:32 | [diff] [blame] | 363 | // The size in bytes of the buffer we use to drain the response body that |
| 364 | // we want to throw away. The response body is typically a small error |
| 365 | // page just a few hundred bytes long. |
[email protected] | 81854c4 | 2010-09-22 03:39:36 | [diff] [blame] | 366 | static const int kDrainBodyBufferSize = 1024; |
[email protected] | 2d2697f9 | 2009-02-18 21:00:32 | [diff] [blame] | 367 | |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 368 | // User buffer and length passed to the Read method. |
[email protected] | 9dea9e1f | 2009-01-29 00:30:47 | [diff] [blame] | 369 | scoped_refptr<IOBuffer> read_buf_; |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 370 | int read_buf_len_; |
| 371 | |
sclittle | fb24989 | 2015-09-10 21:33:22 | [diff] [blame] | 372 | // Total number of bytes received on all destroyed HttpStreams for this |
| 373 | // transaction. |
sclittle | 4de1bab9 | 2015-09-22 21:28:24 | [diff] [blame] | 374 | int64_t total_received_bytes_; |
[email protected] | b8015c4 | 2013-12-24 15:18:19 | [diff] [blame] | 375 | |
sclittle | fb24989 | 2015-09-10 21:33:22 | [diff] [blame] | 376 | // Total number of bytes sent on all destroyed HttpStreams for this |
| 377 | // transaction. |
| 378 | int64_t total_sent_bytes_; |
| 379 | |
[email protected] | 58e32bb | 2013-01-21 18:23:25 | [diff] [blame] | 380 | // When the transaction started / finished sending the request, including |
| 381 | // the body, if present. |
| 382 | base::TimeTicks send_start_time_; |
| 383 | base::TimeTicks send_end_time_; |
| 384 | |
[email protected] | d207a5f | 2009-06-04 05:28:40 | [diff] [blame] | 385 | // The next state in the state machine. |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 386 | State next_state_; |
[email protected] | 2ff8b31 | 2010-04-26 22:20:54 | [diff] [blame] | 387 | |
[email protected] | a7ea883 | 2010-07-12 17:54:54 | [diff] [blame] | 388 | // True when the tunnel is in the process of being established - we can't |
| 389 | // read from the socket until the tunnel is done. |
| 390 | bool establishing_tunnel_; |
| 391 | |
bnc | 8016c1f | 2017-03-31 02:11:29 | [diff] [blame] | 392 | // Enable pooling to a SpdySession with matching IP and certificate |
| 393 | // even if the SpdySessionKey is different. |
| 394 | bool enable_ip_based_pooling_; |
| 395 | |
bnc | accd496 | 2017-04-06 21:00:26 | [diff] [blame] | 396 | // Enable using alternative services for the request. |
| 397 | bool enable_alternative_services_; |
| 398 | |
rch | 2f2991c | 2017-04-13 19:28:17 | [diff] [blame] | 399 | // When a request is retried because of errors with the alternative service, |
| 400 | // this will store the alternative service used. |
| 401 | AlternativeService retried_alternative_service_; |
| 402 | |
[email protected] | 831e4a3 | 2013-11-14 02:14:44 | [diff] [blame] | 403 | // The helper object to use to create WebSocketHandshakeStreamBase |
| 404 | // objects. Only relevant when establishing a WebSocket connection. |
| 405 | WebSocketHandshakeStreamBase::CreateHelper* |
| 406 | websocket_handshake_stream_base_create_helper_; |
| 407 | |
[email protected] | 1826a40 | 2014-01-08 15:40:48 | [diff] [blame] | 408 | BeforeNetworkStartCallback before_network_start_callback_; |
ryansturm | 49a8cb1 | 2016-06-15 16:51:09 | [diff] [blame] | 409 | BeforeHeadersSentCallback before_headers_sent_callback_; |
Andrey Kosyakov | 83a6eee | 2017-08-14 19:20:04 | [diff] [blame] | 410 | RequestHeadersCallback request_headers_callback_; |
Andrey Kosyakov | 2e893e6 | 2017-08-31 17:00:52 | [diff] [blame] | 411 | ResponseHeadersCallback response_headers_callback_; |
[email protected] | 1826a40 | 2014-01-08 15:40:48 | [diff] [blame] | 412 | |
ttuttle | 1f2d7e9 | 2015-04-28 16:17:47 | [diff] [blame] | 413 | ConnectionAttempts connection_attempts_; |
ttuttle | d9dbc65 | 2015-09-29 20:00:59 | [diff] [blame] | 414 | IPEndPoint remote_endpoint_; |
zhongyi | ca364fbb | 2015-12-12 03:39:12 | [diff] [blame] | 415 | // Network error details for this transaction. |
| 416 | NetErrorDetails net_error_details_; |
rdsmith | 1d343be5 | 2016-10-21 20:37:50 | [diff] [blame] | 417 | |
Biljith Jayan | 45a4172 | 2017-08-16 18:43:14 | [diff] [blame] | 418 | // Number of retries made for network errors like ERR_SPDY_PING_FAILED, |
| 419 | // ERR_SPDY_SERVER_REFUSED_STREAM, ERR_QUIC_HANDSHAKE_FAILED and |
| 420 | // ERR_QUIC_PROTOCOL_ERROR. Currently we stop after 3 tries |
| 421 | // (including the initial request) and fail the request. |
| 422 | // This count excludes retries on reused sockets since a well |
| 423 | // behaved server may time those out and thus the number |
| 424 | // of times we can retry a request on reused sockets is limited. |
| 425 | size_t retry_attempts_; |
| 426 | |
David Benjamin | 83ddfb3 | 2018-03-30 01:07:52 | [diff] [blame] | 427 | // Number of times the transaction was restarted via a RestartWith* call. |
| 428 | size_t num_restarts_; |
| 429 | |
David Benjamin | 5cb9113 | 2018-04-06 05:54:49 | [diff] [blame] | 430 | // The net::Error which triggered a TLS 1.3 version interference probe, or OK |
| 431 | // if none was triggered. |
| 432 | int ssl_version_interference_error_; |
| 433 | |
[email protected] | 2ff8b31 | 2010-04-26 22:20:54 | [diff] [blame] | 434 | DISALLOW_COPY_AND_ASSIGN(HttpNetworkTransaction); |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 435 | }; |
| 436 | |
| 437 | } // namespace net |
| 438 | |
| 439 | #endif // NET_HTTP_HTTP_NETWORK_TRANSACTION_H_ |