Home | History | Annotate | Download | only in base
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef NET_BASE_LOAD_TIMING_INFO_H_
      6 #define NET_BASE_LOAD_TIMING_INFO_H_
      7 
      8 #include "base/basictypes.h"
      9 #include "base/time/time.h"
     10 #include "net/base/net_export.h"
     11 
     12 namespace net {
     13 
     14 // Structure containing timing information for a request.
     15 // It addresses the needs of
     16 // http://groups.google.com/group/http-archive-specification/web/har-1-1-spec,
     17 // http://dev.w3.org/2006/webapi/WebTiming/, and
     18 // http://www.w3.org/TR/resource-timing/.
     19 //
     20 // All events that do not apply to a request have null times.  For non-HTTP
     21 // requests, all times other than the request_start times are null.
     22 //
     23 // Requests with connection errors generally only have request start times as
     24 // well, since they never received an established socket.
     25 //
     26 // The general order for events is:
     27 // request_start
     28 // proxy_start
     29 // proxy_end
     30 // dns_start
     31 // dns_end
     32 // connect_start
     33 // ssl_start
     34 // ssl_end
     35 // connect_end
     36 // send_start
     37 // send_end
     38 // receive_headers_end
     39 //
     40 // Times represent when a request starts/stops blocking on an event, not the
     41 // time the events actually occurred.  In particular, in the case of preconnects
     42 // and socket reuse, no time may be spent blocking on establishing a connection.
     43 // In the case of SPDY, PAC scripts are only run once for each shared session,
     44 // so no time may be spent blocking on them.
     45 //
     46 // DNS and SSL times are both times for the host, not the proxy, so DNS times
     47 // when using proxies are null, and only requests to HTTPS hosts (Not proxies)
     48 // have SSL times.  One exception to this is when a proxy server itself returns
     49 // a redirect response.  In this case, the connect times treat the proxy as the
     50 // host.  The send and receive times will all be null, however.
     51 // See HttpNetworkTransaction::OnHttpsProxyTunnelResponse.
     52 // TODO(mmenke):  Is this worth fixing?
     53 //
     54 // Note that internal to the network stack, times are when events actually
     55 // occurred.  URLRequest converts them to time which the network stack was
     56 // blocked on each state.
     57 struct NET_EXPORT LoadTimingInfo {
     58   // Contains the LoadTimingInfo events related to establishing a connection.
     59   // These are all set by ConnectJobs.
     60   struct NET_EXPORT_PRIVATE ConnectTiming {
     61     ConnectTiming();
     62     ~ConnectTiming();
     63 
     64     // The time spent looking up the host's DNS address.  Null for requests that
     65     // used proxies to look up the DNS address.  Also null for SOCKS4 proxies,
     66     // since the DNS address is only looked up after the connection is
     67     // established, which results in unexpected event ordering.
     68     // TODO(mmenke):  The SOCKS4 event ordering could be refactored to allow
     69     //                these times to be non-null.
     70     base::TimeTicks dns_start;
     71     base::TimeTicks dns_end;
     72 
     73     // The time spent establishing the connection. Connect time includes proxy
     74     // connect times (Though not proxy_resolve times), DNS lookup times, time
     75     // spent waiting in certain queues, TCP, and SSL time.
     76     // TODO(mmenke):  For proxies, this includes time spent blocking on higher
     77     //                level socket pools.  Fix this.
     78     // TODO(mmenke):  Retried connections to the same server should apparently
     79     //                be included in this time.  Consider supporting that.
     80     //                Since the network stack has multiple notions of a "retry",
     81     //                handled at different levels, this may not be worth
     82     //                worrying about - backup jobs, reused socket failure,
     83     //                multiple round authentication.
     84     base::TimeTicks connect_start;
     85     base::TimeTicks connect_end;
     86 
     87     // The time when the SSL handshake started / completed. For non-HTTPS
     88     // requests these are null.  These times are only for the SSL connection to
     89     // the final destination server, not an SSL/SPDY proxy.
     90     base::TimeTicks ssl_start;
     91     base::TimeTicks ssl_end;
     92   };
     93 
     94   LoadTimingInfo();
     95   ~LoadTimingInfo();
     96 
     97   // True if the socket was reused.  When true, DNS, connect, and SSL times
     98   // will all be null.  When false, those times may be null, too, for non-HTTP
     99   // requests, or when they don't apply to a request.
    100   //
    101   // For requests that are sent again after an AUTH challenge, this will be true
    102   // if the original socket is reused, and false if a new socket is used.
    103   // Responding to a proxy AUTH challenge is never considered to be reusing a
    104   // socket, since a connection to the host wasn't established when the
    105   // challenge was received.
    106   bool socket_reused;
    107 
    108   // Unique socket ID, can be used to identify requests served by the same
    109   // socket.  For connections tunnelled over SPDY proxies, this is the ID of
    110   // the virtual connection (The SpdyProxyClientSocket), not the ID of the
    111   // actual socket.  HTTP requests handled by the SPDY proxy itself all use the
    112   // actual socket's ID.
    113   //
    114   // 0 when there is no socket associated with the request, or it's not an HTTP
    115   // request.
    116   uint32 socket_log_id;
    117 
    118   // Start time as a base::Time, so times can be coverted into actual times.
    119   // Other times are recorded as TimeTicks so they are not affected by clock
    120   // changes.
    121   base::Time request_start_time;
    122 
    123   base::TimeTicks request_start;
    124 
    125   // The time spent determing which proxy to use.  Null when there is no PAC.
    126   base::TimeTicks proxy_resolve_start;
    127   base::TimeTicks proxy_resolve_end;
    128 
    129   ConnectTiming connect_timing;
    130 
    131   // The time that sending HTTP request started / ended.
    132   base::TimeTicks send_start;
    133   base::TimeTicks send_end;
    134 
    135   // The time at which the end of the HTTP headers were received.
    136   base::TimeTicks receive_headers_end;
    137 };
    138 
    139 }  // namespace net
    140 
    141 #endif  // NET_BASE_LOAD_TIMING_INFO_H_
    142