blob: ec2b5cef2b5ceab041f6649923f8ce27962a2e80 [file] [log] [blame]
[email protected]448d4ca52012-03-04 04:12:231// Copyright (c) 2012 The Chromium Authors. All rights reserved.
license.botbf09a502008-08-24 00:55:552// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
initial.commit586acc5fe2008-07-26 22:42:524
5#ifndef NET_HTTP_HTTP_NETWORK_TRANSACTION_H_
6#define NET_HTTP_HTTP_NETWORK_TRANSACTION_H_
7
sclittlefb249892015-09-10 21:33:228#include <stdint.h>
9
danakj1fd259a02016-04-16 03:17:0910#include <memory>
[email protected]96d570e42008-08-05 22:43:0411#include <string>
12
[email protected]8822f382010-07-30 21:49:0313#include "base/gtest_prod_util.h"
Avi Drissman13fc8932015-12-20 04:40:4614#include "base/macros.h"
[email protected]3b63f8f42011-03-28 01:54:1515#include "base/memory/ref_counted.h"
[email protected]66e96c42013-06-28 15:20:3116#include "base/time/time.h"
nharperb7441ef2016-01-25 23:54:1417#include "crypto/ec_private_key.h"
zhongyi48704c182015-12-07 07:52:0218#include "net/base/net_error_details.h"
bnc81c46c1f2016-10-04 16:25:5919#include "net/base/net_export.h"
[email protected]8e6441ca2010-08-19 05:56:3820#include "net/base/request_priority.h"
[email protected]c3b35c22008-09-27 03:19:4221#include "net/http/http_auth.h"
[email protected]b94f92d2010-10-27 16:45:2022#include "net/http/http_request_headers.h"
initial.commit586acc5fe2008-07-26 22:42:5223#include "net/http/http_response_info.h"
[email protected]102e27c2011-02-23 01:01:3124#include "net/http/http_stream_factory.h"
initial.commit586acc5fe2008-07-26 22:42:5225#include "net/http/http_transaction.h"
mikecironef22f9812016-10-04 03:40:1926#include "net/log/net_log_with_source.h"
[email protected]928fb582008-08-11 15:40:2327#include "net/proxy/proxy_service.h"
ttuttle1f2d7e92015-04-28 16:17:4728#include "net/socket/connection_attempts.h"
nharperb7441ef2016-01-25 23:54:1429#include "net/ssl/channel_id_service.h"
[email protected]536fd0b2013-03-14 17:41:5730#include "net/ssl/ssl_config_service.h"
[email protected]831e4a32013-11-14 02:14:4431#include "net/websockets/websocket_handshake_stream_base.h"
initial.commit586acc5fe2008-07-26 22:42:5232
nharperb7441ef2016-01-25 23:54:1433namespace crypto {
34class ECPrivateKey;
35}
36
initial.commit586acc5fe2008-07-26 22:42:5237namespace net {
38
xunjieli5749218c2016-03-22 16:43:0639class BidirectionalStreamImpl;
[email protected]3732cea2013-06-21 06:50:5040class ClientSocketHandle;
[email protected]8e6441ca2010-08-19 05:56:3841class HttpAuthController;
initial.commit586acc5fe2008-07-26 22:42:5242class HttpNetworkSession;
yhiranoa7e05bb2014-11-06 05:40:3943class HttpStream;
[email protected]4d4a5162010-09-21 22:44:0444class HttpStreamRequest;
[email protected]8e6441ca2010-08-19 05:56:3845class IOBuffer;
[email protected]597a1ab2014-06-26 08:12:2746class ProxyInfo;
[email protected]3732cea2013-06-21 06:50:5047class SpdySession;
svaldez7872fd02015-11-19 21:10:5448class SSLPrivateKey;
[email protected]82918cc2010-08-25 17:24:5049struct HttpRequestInfo;
initial.commit586acc5fe2008-07-26 22:42:5250
[email protected]172da1b2011-08-12 15:52:2651class NET_EXPORT_PRIVATE HttpNetworkTransaction
52 : public HttpTransaction,
53 public HttpStreamRequest::Delegate {
initial.commit586acc5fe2008-07-26 22:42:5254 public:
[email protected]262eec82013-03-19 21:01:3655 HttpNetworkTransaction(RequestPriority priority,
56 HttpNetworkSession* session);
initial.commit586acc5fe2008-07-26 22:42:5257
dchengb03027d2014-10-21 12:00:2058 ~HttpNetworkTransaction() override;
[email protected]af4876d2008-10-21 23:10:5759
initial.commit586acc5fe2008-07-26 22:42:5260 // HttpTransaction methods:
dchengb03027d2014-10-21 12:00:2061 int Start(const HttpRequestInfo* request_info,
62 const CompletionCallback& callback,
tfarina42834112016-09-22 13:38:2063 const NetLogWithSource& net_log) override;
dchengb03027d2014-10-21 12:00:2064 int RestartIgnoringLastError(const CompletionCallback& callback) override;
65 int RestartWithCertificate(X509Certificate* client_cert,
svaldez7872fd02015-11-19 21:10:5466 SSLPrivateKey* client_private_key,
dchengb03027d2014-10-21 12:00:2067 const CompletionCallback& callback) override;
68 int RestartWithAuth(const AuthCredentials& credentials,
69 const CompletionCallback& callback) override;
70 bool IsReadyToRestartForAuth() override;
[email protected]0757e7702009-03-27 04:00:2271
dchengb03027d2014-10-21 12:00:2072 int Read(IOBuffer* buf,
73 int buf_len,
74 const CompletionCallback& callback) override;
75 void StopCaching() override;
76 bool GetFullRequestHeaders(HttpRequestHeaders* headers) const override;
sclittle4de1bab92015-09-22 21:28:2477 int64_t GetTotalReceivedBytes() const override;
sclittlefb249892015-09-10 21:33:2278 int64_t GetTotalSentBytes() const override;
dchengb03027d2014-10-21 12:00:2079 void DoneReading() override;
80 const HttpResponseInfo* GetResponseInfo() const override;
81 LoadState GetLoadState() const override;
dchengb03027d2014-10-21 12:00:2082 void SetQuicServerInfo(QuicServerInfo* quic_server_info) override;
83 bool GetLoadTimingInfo(LoadTimingInfo* load_timing_info) const override;
ttuttled9dbc652015-09-29 20:00:5984 bool GetRemoteEndpoint(IPEndPoint* endpoint) const override;
zhongyi48704c182015-12-07 07:52:0285 void PopulateNetErrorDetails(NetErrorDetails* details) const override;
dchengb03027d2014-10-21 12:00:2086 void SetPriority(RequestPriority priority) override;
87 void SetWebSocketHandshakeStreamCreateHelper(
mostynbba063d6032014-10-09 11:01:1388 WebSocketHandshakeStreamBase::CreateHelper* create_helper) override;
dchengb03027d2014-10-21 12:00:2089 void SetBeforeNetworkStartCallback(
mostynbba063d6032014-10-09 11:01:1390 const BeforeNetworkStartCallback& callback) override;
ryansturm49a8cb12016-06-15 16:51:0991 void SetBeforeHeadersSentCallback(
92 const BeforeHeadersSentCallback& callback) override;
dchengb03027d2014-10-21 12:00:2093 int ResumeNetworkStart() override;
initial.commit586acc5fe2008-07-26 22:42:5294
[email protected]102e27c2011-02-23 01:01:3195 // HttpStreamRequest::Delegate methods:
dchengb03027d2014-10-21 12:00:2096 void OnStreamReady(const SSLConfig& used_ssl_config,
97 const ProxyInfo& used_proxy_info,
yhiranoa7e05bb2014-11-06 05:40:3998 HttpStream* stream) override;
xunjieli5749218c2016-03-22 16:43:0699 void OnBidirectionalStreamImplReady(const SSLConfig& used_ssl_config,
100 const ProxyInfo& used_proxy_info,
101 BidirectionalStreamImpl* stream) override;
dchengb03027d2014-10-21 12:00:20102 void OnWebSocketHandshakeStreamReady(
[email protected]3732cea2013-06-21 06:50:50103 const SSLConfig& used_ssl_config,
104 const ProxyInfo& used_proxy_info,
mostynbba063d6032014-10-09 11:01:13105 WebSocketHandshakeStreamBase* stream) override;
davidben849365422016-06-24 19:04:13106 void OnStreamFailed(int status, const SSLConfig& used_ssl_config) override;
dchengb03027d2014-10-21 12:00:20107 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]102e27c2011-02-23 01:01:31117 const SSLConfig& used_ssl_config,
dchengb03027d2014-10-21 12:00:20118 const ProxyInfo& used_proxy_info,
yhiranoa7e05bb2014-11-06 05:40:39119 HttpStream* stream) override;
[email protected]8e6441ca2010-08-19 05:56:38120
zhongyi48704c182015-12-07 07:52:02121 void OnQuicBroken() override;
ttuttle1f2d7e92015-04-28 16:17:47122 void GetConnectionAttempts(ConnectionAttempts* out) const override;
123
initial.commit586acc5fe2008-07-26 22:42:52124 private:
[email protected]158ac972013-04-19 23:29:23125 friend class HttpNetworkTransactionSSLTest;
126
[email protected]23e482282013-06-14 16:08:02127 FRIEND_TEST_ALL_PREFIXES(HttpNetworkTransactionTest,
[email protected]448d4ca52012-03-04 04:12:23128 ResetStateForRestart);
bncf4588402015-11-24 13:33:18129 FRIEND_TEST_ALL_PREFIXES(HttpNetworkTransactionTest, EnableNPN);
130 FRIEND_TEST_ALL_PREFIXES(HttpNetworkTransactionTest, DisableNPN);
[email protected]23e482282013-06-14 16:08:02131 FRIEND_TEST_ALL_PREFIXES(SpdyNetworkTransactionTest,
[email protected]448d4ca52012-03-04 04:12:23132 WindowUpdateReceived);
[email protected]23e482282013-06-14 16:08:02133 FRIEND_TEST_ALL_PREFIXES(SpdyNetworkTransactionTest,
[email protected]448d4ca52012-03-04 04:12:23134 WindowUpdateSent);
[email protected]23e482282013-06-14 16:08:02135 FRIEND_TEST_ALL_PREFIXES(SpdyNetworkTransactionTest,
[email protected]448d4ca52012-03-04 04:12:23136 WindowUpdateOverflow);
[email protected]23e482282013-06-14 16:08:02137 FRIEND_TEST_ALL_PREFIXES(SpdyNetworkTransactionTest,
[email protected]448d4ca52012-03-04 04:12:23138 FlowControlStallResume);
[email protected]513963e2013-06-15 01:53:04139 FRIEND_TEST_ALL_PREFIXES(SpdyNetworkTransactionTest,
[email protected]ca6459f862012-04-11 19:43:20140 FlowControlStallResumeAfterSettings);
[email protected]513963e2013-06-15 01:53:04141 FRIEND_TEST_ALL_PREFIXES(SpdyNetworkTransactionTest,
[email protected]ca6459f862012-04-11 19:43:20142 FlowControlNegativeSendWindowSize);
[email protected]89ceba9a2009-03-21 03:46:06143
[email protected]d207a5f2009-06-04 05:28:40144 enum State {
[email protected]1826a402014-01-08 15:40:48145 STATE_NOTIFY_BEFORE_CREATE_STREAM,
[email protected]82918cc2010-08-25 17:24:50146 STATE_CREATE_STREAM,
147 STATE_CREATE_STREAM_COMPLETE,
[email protected]351ab642010-08-05 16:55:31148 STATE_INIT_STREAM,
149 STATE_INIT_STREAM_COMPLETE,
[email protected]044de0642010-06-17 10:42:15150 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,
nharperd6e65822016-03-30 23:05:48154 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]daddea62012-09-19 05:51:13158 STATE_INIT_REQUEST_BODY,
159 STATE_INIT_REQUEST_BODY_COMPLETE,
[email protected]4875ba12011-03-30 22:31:51160 STATE_BUILD_REQUEST,
161 STATE_BUILD_REQUEST_COMPLETE,
[email protected]0877e3d2009-10-17 22:29:57162 STATE_SEND_REQUEST,
163 STATE_SEND_REQUEST_COMPLETE,
[email protected]d207a5f2009-06-04 05:28:40164 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 Ricecb76ac62015-02-20 05:33:25173 bool IsSecureRequest() const;
nharperb7441ef2016-01-25 23:54:14174 bool IsTokenBindingEnabled() const;
175 void RecordTokenBindingSupport() const;
[email protected]564b4912010-03-09 16:30:42176
Adam Rice425cf122015-01-19 06:18:24177 // 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.commit586acc5fe2008-07-26 22:42:52181 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]1826a402014-01-08 15:40:48191 int DoNotifyBeforeCreateStream();
[email protected]82918cc2010-08-25 17:24:50192 int DoCreateStream();
193 int DoCreateStreamComplete(int result);
[email protected]351ab642010-08-05 16:55:31194 int DoInitStream();
195 int DoInitStreamComplete(int result);
[email protected]044de0642010-06-17 10:42:15196 int DoGenerateProxyAuthToken();
197 int DoGenerateProxyAuthTokenComplete(int result);
198 int DoGenerateServerAuthToken();
199 int DoGenerateServerAuthTokenComplete(int result);
nharperd6e65822016-03-30 23:05:48200 int DoGetProvidedTokenBindingKey();
201 int DoGetProvidedTokenBindingKeyComplete(int result);
202 int DoGetReferredTokenBindingKey();
203 int DoGetReferredTokenBindingKeyComplete(int result);
[email protected]daddea62012-09-19 05:51:13204 int DoInitRequestBody();
205 int DoInitRequestBodyComplete(int result);
[email protected]4875ba12011-03-30 22:31:51206 int DoBuildRequest();
207 int DoBuildRequestComplete(int result);
[email protected]0877e3d2009-10-17 22:29:57208 int DoSendRequest();
209 int DoSendRequestComplete(int result);
initial.commit586acc5fe2008-07-26 22:42:52210 int DoReadHeaders();
211 int DoReadHeadersComplete(int result);
212 int DoReadBody();
213 int DoReadBodyComplete(int result);
[email protected]2d2697f92009-02-18 21:00:32214 int DoDrainBodyForAuthRestart();
215 int DoDrainBodyForAuthRestartComplete(int result);
initial.commit586acc5fe2008-07-26 22:42:52216
nharperb7441ef2016-01-25 23:54:14217 int BuildRequestHeaders(bool using_http_proxy_without_tunnel);
218 int BuildTokenBindingHeader(std::string* out);
[email protected]2979a492011-04-06 00:29:14219
[email protected]9f9f86c2009-03-12 22:32:42220 // Writes a log message to help debugging in the field when we block a proxy
221 // response to a CONNECT request.
[email protected]af89ba62009-03-16 20:26:38222 void LogBlockedTunnelResponse(int response_code) const;
[email protected]9f9f86c2009-03-12 22:32:42223
[email protected]0b45559b2009-06-12 21:45:11224 // Called to handle a client certificate request.
[email protected]5e363962009-06-19 19:57:01225 int HandleCertificateRequest(int error);
[email protected]0b45559b2009-06-12 21:45:11226
bncfacdd852015-01-09 19:22:54227 // 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]384cc73a2013-12-08 22:41:03231 // Called to possibly handle a client authentication error.
232 void HandleClientAuthError(int error);
233
[email protected]bd0b6772011-01-11 19:59:30234 // 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.commit586acc5fe2008-07-26 22:42:52239 // 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]0877e3d2009-10-17 22:29:57244 // Gets the response headers from the HttpStream.
245 HttpResponseHeaders* GetResponseHeaders() const;
246
[email protected]a34f61ee2014-03-18 20:59:49247 // 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]1c773ea12009-04-28 19:58:42250
251 // Resets the connection and the request headers for resend. Called when
252 // ShouldResendRequest() is true.
253 void ResetConnectionAndRequestForResend();
[email protected]2a5c76b2008-09-25 22:15:16254
[email protected]f9ee6b52008-11-08 06:46:23255 // Sets up the state machine to restart the transaction with auth.
256 void PrepareForAuthRestart(HttpAuth::Target target);
257
[email protected]2d2697f92009-02-18 21:00:32258 // 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]f9ee6b52008-11-08 06:46:23263 // Resets the members of the transaction so it can be restarted.
[email protected]c3b35c22008-09-27 03:19:42264 void ResetStateForRestart();
265
[email protected]697ef4c2010-10-14 16:38:58266 // Resets the members of the transaction, except |stream_|, which needs
267 // to be maintained for multi-round auth.
268 void ResetStateForAuthRestart();
269
zhongyica364fbb2015-12-12 03:39:12270 // Caches network error details from the stream if available
271 // and resets the stream.
272 void CacheNetErrorDetailsAndResetStream();
273
davidbenca9d69162015-05-04 20:18:45274 // Records metrics relating to SSL fallbacks.
davidben701ca982015-05-18 21:21:42275 void RecordSSLFallbackMetrics(int result);
davidbenca9d69162015-05-04 20:18:45276
[email protected]1c773ea12009-04-28 19:58:42277 // Returns true if we should try to add a Proxy-Authorization header
278 bool ShouldApplyProxyAuth() const;
[email protected]c3b35c22008-09-27 03:19:42279
[email protected]1c773ea12009-04-28 19:58:42280 // Returns true if we should try to add an Authorization header.
281 bool ShouldApplyServerAuth() const;
282
[email protected]f9ee6b52008-11-08 06:46:23283 // Handles HTTP status code 401 or 407.
[email protected]0757e7702009-03-27 04:00:22284 // HandleAuthChallenge() returns a network error code, or OK on success.
285 // May update |pending_auth_target_| or |response_.auth_challenge|.
[email protected]e772db3f2010-07-12 18:11:13286 int HandleAuthChallenge();
[email protected]f9ee6b52008-11-08 06:46:23287
[email protected]8e6441ca2010-08-19 05:56:38288 // Returns true if we have auth credentials for the given target.
289 bool HaveAuth(HttpAuth::Target target) const;
[email protected]c3b35c22008-09-27 03:19:42290
[email protected]228404f2010-06-24 04:31:41291 // Get the {scheme, host, path, port} for the authentication target
292 GURL AuthURL(HttpAuth::Target target) const;
[email protected]044de0642010-06-17 10:42:15293
[email protected]831e4a32013-11-14 02:14:44294 // Returns true if this transaction is for a WebSocket handshake
295 bool ForWebSocketHandshake() const;
296
yhiranoa7e05bb2014-11-06 05:40:39297 void SetStream(HttpStream* stream);
[email protected]b8015c42013-12-24 15:18:19298
ttuttle1f2d7e92015-04-28 16:17:47299 void CopyConnectionAttemptsFromStreamRequest();
300
[email protected]e772db3f2010-07-12 18:11:13301 scoped_refptr<HttpAuthController>
302 auth_controllers_[HttpAuth::AUTH_NUM_TARGETS];
[email protected]c3b35c22008-09-27 03:19:42303
[email protected]0757e7702009-03-27 04:00:22304 // 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]49639fa2011-12-20 23:22:41309 CompletionCallback io_callback_;
310 CompletionCallback callback_;
initial.commit586acc5fe2008-07-26 22:42:52311
[email protected]3fe8d2f82013-10-17 08:56:07312 HttpNetworkSession* session_;
initial.commit586acc5fe2008-07-26 22:42:52313
tfarina42834112016-09-22 13:38:20314 NetLogWithSource net_log_;
initial.commit586acc5fe2008-07-26 22:42:52315 const HttpRequestInfo* request_;
[email protected]262eec82013-03-19 21:01:36316 RequestPriority priority_;
[email protected]a7e41312009-12-16 23:18:14317 HttpResponseInfo response_;
initial.commit586acc5fe2008-07-26 22:42:52318
[email protected]102e27c2011-02-23 01:01:31319 // |proxy_info_| is the ProxyInfo used by the HttpStreamRequest.
[email protected]928fb582008-08-11 15:40:23320 ProxyInfo proxy_info_;
initial.commit586acc5fe2008-07-26 22:42:52321
danakj1fd259a02016-04-16 03:17:09322 std::unique_ptr<HttpStreamRequest> stream_request_;
323 std::unique_ptr<HttpStream> stream_;
[email protected]8e6441ca2010-08-19 05:56:38324
[email protected]0877e3d2009-10-17 22:29:57325 // True if we've validated the headers that the stream parser has returned.
326 bool headers_valid_;
327
[email protected]102957f2011-09-02 17:10:14328 SSLConfig server_ssl_config_;
329 SSLConfig proxy_ssl_config_;
[email protected]c5949a32008-10-08 17:28:23330
nharperd6e65822016-03-30 23:05:48331 // Keys to use for signing message in Token Binding header.
danakj1fd259a02016-04-16 03:17:09332 std::unique_ptr<crypto::ECPrivateKey> provided_token_binding_key_;
333 std::unique_ptr<crypto::ECPrivateKey> referred_token_binding_key_;
nharperd6e65822016-03-30 23:05:48334 // Object to manage lookup of |provided_token_binding_key_| and
335 // |referred_token_binding_key_|.
nharperb7441ef2016-01-25 23:54:14336 ChannelIDService::Request token_binding_request_;
337
[email protected]b94f92d2010-10-27 16:45:20338 HttpRequestHeaders request_headers_;
[email protected]4ddaf2502008-10-23 18:26:19339
[email protected]2d2697f92009-02-18 21:00:32340 // 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]81854c42010-09-22 03:39:36343 static const int kDrainBodyBufferSize = 1024;
[email protected]2d2697f92009-02-18 21:00:32344
initial.commit586acc5fe2008-07-26 22:42:52345 // User buffer and length passed to the Read method.
[email protected]9dea9e1f2009-01-29 00:30:47346 scoped_refptr<IOBuffer> read_buf_;
initial.commit586acc5fe2008-07-26 22:42:52347 int read_buf_len_;
348
sclittlefb249892015-09-10 21:33:22349 // Total number of bytes received on all destroyed HttpStreams for this
350 // transaction.
sclittle4de1bab92015-09-22 21:28:24351 int64_t total_received_bytes_;
[email protected]b8015c42013-12-24 15:18:19352
sclittlefb249892015-09-10 21:33:22353 // Total number of bytes sent on all destroyed HttpStreams for this
354 // transaction.
355 int64_t total_sent_bytes_;
356
[email protected]58e32bb2013-01-21 18:23:25357 // 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]d207a5f2009-06-04 05:28:40362 // The next state in the state machine.
initial.commit586acc5fe2008-07-26 22:42:52363 State next_state_;
[email protected]2ff8b312010-04-26 22:20:54364
[email protected]a7ea8832010-07-12 17:54:54365 // 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]831e4a32013-11-14 02:14:44369 // 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]1826a402014-01-08 15:40:48374 BeforeNetworkStartCallback before_network_start_callback_;
ryansturm49a8cb12016-06-15 16:51:09375 BeforeHeadersSentCallback before_headers_sent_callback_;
[email protected]1826a402014-01-08 15:40:48376
ttuttle1f2d7e92015-04-28 16:17:47377 ConnectionAttempts connection_attempts_;
ttuttled9dbc652015-09-29 20:00:59378 IPEndPoint remote_endpoint_;
zhongyica364fbb2015-12-12 03:39:12379 // Network error details for this transaction.
380 NetErrorDetails net_error_details_;
[email protected]2ff8b312010-04-26 22:20:54381 DISALLOW_COPY_AND_ASSIGN(HttpNetworkTransaction);
initial.commit586acc5fe2008-07-26 22:42:52382};
383
384} // namespace net
385
386#endif // NET_HTTP_HTTP_NETWORK_TRANSACTION_H_