1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef NET_BASE_LOAD_TIMING_INFO_H_ 6*6777b538SAndroid Build Coastguard Worker #define NET_BASE_LOAD_TIMING_INFO_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <stdint.h> 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h" 11*6777b538SAndroid Build Coastguard Worker #include "net/base/net_export.h" 12*6777b538SAndroid Build Coastguard Worker 13*6777b538SAndroid Build Coastguard Worker namespace net { 14*6777b538SAndroid Build Coastguard Worker 15*6777b538SAndroid Build Coastguard Worker // Structure containing timing information for a request. 16*6777b538SAndroid Build Coastguard Worker // It addresses the needs of 17*6777b538SAndroid Build Coastguard Worker // http://groups.google.com/group/http-archive-specification/web/har-1-1-spec, 18*6777b538SAndroid Build Coastguard Worker // http://dev.w3.org/2006/webapi/WebTiming/, and 19*6777b538SAndroid Build Coastguard Worker // http://www.w3.org/TR/resource-timing/. 20*6777b538SAndroid Build Coastguard Worker // 21*6777b538SAndroid Build Coastguard Worker // All events that do not apply to a request have null times. For non-HTTP 22*6777b538SAndroid Build Coastguard Worker // requests, all times other than the request_start times are null. 23*6777b538SAndroid Build Coastguard Worker // 24*6777b538SAndroid Build Coastguard Worker // Requests with connection errors generally only have request start times as 25*6777b538SAndroid Build Coastguard Worker // well, since they never received an established socket. 26*6777b538SAndroid Build Coastguard Worker // 27*6777b538SAndroid Build Coastguard Worker // The general order for events is: 28*6777b538SAndroid Build Coastguard Worker // request_start 29*6777b538SAndroid Build Coastguard Worker // service_worker_start_time 30*6777b538SAndroid Build Coastguard Worker // proxy_start 31*6777b538SAndroid Build Coastguard Worker // proxy_end 32*6777b538SAndroid Build Coastguard Worker // domain_lookup_start 33*6777b538SAndroid Build Coastguard Worker // domain_lookup_end 34*6777b538SAndroid Build Coastguard Worker // connect_start 35*6777b538SAndroid Build Coastguard Worker // ssl_start 36*6777b538SAndroid Build Coastguard Worker // ssl_end 37*6777b538SAndroid Build Coastguard Worker // connect_end 38*6777b538SAndroid Build Coastguard Worker // send_start 39*6777b538SAndroid Build Coastguard Worker // send_end 40*6777b538SAndroid Build Coastguard Worker // service_worker_ready_time 41*6777b538SAndroid Build Coastguard Worker // service_worker_fetch_start 42*6777b538SAndroid Build Coastguard Worker // service_worker_respond_with_settled 43*6777b538SAndroid Build Coastguard Worker // first_early_hints_time 44*6777b538SAndroid Build Coastguard Worker // receive_headers_start 45*6777b538SAndroid Build Coastguard Worker // receive_non_informational_headers_start 46*6777b538SAndroid Build Coastguard Worker // receive_headers_end 47*6777b538SAndroid Build Coastguard Worker // 48*6777b538SAndroid Build Coastguard Worker // Times represent when a request starts/stops blocking on an event(*), not the 49*6777b538SAndroid Build Coastguard Worker // time the events actually occurred. In particular, in the case of preconnects 50*6777b538SAndroid Build Coastguard Worker // and socket reuse, no time may be spent blocking on establishing a connection. 51*6777b538SAndroid Build Coastguard Worker // In the case of SPDY, PAC scripts are only run once for each shared session, 52*6777b538SAndroid Build Coastguard Worker // so no time may be spent blocking on them. 53*6777b538SAndroid Build Coastguard Worker // 54*6777b538SAndroid Build Coastguard Worker // (*) Note 1: push_start and push_end are the exception to this, as they 55*6777b538SAndroid Build Coastguard Worker // represent the operation which is asynchronous to normal request flow and 56*6777b538SAndroid Build Coastguard Worker // hence are provided as absolute values and not converted to "blocking" time. 57*6777b538SAndroid Build Coastguard Worker // 58*6777b538SAndroid Build Coastguard Worker // (*) Note 2: Internally to the network stack, times are those of actual event 59*6777b538SAndroid Build Coastguard Worker // occurrence. URLRequest converts them to time which the network stack was 60*6777b538SAndroid Build Coastguard Worker // blocked on each state, as per resource timing specs. 61*6777b538SAndroid Build Coastguard Worker // 62*6777b538SAndroid Build Coastguard Worker // DNS and SSL times are both times for the host, not the proxy, so DNS times 63*6777b538SAndroid Build Coastguard Worker // when using proxies are null, and only requests to HTTPS hosts (Not proxies) 64*6777b538SAndroid Build Coastguard Worker // have SSL times. 65*6777b538SAndroid Build Coastguard Worker struct NET_EXPORT LoadTimingInfo { 66*6777b538SAndroid Build Coastguard Worker // Contains the LoadTimingInfo events related to establishing a connection. 67*6777b538SAndroid Build Coastguard Worker // These are all set by ConnectJobs. 68*6777b538SAndroid Build Coastguard Worker struct NET_EXPORT_PRIVATE ConnectTiming { 69*6777b538SAndroid Build Coastguard Worker ConnectTiming(); 70*6777b538SAndroid Build Coastguard Worker ~ConnectTiming(); 71*6777b538SAndroid Build Coastguard Worker 72*6777b538SAndroid Build Coastguard Worker // The time spent looking up the host's DNS address. Null for requests that 73*6777b538SAndroid Build Coastguard Worker // used proxies to look up the DNS address. Also null for SOCKS4 proxies, 74*6777b538SAndroid Build Coastguard Worker // since the DNS address is only looked up after the connection is 75*6777b538SAndroid Build Coastguard Worker // established, which results in unexpected event ordering. 76*6777b538SAndroid Build Coastguard Worker // TODO(mmenke): The SOCKS4 event ordering could be refactored to allow 77*6777b538SAndroid Build Coastguard Worker // these times to be non-null. 78*6777b538SAndroid Build Coastguard Worker // Corresponds to |domainLookupStart| and |domainLookupEnd| in 79*6777b538SAndroid Build Coastguard Worker // ResourceTiming (http://www.w3.org/TR/resource-timing/) for Web-surfacing 80*6777b538SAndroid Build Coastguard Worker // requests. 81*6777b538SAndroid Build Coastguard Worker base::TimeTicks domain_lookup_start; 82*6777b538SAndroid Build Coastguard Worker base::TimeTicks domain_lookup_end; 83*6777b538SAndroid Build Coastguard Worker 84*6777b538SAndroid Build Coastguard Worker // The time spent establishing the connection. Connect time includes proxy 85*6777b538SAndroid Build Coastguard Worker // connect times (though not proxy_resolve or DNS lookup times), time spent 86*6777b538SAndroid Build Coastguard Worker // waiting in certain queues, TCP, and SSL time. 87*6777b538SAndroid Build Coastguard Worker // TODO(mmenke): For proxies, this includes time spent blocking on higher 88*6777b538SAndroid Build Coastguard Worker // level socket pools. Fix this. 89*6777b538SAndroid Build Coastguard Worker // TODO(mmenke): Retried connections to the same server should apparently 90*6777b538SAndroid Build Coastguard Worker // be included in this time. Consider supporting that. 91*6777b538SAndroid Build Coastguard Worker // Since the network stack has multiple notions of a "retry", 92*6777b538SAndroid Build Coastguard Worker // handled at different levels, this may not be worth 93*6777b538SAndroid Build Coastguard Worker // worrying about - backup jobs, reused socket failure, 94*6777b538SAndroid Build Coastguard Worker // multiple round authentication. 95*6777b538SAndroid Build Coastguard Worker // Corresponds to |connectStart| and |connectEnd| in ResourceTiming 96*6777b538SAndroid Build Coastguard Worker // (http://www.w3.org/TR/resource-timing/) for Web-surfacing requests. 97*6777b538SAndroid Build Coastguard Worker base::TimeTicks connect_start; 98*6777b538SAndroid Build Coastguard Worker base::TimeTicks connect_end; 99*6777b538SAndroid Build Coastguard Worker 100*6777b538SAndroid Build Coastguard Worker // The time when the SSL handshake started / completed. For non-HTTPS 101*6777b538SAndroid Build Coastguard Worker // requests these are null. These times are only for the SSL connection to 102*6777b538SAndroid Build Coastguard Worker // the final destination server, not an SSL/SPDY proxy. 103*6777b538SAndroid Build Coastguard Worker // |ssl_start| corresponds to |secureConnectionStart| in ResourceTiming 104*6777b538SAndroid Build Coastguard Worker // (http://www.w3.org/TR/resource-timing/) for Web-surfacing requests. 105*6777b538SAndroid Build Coastguard Worker base::TimeTicks ssl_start; 106*6777b538SAndroid Build Coastguard Worker base::TimeTicks ssl_end; 107*6777b538SAndroid Build Coastguard Worker }; 108*6777b538SAndroid Build Coastguard Worker 109*6777b538SAndroid Build Coastguard Worker LoadTimingInfo(); 110*6777b538SAndroid Build Coastguard Worker LoadTimingInfo(const LoadTimingInfo& other); 111*6777b538SAndroid Build Coastguard Worker ~LoadTimingInfo(); 112*6777b538SAndroid Build Coastguard Worker 113*6777b538SAndroid Build Coastguard Worker // True if the socket was reused. When true, DNS, connect, and SSL times 114*6777b538SAndroid Build Coastguard Worker // will all be null. When false, those times may be null, too, for non-HTTP 115*6777b538SAndroid Build Coastguard Worker // requests, or when they don't apply to a request. 116*6777b538SAndroid Build Coastguard Worker // 117*6777b538SAndroid Build Coastguard Worker // For requests that are sent again after an AUTH challenge, this will be true 118*6777b538SAndroid Build Coastguard Worker // if the original socket is reused, and false if a new socket is used. 119*6777b538SAndroid Build Coastguard Worker // Responding to a proxy AUTH challenge is never considered to be reusing a 120*6777b538SAndroid Build Coastguard Worker // socket, since a connection to the host wasn't established when the 121*6777b538SAndroid Build Coastguard Worker // challenge was received. 122*6777b538SAndroid Build Coastguard Worker bool socket_reused = false; 123*6777b538SAndroid Build Coastguard Worker 124*6777b538SAndroid Build Coastguard Worker // Unique socket ID, can be used to identify requests served by the same 125*6777b538SAndroid Build Coastguard Worker // socket. For connections tunnelled over SPDY proxies, this is the ID of 126*6777b538SAndroid Build Coastguard Worker // the virtual connection (The SpdyProxyClientSocket), not the ID of the 127*6777b538SAndroid Build Coastguard Worker // actual socket. HTTP requests handled by the SPDY proxy itself all use the 128*6777b538SAndroid Build Coastguard Worker // actual socket's ID. 129*6777b538SAndroid Build Coastguard Worker // 130*6777b538SAndroid Build Coastguard Worker // 0 when there is no socket associated with the request, or it's not an HTTP 131*6777b538SAndroid Build Coastguard Worker // request. 132*6777b538SAndroid Build Coastguard Worker uint32_t socket_log_id; 133*6777b538SAndroid Build Coastguard Worker 134*6777b538SAndroid Build Coastguard Worker // Start time as a base::Time, so times can be coverted into actual times. 135*6777b538SAndroid Build Coastguard Worker // Other times are recorded as TimeTicks so they are not affected by clock 136*6777b538SAndroid Build Coastguard Worker // changes. 137*6777b538SAndroid Build Coastguard Worker base::Time request_start_time; 138*6777b538SAndroid Build Coastguard Worker 139*6777b538SAndroid Build Coastguard Worker // Corresponds to |fetchStart| in ResourceTiming 140*6777b538SAndroid Build Coastguard Worker // (http://www.w3.org/TR/resource-timing/) for Web-surfacing requests. 141*6777b538SAndroid Build Coastguard Worker base::TimeTicks request_start; 142*6777b538SAndroid Build Coastguard Worker 143*6777b538SAndroid Build Coastguard Worker // The time immediately before starting ServiceWorker. If the response is not 144*6777b538SAndroid Build Coastguard Worker // provided by the ServiceWorker, kept empty. 145*6777b538SAndroid Build Coastguard Worker // Corresponds to |workerStart| in 146*6777b538SAndroid Build Coastguard Worker // ResourceTiming (http://www.w3.org/TR/resource-timing/) for Web-surfacing 147*6777b538SAndroid Build Coastguard Worker base::TimeTicks service_worker_start_time; 148*6777b538SAndroid Build Coastguard Worker 149*6777b538SAndroid Build Coastguard Worker // The time immediately before dispatching fetch event in ServiceWorker. 150*6777b538SAndroid Build Coastguard Worker // If the response is not provided by the ServiceWorker, kept empty. 151*6777b538SAndroid Build Coastguard Worker // This value will be used for |fetchStart| (or |redirectStart|) in 152*6777b538SAndroid Build Coastguard Worker // ResourceTiming (http://www.w3.org/TR/resource-timing/) for Web-surfacing 153*6777b538SAndroid Build Coastguard Worker // if this is greater than |request_start|. 154*6777b538SAndroid Build Coastguard Worker base::TimeTicks service_worker_ready_time; 155*6777b538SAndroid Build Coastguard Worker 156*6777b538SAndroid Build Coastguard Worker // The time when serviceworker fetch event was popped off the event queue 157*6777b538SAndroid Build Coastguard Worker // and fetch event handler started running. 158*6777b538SAndroid Build Coastguard Worker // If the response is not provided by the ServiceWorker, kept empty. 159*6777b538SAndroid Build Coastguard Worker base::TimeTicks service_worker_fetch_start; 160*6777b538SAndroid Build Coastguard Worker 161*6777b538SAndroid Build Coastguard Worker // The time when serviceworker's fetch event's respondWith promise was 162*6777b538SAndroid Build Coastguard Worker // settled. If the response is not provided by the ServiceWorker, kept empty. 163*6777b538SAndroid Build Coastguard Worker base::TimeTicks service_worker_respond_with_settled; 164*6777b538SAndroid Build Coastguard Worker 165*6777b538SAndroid Build Coastguard Worker // The time spent determining which proxy to use. Null when there is no PAC. 166*6777b538SAndroid Build Coastguard Worker base::TimeTicks proxy_resolve_start; 167*6777b538SAndroid Build Coastguard Worker base::TimeTicks proxy_resolve_end; 168*6777b538SAndroid Build Coastguard Worker 169*6777b538SAndroid Build Coastguard Worker ConnectTiming connect_timing; 170*6777b538SAndroid Build Coastguard Worker 171*6777b538SAndroid Build Coastguard Worker // The time that sending HTTP request started / ended. 172*6777b538SAndroid Build Coastguard Worker // |send_start| corresponds to |requestStart| in ResourceTiming 173*6777b538SAndroid Build Coastguard Worker // (http://www.w3.org/TR/resource-timing/) for Web-surfacing requests. 174*6777b538SAndroid Build Coastguard Worker base::TimeTicks send_start; 175*6777b538SAndroid Build Coastguard Worker base::TimeTicks send_end; 176*6777b538SAndroid Build Coastguard Worker 177*6777b538SAndroid Build Coastguard Worker // The time at which the first / last byte of the HTTP headers were received. 178*6777b538SAndroid Build Coastguard Worker // 179*6777b538SAndroid Build Coastguard Worker // |receive_headers_start| corresponds to |responseStart| in ResourceTiming 180*6777b538SAndroid Build Coastguard Worker // (http://www.w3.org/TR/resource-timing/) for Web-surfacing requests. This 181*6777b538SAndroid Build Coastguard Worker // can be the time at which the first byte of the HTTP headers for 182*6777b538SAndroid Build Coastguard Worker // informational responses (1xx) as per the ResourceTiming spec (see note at 183*6777b538SAndroid Build Coastguard Worker // https://www.w3.org/TR/resource-timing-2/#dom-performanceresourcetiming-responsestart). 184*6777b538SAndroid Build Coastguard Worker base::TimeTicks receive_headers_start; 185*6777b538SAndroid Build Coastguard Worker base::TimeTicks receive_headers_end; 186*6777b538SAndroid Build Coastguard Worker 187*6777b538SAndroid Build Coastguard Worker // The time at which the first byte of the HTTP headers for the 188*6777b538SAndroid Build Coastguard Worker // non-informational response (non-1xx). See also comments on 189*6777b538SAndroid Build Coastguard Worker // |receive_headers_start|. 190*6777b538SAndroid Build Coastguard Worker base::TimeTicks receive_non_informational_headers_start; 191*6777b538SAndroid Build Coastguard Worker 192*6777b538SAndroid Build Coastguard Worker // The time that the first 103 Early Hints response is received. 193*6777b538SAndroid Build Coastguard Worker base::TimeTicks first_early_hints_time; 194*6777b538SAndroid Build Coastguard Worker 195*6777b538SAndroid Build Coastguard Worker // In case the resource was proactively pushed by the server, these are 196*6777b538SAndroid Build Coastguard Worker // the times that push started and ended. Note that push_end will be null 197*6777b538SAndroid Build Coastguard Worker // if the request is still being transmitted, i.e. the underlying h2 stream 198*6777b538SAndroid Build Coastguard Worker // is not closed by the server. 199*6777b538SAndroid Build Coastguard Worker base::TimeTicks push_start; 200*6777b538SAndroid Build Coastguard Worker base::TimeTicks push_end; 201*6777b538SAndroid Build Coastguard Worker }; 202*6777b538SAndroid Build Coastguard Worker 203*6777b538SAndroid Build Coastguard Worker } // namespace net 204*6777b538SAndroid Build Coastguard Worker 205*6777b538SAndroid Build Coastguard Worker #endif // NET_BASE_LOAD_TIMING_INFO_H_ 206