| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef CHROME_BROWSER_NET_PASSIVE_LOG_COLLECTOR_H_ | 5 #ifndef CHROME_BROWSER_NET_PASSIVE_LOG_COLLECTOR_H_ |
| 6 #define CHROME_BROWSER_NET_PASSIVE_LOG_COLLECTOR_H_ | 6 #define CHROME_BROWSER_NET_PASSIVE_LOG_COLLECTOR_H_ |
| 7 | 7 |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/hash_tables.h" | 10 #include "base/hash_tables.h" |
| 11 #include "base/ref_counted.h" | 11 #include "base/ref_counted.h" |
| 12 #include "base/time.h" | 12 #include "base/time.h" |
| 13 #include "chrome/browser/net/chrome_net_log.h" | 13 #include "chrome/browser/net/chrome_net_log.h" |
| 14 #include "net/base/net_log.h" | 14 #include "net/base/net_log.h" |
| 15 #include "testing/gtest/include/gtest/gtest_prod.h" |
| 15 | 16 |
| 16 class PassiveLogCollector : public ChromeNetLog::Observer { | 17 class PassiveLogCollector : public ChromeNetLog::Observer { |
| 17 public: | 18 public: |
| 18 // This structure encapsulates all of the parameters of a captured event, | 19 // This structure encapsulates all of the parameters of a captured event, |
| 19 // including an "order" field that identifies when it was captured relative | 20 // including an "order" field that identifies when it was captured relative |
| 20 // to other events. | 21 // to other events. |
| 21 struct Entry { | 22 struct Entry { |
| 22 Entry(int order, | 23 Entry(uint32 order, |
| 23 net::NetLog::EventType type, | 24 net::NetLog::EventType type, |
| 24 const base::TimeTicks& time, | 25 const base::TimeTicks& time, |
| 25 net::NetLog::Source source, | 26 net::NetLog::Source source, |
| 26 net::NetLog::EventPhase phase, | 27 net::NetLog::EventPhase phase, |
| 27 net::NetLog::EventParameters* extra_parameters) | 28 net::NetLog::EventParameters* extra_parameters) |
| 28 : order(order), type(type), time(time), source(source), phase(phase), | 29 : order(order), type(type), time(time), source(source), phase(phase), |
| 29 extra_parameters(extra_parameters) { | 30 extra_parameters(extra_parameters) { |
| 30 } | 31 } |
| 31 | 32 |
| 32 int order; | 33 uint32 order; |
| 33 net::NetLog::EventType type; | 34 net::NetLog::EventType type; |
| 34 base::TimeTicks time; | 35 base::TimeTicks time; |
| 35 net::NetLog::Source source; | 36 net::NetLog::Source source; |
| 36 net::NetLog::EventPhase phase; | 37 net::NetLog::EventPhase phase; |
| 37 scoped_refptr<net::NetLog::EventParameters> extra_parameters; | 38 scoped_refptr<net::NetLog::EventParameters> extra_parameters; |
| 38 }; | 39 }; |
| 39 | 40 |
| 40 typedef std::vector<Entry> EntryList; | 41 typedef std::vector<Entry> EntryList; |
| 41 | 42 |
| 42 struct RequestInfo { | 43 struct RequestInfo { |
| 43 RequestInfo() : num_entries_truncated(0) {} | 44 RequestInfo() |
| 44 std::string url; | 45 : source_id(net::NetLog::Source::kInvalidId), |
| 46 num_entries_truncated(0), |
| 47 total_bytes_transmitted(0), |
| 48 total_bytes_received(0), |
| 49 bytes_transmitted(0), |
| 50 bytes_received(0), |
| 51 last_tx_rx_position(0) {} |
| 52 uint32 source_id; |
| 45 EntryList entries; | 53 EntryList entries; |
| 46 size_t num_entries_truncated; | 54 size_t num_entries_truncated; |
| 55 net::NetLog::Source subordinate_source; |
| 56 |
| 57 // Only used in RequestTracker. |
| 58 std::string url; |
| 59 |
| 60 // Only used in SocketTracker. |
| 61 uint64 total_bytes_transmitted; |
| 62 uint64 total_bytes_received; |
| 63 uint64 bytes_transmitted; |
| 64 uint64 bytes_received; |
| 65 uint32 last_tx_rx_position; // The |order| of the last Tx or Rx entry. |
| 66 base::TimeTicks last_tx_rx_time; // The |time| of the last Tx or Rx entry. |
| 47 }; | 67 }; |
| 48 | 68 |
| 49 typedef std::vector<RequestInfo> RequestInfoList; | 69 typedef std::vector<RequestInfo> RequestInfoList; |
| 50 | 70 |
| 51 // This class stores and manages the passively logged information for | 71 // This class stores and manages the passively logged information for |
| 52 // URLRequests/SocketStreams/ConnectJobs. | 72 // URLRequests/SocketStreams/ConnectJobs. |
| 53 class RequestTrackerBase { | 73 class RequestTrackerBase { |
| 54 public: | 74 public: |
| 55 explicit RequestTrackerBase(size_t max_graveyard_size); | 75 explicit RequestTrackerBase(size_t max_graveyard_size); |
| 56 | 76 |
| 57 void OnAddEntry(const Entry& entry); | 77 void OnAddEntry(const Entry& entry); |
| 58 | 78 |
| 59 RequestInfoList GetLiveRequests() const; | 79 RequestInfoList GetLiveRequests() const; |
| 60 void ClearRecentlyDeceased(); | 80 void ClearRecentlyDeceased(); |
| 61 RequestInfoList GetRecentlyDeceased() const; | 81 RequestInfoList GetRecentlyDeceased() const; |
| 62 void SetUnbounded(bool unbounded); | 82 void SetUnbounded(bool unbounded); |
| 63 | 83 |
| 64 bool IsUnbounded() const { return is_unbounded_; } | 84 bool is_unbounded() const { return is_unbounded_; } |
| 65 | 85 |
| 66 void Clear(); | 86 void Clear(); |
| 67 | 87 |
| 68 // Appends all the captured entries to |out|. The ordering is undefined. | 88 // Appends all the captured entries to |out|. The ordering is undefined. |
| 69 void AppendAllEntries(EntryList* out) const; | 89 void AppendAllEntries(EntryList* out) const; |
| 70 | 90 |
| 71 const RequestInfo* GetRequestInfoFromGraveyard(int id) const; | |
| 72 | |
| 73 protected: | 91 protected: |
| 74 enum Action { | 92 enum Action { |
| 75 ACTION_NONE, | 93 ACTION_NONE, |
| 76 ACTION_DELETE, | 94 ACTION_DELETE, |
| 77 ACTION_MOVE_TO_GRAVEYARD, | 95 ACTION_MOVE_TO_GRAVEYARD, |
| 78 }; | 96 }; |
| 79 | 97 |
| 80 // Updates |out_info| with the information from |entry|. Returns an action | 98 // Updates |out_info| with the information from |entry|. Returns an action |
| 81 // to perform for this map entry on completion. | 99 // to perform for this map entry on completion. |
| 82 virtual Action DoAddEntry(const Entry& entry, RequestInfo* out_info) = 0; | 100 virtual Action DoAddEntry(const Entry& entry, RequestInfo* out_info) = 0; |
| 83 | 101 |
| 84 bool is_unbounded() const { return is_unbounded_; } | 102 // Finds a request, either in the live entries or the graveyard and returns |
| 103 // it. |
| 104 RequestInfo* GetRequestInfo(uint32 id); |
| 105 |
| 106 // When GetLiveRequests() is called, RequestTrackerBase calls this method |
| 107 // for each entry after adding it to the list which will be returned |
| 108 // to the caller. |
| 109 virtual void OnLiveRequest(RequestInfo* info) const {} |
| 85 | 110 |
| 86 private: | 111 private: |
| 87 typedef base::hash_map<int, RequestInfo> SourceIDToInfoMap; | 112 typedef base::hash_map<uint32, RequestInfo> SourceIDToInfoMap; |
| 88 | 113 |
| 89 void RemoveFromLiveRequests(int source_id); | 114 void RemoveFromLiveRequests(uint32 source_id); |
| 90 void InsertIntoGraveyard(const RequestInfo& info); | 115 void InsertIntoGraveyard(const RequestInfo& info); |
| 91 | 116 |
| 92 SourceIDToInfoMap live_requests_; | 117 SourceIDToInfoMap live_requests_; |
| 93 size_t max_graveyard_size_; | 118 size_t max_graveyard_size_; |
| 94 size_t next_graveyard_index_; | 119 size_t next_graveyard_index_; |
| 95 RequestInfoList graveyard_; | 120 RequestInfoList graveyard_; |
| 96 bool is_unbounded_; | 121 bool is_unbounded_; |
| 97 | 122 |
| 98 DISALLOW_COPY_AND_ASSIGN(RequestTrackerBase); | 123 DISALLOW_COPY_AND_ASSIGN(RequestTrackerBase); |
| 99 }; | 124 }; |
| 100 | 125 |
| 101 // Specialization of RequestTrackerBase for handling ConnectJobs. | 126 // Specialization of RequestTrackerBase for handling ConnectJobs. |
| 102 class ConnectJobTracker : public RequestTrackerBase { | 127 class ConnectJobTracker : public RequestTrackerBase { |
| 103 public: | 128 public: |
| 104 static const size_t kMaxGraveyardSize; | 129 static const size_t kMaxGraveyardSize; |
| 105 | 130 |
| 106 ConnectJobTracker(); | 131 ConnectJobTracker(); |
| 107 | 132 |
| 133 void AppendLogEntries(RequestInfo* out_info, bool unbounded, |
| 134 uint32 connect_id); |
| 135 |
| 108 protected: | 136 protected: |
| 109 virtual Action DoAddEntry(const Entry& entry, RequestInfo* out_info); | 137 virtual Action DoAddEntry(const Entry& entry, RequestInfo* out_info); |
| 110 private: | 138 private: |
| 111 DISALLOW_COPY_AND_ASSIGN(ConnectJobTracker); | 139 DISALLOW_COPY_AND_ASSIGN(ConnectJobTracker); |
| 112 }; | 140 }; |
| 113 | 141 |
| 142 // Specialization of RequestTrackerBase for handling Sockets. |
| 143 class SocketTracker : public RequestTrackerBase { |
| 144 public: |
| 145 static const size_t kMaxGraveyardSize; |
| 146 |
| 147 SocketTracker(); |
| 148 |
| 149 void AppendLogEntries(RequestInfo* out_info, bool unbounded, |
| 150 uint32 socket_id, bool clear); |
| 151 |
| 152 protected: |
| 153 virtual Action DoAddEntry(const Entry& entry, RequestInfo* out_info); |
| 154 |
| 155 private: |
| 156 void ClearInfo(RequestInfo* info); |
| 157 |
| 158 DISALLOW_COPY_AND_ASSIGN(SocketTracker); |
| 159 }; |
| 160 |
| 114 // Specialization of RequestTrackerBase for handling URLRequest/SocketStream. | 161 // Specialization of RequestTrackerBase for handling URLRequest/SocketStream. |
| 115 class RequestTracker : public RequestTrackerBase { | 162 class RequestTracker : public RequestTrackerBase { |
| 116 public: | 163 public: |
| 117 static const size_t kMaxGraveyardSize; | 164 static const size_t kMaxGraveyardSize; |
| 118 static const size_t kMaxGraveyardURLSize; | 165 static const size_t kMaxGraveyardURLSize; |
| 119 | 166 |
| 120 explicit RequestTracker(ConnectJobTracker* connect_job_tracker); | 167 RequestTracker(ConnectJobTracker* connect_job_tracker, |
| 168 SocketTracker* socket_tracker); |
| 169 |
| 170 void IntegrateSubordinateSource(RequestInfo* info, |
| 171 bool clear_entries) const; |
| 121 | 172 |
| 122 protected: | 173 protected: |
| 123 virtual Action DoAddEntry(const Entry& entry, RequestInfo* out_info); | 174 virtual Action DoAddEntry(const Entry& entry, RequestInfo* out_info); |
| 124 | 175 |
| 176 virtual void OnLiveRequest(RequestInfo* info) const { |
| 177 IntegrateSubordinateSource(info, false); |
| 178 } |
| 179 |
| 125 private: | 180 private: |
| 126 // Searches through |connect_job_tracker_| for information on the | |
| 127 // ConnectJob specified in |entry|, and appends it to |live_entry|. | |
| 128 void AddConnectJobInfo(const Entry& entry, RequestInfo* live_entry); | |
| 129 | |
| 130 ConnectJobTracker* connect_job_tracker_; | 181 ConnectJobTracker* connect_job_tracker_; |
| 182 SocketTracker* socket_tracker_; |
| 131 | 183 |
| 132 DISALLOW_COPY_AND_ASSIGN(RequestTracker); | 184 DISALLOW_COPY_AND_ASSIGN(RequestTracker); |
| 133 }; | 185 }; |
| 134 | 186 |
| 135 // Tracks the log entries for the last seen SOURCE_INIT_PROXY_RESOLVER. | 187 // Tracks the log entries for the last seen SOURCE_INIT_PROXY_RESOLVER. |
| 136 class InitProxyResolverTracker { | 188 class InitProxyResolverTracker { |
| 137 public: | 189 public: |
| 138 InitProxyResolverTracker(); | 190 InitProxyResolverTracker(); |
| 139 | 191 |
| 140 void OnAddEntry(const Entry& entry); | 192 void OnAddEntry(const Entry& entry); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 171 | 223 |
| 172 InitProxyResolverTracker* init_proxy_resolver_tracker() { | 224 InitProxyResolverTracker* init_proxy_resolver_tracker() { |
| 173 return &init_proxy_resolver_tracker_; | 225 return &init_proxy_resolver_tracker_; |
| 174 } | 226 } |
| 175 | 227 |
| 176 // Fills |out| with the full list of events that have been passively | 228 // Fills |out| with the full list of events that have been passively |
| 177 // captured. The list is ordered by capture time. | 229 // captured. The list is ordered by capture time. |
| 178 void GetAllCapturedEvents(EntryList* out) const; | 230 void GetAllCapturedEvents(EntryList* out) const; |
| 179 | 231 |
| 180 private: | 232 private: |
| 233 FRIEND_TEST(PassiveLogCollectorTest, LostConnectJob); |
| 234 FRIEND_TEST(PassiveLogCollectorTest, LostSocket); |
| 235 |
| 181 ConnectJobTracker connect_job_tracker_; | 236 ConnectJobTracker connect_job_tracker_; |
| 237 SocketTracker socket_tracker_; |
| 182 RequestTracker url_request_tracker_; | 238 RequestTracker url_request_tracker_; |
| 183 RequestTracker socket_stream_tracker_; | 239 RequestTracker socket_stream_tracker_; |
| 184 InitProxyResolverTracker init_proxy_resolver_tracker_; | 240 InitProxyResolverTracker init_proxy_resolver_tracker_; |
| 185 | 241 |
| 186 // The count of how many events have flowed through this log. Used to set the | 242 // The count of how many events have flowed through this log. Used to set the |
| 187 // "order" field on captured events. | 243 // "order" field on captured events. |
| 188 int num_events_seen_; | 244 uint32 num_events_seen_; |
| 189 | 245 |
| 190 DISALLOW_COPY_AND_ASSIGN(PassiveLogCollector); | 246 DISALLOW_COPY_AND_ASSIGN(PassiveLogCollector); |
| 191 }; | 247 }; |
| 192 | 248 |
| 193 #endif // CHROME_BROWSER_NET_PASSIVE_LOG_COLLECTOR_H_ | 249 #endif // CHROME_BROWSER_NET_PASSIVE_LOG_COLLECTOR_H_ |
| OLD | NEW |