| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 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 // This is a small utility that snarfs the server time from the | 5 // This is a small utility that snarfs the server time from the |
| 6 // response headers of an http/https HEAD request and compares it to | 6 // response headers of an http/https HEAD request and compares it to |
| 7 // the local time. | 7 // the local time. |
| 8 // | 8 // |
| 9 // TODO(akalin): Also snarf the server time from the TLS handshake, if | 9 // TODO(akalin): Also snarf the server time from the TLS handshake, if |
| 10 // any (http://crbug.com/146090). | 10 // any (http://crbug.com/146090). |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 96 | 96 |
| 97 virtual void OnURLFetchUploadProgress(const net::URLFetcher* source, | 97 virtual void OnURLFetchUploadProgress(const net::URLFetcher* source, |
| 98 int64 current, int64 total) OVERRIDE { | 98 int64 current, int64 total) OVERRIDE { |
| 99 NOTREACHED(); | 99 NOTREACHED(); |
| 100 } | 100 } |
| 101 | 101 |
| 102 private: | 102 private: |
| 103 DISALLOW_COPY_AND_ASSIGN(QuitDelegate); | 103 DISALLOW_COPY_AND_ASSIGN(QuitDelegate); |
| 104 }; | 104 }; |
| 105 | 105 |
| 106 // NetLog implementation that simply prints events to the logs. | 106 // NetLog::ThreadSafeObserver implementation that simply prints events |
| 107 class PrintingLog : public net::NetLog { | 107 // to the logs. |
| 108 class PrintingLogObserver : public net::NetLog::ThreadSafeObserver { |
| 108 public: | 109 public: |
| 109 PrintingLog() : next_id_(1) {} | 110 PrintingLogObserver() {} |
| 110 | 111 |
| 111 virtual ~PrintingLog() {} | 112 virtual ~PrintingLogObserver() { |
| 113 // This is guaranteed to be safe as this program is single threaded. |
| 114 net_log()->RemoveThreadSafeObserver(this); |
| 115 } |
| 112 | 116 |
| 113 // NetLog implementation: | 117 // NetLog::ThreadSafeObserver implementation: |
| 114 virtual void OnAddEntry(const net::NetLog::Entry& entry) OVERRIDE { | 118 virtual void OnAddEntry(const net::NetLog::Entry& entry) OVERRIDE { |
| 115 // The log level of the entry is unknown, so just assume it maps | 119 // The log level of the entry is unknown, so just assume it maps |
| 116 // to VLOG(1). | 120 // to VLOG(1). |
| 117 if (!VLOG_IS_ON(1)) | 121 if (!VLOG_IS_ON(1)) |
| 118 return; | 122 return; |
| 119 | 123 |
| 120 const char* const source_type = | 124 const char* const source_type = |
| 121 net::NetLog::SourceTypeToString(entry.source().type); | 125 net::NetLog::SourceTypeToString(entry.source().type); |
| 122 const char* const event_type = | 126 const char* const event_type = |
| 123 net::NetLog::EventTypeToString(entry.type()); | 127 net::NetLog::EventTypeToString(entry.type()); |
| 124 const char* const event_phase = | 128 const char* const event_phase = |
| 125 net::NetLog::EventPhaseToString(entry.phase()); | 129 net::NetLog::EventPhaseToString(entry.phase()); |
| 126 scoped_ptr<base::Value> params(entry.ParametersToValue()); | 130 scoped_ptr<base::Value> params(entry.ParametersToValue()); |
| 127 std::string params_str; | 131 std::string params_str; |
| 128 if (params.get()) { | 132 if (params.get()) { |
| 129 base::JSONWriter::Write(params.get(), ¶ms_str); | 133 base::JSONWriter::Write(params.get(), ¶ms_str); |
| 130 params_str.insert(0, ": "); | 134 params_str.insert(0, ": "); |
| 131 } | 135 } |
| 132 | 136 |
| 133 VLOG(1) << source_type << "(" << entry.source().id << "): " | 137 VLOG(1) << source_type << "(" << entry.source().id << "): " |
| 134 << event_type << ": " << event_phase << params_str; | 138 << event_type << ": " << event_phase << params_str; |
| 135 } | 139 } |
| 136 | 140 |
| 137 virtual uint32 NextID() OVERRIDE { | |
| 138 return next_id_++; | |
| 139 } | |
| 140 | |
| 141 virtual LogLevel GetLogLevel() const OVERRIDE { | |
| 142 const int vlog_level = logging::GetVlogLevel(__FILE__); | |
| 143 if (vlog_level <= 0) { | |
| 144 return LOG_BASIC; | |
| 145 } | |
| 146 if (vlog_level == 1) { | |
| 147 return LOG_ALL_BUT_BYTES; | |
| 148 } | |
| 149 return LOG_ALL; | |
| 150 } | |
| 151 | |
| 152 virtual void AddThreadSafeObserver(ThreadSafeObserver* observer, | |
| 153 LogLevel log_level) OVERRIDE { | |
| 154 NOTIMPLEMENTED(); | |
| 155 } | |
| 156 | |
| 157 virtual void SetObserverLogLevel(ThreadSafeObserver* observer, | |
| 158 LogLevel log_level) OVERRIDE { | |
| 159 NOTIMPLEMENTED(); | |
| 160 } | |
| 161 | |
| 162 virtual void RemoveThreadSafeObserver(ThreadSafeObserver* observer) OVERRIDE { | |
| 163 NOTIMPLEMENTED(); | |
| 164 } | |
| 165 | |
| 166 private: | 141 private: |
| 167 uint32 next_id_; | 142 DISALLOW_COPY_AND_ASSIGN(PrintingLogObserver); |
| 168 | |
| 169 DISALLOW_COPY_AND_ASSIGN(PrintingLog); | |
| 170 }; | 143 }; |
| 171 | 144 |
| 172 // Builds a URLRequestContext assuming there's only a single loop. | 145 // Builds a URLRequestContext assuming there's only a single loop. |
| 173 scoped_ptr<net::URLRequestContext> BuildURLRequestContext() { | 146 scoped_ptr<net::URLRequestContext> |
| 147 BuildURLRequestContext(net::NetLog* net_log) { |
| 174 net::URLRequestContextBuilder builder; | 148 net::URLRequestContextBuilder builder; |
| 175 #if defined(OS_LINUX) | 149 #if defined(OS_LINUX) |
| 176 // On Linux, use a fixed ProxyConfigService, since the default one | 150 // On Linux, use a fixed ProxyConfigService, since the default one |
| 177 // depends on glib. | 151 // depends on glib. |
| 178 // | 152 // |
| 179 // TODO(akalin): Remove this once http://crbug.com/146421 is fixed. | 153 // TODO(akalin): Remove this once http://crbug.com/146421 is fixed. |
| 180 builder.set_proxy_config_service( | 154 builder.set_proxy_config_service( |
| 181 new net::ProxyConfigServiceFixed(net::ProxyConfig())); | 155 new net::ProxyConfigServiceFixed(net::ProxyConfig())); |
| 182 #endif | 156 #endif |
| 183 scoped_ptr<net::URLRequestContext> context(builder.Build()); | 157 scoped_ptr<net::URLRequestContext> context(builder.Build()); |
| 184 context->set_net_log(new PrintingLog()); | 158 context->set_net_log(net_log); |
| 185 return context.Pass(); | 159 return context.Pass(); |
| 186 } | 160 } |
| 187 | 161 |
| 188 class SingleThreadRequestContextGetter : public net::URLRequestContextGetter { | 162 class SingleThreadRequestContextGetter : public net::URLRequestContextGetter { |
| 189 public: | 163 public: |
| 190 // Since there's only a single thread, there's no need to worry | 164 // Since there's only a single thread, there's no need to worry |
| 191 // about when |context_| gets created. | 165 // about when |context_| gets created. |
| 192 explicit SingleThreadRequestContextGetter( | 166 SingleThreadRequestContextGetter( |
| 167 net::NetLog* net_log, |
| 193 const scoped_refptr<base::SingleThreadTaskRunner>& main_task_runner) | 168 const scoped_refptr<base::SingleThreadTaskRunner>& main_task_runner) |
| 194 : context_(BuildURLRequestContext()), | 169 : context_(BuildURLRequestContext(net_log)), |
| 195 main_task_runner_(main_task_runner) {} | 170 main_task_runner_(main_task_runner) {} |
| 196 | 171 |
| 197 virtual net::URLRequestContext* GetURLRequestContext() OVERRIDE { | 172 virtual net::URLRequestContext* GetURLRequestContext() OVERRIDE { |
| 198 return context_.get(); | 173 return context_.get(); |
| 199 } | 174 } |
| 200 | 175 |
| 201 virtual scoped_refptr<base::SingleThreadTaskRunner> | 176 virtual scoped_refptr<base::SingleThreadTaskRunner> |
| 202 GetNetworkTaskRunner() const OVERRIDE { | 177 GetNetworkTaskRunner() const OVERRIDE { |
| 203 return main_task_runner_; | 178 return main_task_runner_; |
| 204 } | 179 } |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 274 } | 249 } |
| 275 | 250 |
| 276 base::MessageLoopForIO main_loop; | 251 base::MessageLoopForIO main_loop; |
| 277 | 252 |
| 278 // NOTE: A NetworkChangeNotifier could be instantiated here, but | 253 // NOTE: A NetworkChangeNotifier could be instantiated here, but |
| 279 // that interferes with the request that will be sent; some | 254 // that interferes with the request that will be sent; some |
| 280 // implementations always send out an OnIPAddressChanged() message, | 255 // implementations always send out an OnIPAddressChanged() message, |
| 281 // which causes the DNS resolution to abort. It's simpler to just | 256 // which causes the DNS resolution to abort. It's simpler to just |
| 282 // not instantiate one, since only a single request is sent anyway. | 257 // not instantiate one, since only a single request is sent anyway. |
| 283 | 258 |
| 259 // The declaration order for net_log and printing_log_observer is |
| 260 // important. The destructor of PrintingLogObserver removes itself |
| 261 // from net_log, so net_log must be available for entire lifetime of |
| 262 // printing_log_observer. |
| 263 net::NetLog net_log; |
| 264 PrintingLogObserver printing_log_observer; |
| 265 net_log.AddThreadSafeObserver(&printing_log_observer, net::NetLog::LOG_ALL); |
| 284 scoped_refptr<SingleThreadRequestContextGetter> context_getter( | 266 scoped_refptr<SingleThreadRequestContextGetter> context_getter( |
| 285 new SingleThreadRequestContextGetter(main_loop.message_loop_proxy())); | 267 new SingleThreadRequestContextGetter(&net_log, |
| 268 main_loop.message_loop_proxy())); |
| 286 | 269 |
| 287 QuitDelegate delegate; | 270 QuitDelegate delegate; |
| 288 scoped_ptr<net::URLFetcher> fetcher( | 271 scoped_ptr<net::URLFetcher> fetcher( |
| 289 net::URLFetcher::Create(url, net::URLFetcher::HEAD, &delegate)); | 272 net::URLFetcher::Create(url, net::URLFetcher::HEAD, &delegate)); |
| 290 fetcher->SetRequestContext(context_getter.get()); | 273 fetcher->SetRequestContext(context_getter.get()); |
| 291 | 274 |
| 292 const base::Time start_time = base::Time::Now(); | 275 const base::Time start_time = base::Time::Now(); |
| 293 const base::TimeTicks start_ticks = base::TimeTicks::Now(); | 276 const base::TimeTicks start_ticks = base::TimeTicks::Now(); |
| 294 | 277 |
| 295 fetcher->Start(); | 278 fetcher->Start(); |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 365 &skew, &skew_uncertainty); | 348 &skew, &skew_uncertainty); |
| 366 | 349 |
| 367 std::printf( | 350 std::printf( |
| 368 "An estimate for the local clock skew is %.2f ms with " | 351 "An estimate for the local clock skew is %.2f ms with " |
| 369 "uncertainty %.2f ms\n", | 352 "uncertainty %.2f ms\n", |
| 370 skew.InMillisecondsF(), | 353 skew.InMillisecondsF(), |
| 371 skew_uncertainty.InMillisecondsF()); | 354 skew_uncertainty.InMillisecondsF()); |
| 372 | 355 |
| 373 return EXIT_SUCCESS; | 356 return EXIT_SUCCESS; |
| 374 } | 357 } |
| OLD | NEW |