1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// found in the LICENSE file. 4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 56e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "components/cronet/android/url_request_context_adapter.h" 6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 7f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/bind.h" 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/single_thread_task_runner.h" 10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/cronet/url_request_context_config.h" 11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "net/base/net_errors.h" 12c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "net/base/net_log_logger.h" 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "net/cert/cert_verifier.h" 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "net/http/http_auth_handler_factory.h" 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "net/http/http_network_layer.h" 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "net/http/http_server_properties.h" 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "net/proxy/proxy_config_service_fixed.h" 18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "net/proxy/proxy_service.h" 19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "net/ssl/ssl_config_service_defaults.h" 20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "net/url_request/static_http_user_agent_settings.h" 210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "net/url_request/url_request_context_builder.h" 22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "net/url_request/url_request_context_storage.h" 23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "net/url_request/url_request_job_factory_impl.h" 24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace { 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class BasicNetworkDelegate : public net::NetworkDelegate { 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public: 29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) BasicNetworkDelegate() {} 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual ~BasicNetworkDelegate() {} 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private: 33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // net::NetworkDelegate implementation. 34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual int OnBeforeURLRequest(net::URLRequest* request, 35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const net::CompletionCallback& callback, 36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GURL* new_url) OVERRIDE { 37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return net::OK; 38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual int OnBeforeSendHeaders(net::URLRequest* request, 41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const net::CompletionCallback& callback, 42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) net::HttpRequestHeaders* headers) OVERRIDE { 43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return net::OK; 44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void OnSendHeaders(net::URLRequest* request, 47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const net::HttpRequestHeaders& headers) OVERRIDE {} 48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual int OnHeadersReceived( 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) net::URLRequest* request, 51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const net::CompletionCallback& callback, 52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const net::HttpResponseHeaders* original_response_headers, 53effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_refptr<net::HttpResponseHeaders>* _response_headers, 54effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch GURL* allowed_unsafe_redirect_url) OVERRIDE { 55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return net::OK; 56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void OnBeforeRedirect(net::URLRequest* request, 59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const GURL& new_location) OVERRIDE {} 60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void OnResponseStarted(net::URLRequest* request) OVERRIDE {} 62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void OnRawBytesRead(const net::URLRequest& request, 64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int bytes_read) OVERRIDE {} 65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void OnCompleted(net::URLRequest* request, bool started) OVERRIDE {} 67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void OnURLRequestDestroyed(net::URLRequest* request) OVERRIDE {} 69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void OnPACScriptError(int line_number, 71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::string16& error) OVERRIDE {} 72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual NetworkDelegate::AuthRequiredResponse OnAuthRequired( 74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) net::URLRequest* request, 75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const net::AuthChallengeInfo& auth_info, 76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const AuthCallback& callback, 77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) net::AuthCredentials* credentials) OVERRIDE { 78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return net::NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION; 79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual bool OnCanGetCookies(const net::URLRequest& request, 82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const net::CookieList& cookie_list) OVERRIDE { 83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return false; 84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual bool OnCanSetCookie(const net::URLRequest& request, 87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::string& cookie_line, 88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) net::CookieOptions* options) OVERRIDE { 89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return false; 90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual bool OnCanAccessFile(const net::URLRequest& request, 93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::FilePath& path) const OVERRIDE { 94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return false; 95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual bool OnCanThrottleRequest( 986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const net::URLRequest& request) const OVERRIDE { 99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return false; 100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual int OnBeforeSocketStreamConnect( 103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) net::SocketStream* stream, 104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const net::CompletionCallback& callback) OVERRIDE { 105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return net::OK; 106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(BasicNetworkDelegate); 109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace 112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace cronet { 1140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)URLRequestContextAdapter::URLRequestContextAdapter( 1166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) URLRequestContextAdapterDelegate* delegate, 1176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) std::string user_agent) { 118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) delegate_ = delegate; 119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) user_agent_ = user_agent; 120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void URLRequestContextAdapter::Initialize( 123f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<URLRequestContextConfig> config) { 124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) network_thread_ = new base::Thread("network"); 125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Thread::Options options; 126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) options.message_loop_type = base::MessageLoop::TYPE_IO; 127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) network_thread_->StartWithOptions(options); 128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GetNetworkTaskRunner()->PostTask( 130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FROM_HERE, 1316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) base::Bind(&URLRequestContextAdapter::InitializeURLRequestContext, 132f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) this, 133f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Passed(&config))); 134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 135a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void URLRequestContextAdapter::InitializeURLRequestContext( 137f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<URLRequestContextConfig> config) { 138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // TODO(mmenke): Add method to have the builder enable SPDY. 1390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch net::URLRequestContextBuilder context_builder; 1400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch context_builder.set_network_delegate(new BasicNetworkDelegate()); 1410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch context_builder.set_proxy_config_service( 1420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch new net::ProxyConfigServiceFixed(net::ProxyConfig())); 143f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) config->ConfigureURLRequestContextBuilder(&context_builder); 1440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch context_.reset(context_builder.Build()); 146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Currently (circa M39) enabling QUIC requires setting probability threshold. 1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (config->enable_quic) { 1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci context_->http_server_properties() 1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ->SetAlternateProtocolProbabilityThreshold(0.0f); 1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (size_t hint = 0; hint < config->quic_hints.size(); ++hint) { 1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const URLRequestContextConfig::QuicHint& quic_hint = 1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *config->quic_hints[hint]; 1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (quic_hint.host.empty()) { 1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci LOG(ERROR) << "Empty QUIC hint host: " << quic_hint.host; 1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci continue; 1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (quic_hint.port <= std::numeric_limits<uint16>::min() || 1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci quic_hint.port > std::numeric_limits<uint16>::max()) { 1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci LOG(ERROR) << "Invalid QUIC hint port: " 1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci << quic_hint.port; 1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci continue; 1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (quic_hint.alternate_port <= std::numeric_limits<uint16>::min() || 1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci quic_hint.alternate_port > std::numeric_limits<uint16>::max()) { 1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci LOG(ERROR) << "Invalid QUIC hint alternate port: " 1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci << quic_hint.alternate_port; 1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci continue; 1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci net::HostPortPair quic_hint_host_port_pair(quic_hint.host, 1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci quic_hint.port); 1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci context_->http_server_properties()->SetAlternateProtocol( 1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci quic_hint_host_port_pair, 1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static_cast<uint16>(quic_hint.alternate_port), 1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci net::AlternateProtocol::QUIC, 1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1.0f); 1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 183a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (VLOG_IS_ON(2)) { 1846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) net_log_observer_.reset(new NetLogObserver()); 1850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch context_->net_log()->AddThreadSafeObserver(net_log_observer_.get(), 1860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch net::NetLog::LOG_ALL_BUT_BYTES); 187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 189a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) delegate_->OnContextInitialized(this); 190a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 191a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)URLRequestContextAdapter::~URLRequestContextAdapter() { 193c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (net_log_observer_) { 194c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch context_->net_log()->RemoveThreadSafeObserver(net_log_observer_.get()); 195c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch net_log_observer_.reset(); 196c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 197c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch StopNetLog(); 198f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // TODO(mef): Ensure that |network_thread_| is destroyed properly. 199c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 200a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)const std::string& URLRequestContextAdapter::GetUserAgent( 2026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const GURL& url) const { 203a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return user_agent_; 204a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 205a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)net::URLRequestContext* URLRequestContextAdapter::GetURLRequestContext() { 207a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!context_) { 208a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LOG(ERROR) << "URLRequestContext is not set up"; 209a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 210a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return context_.get(); 211a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 212a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 213a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)scoped_refptr<base::SingleThreadTaskRunner> 2146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)URLRequestContextAdapter::GetNetworkTaskRunner() const { 215a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return network_thread_->message_loop_proxy(); 216a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 217a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void URLRequestContextAdapter::StartNetLogToFile(const std::string& file_name) { 219c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Do nothing if already logging to a file. 220c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (net_log_logger_) 221c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 222c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 223c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::FilePath file_path(file_name); 224c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch FILE* file = base::OpenFile(file_path, "w"); 225c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!file) 226c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 227c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 228c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_ptr<base::Value> constants(net::NetLogLogger::GetConstants()); 229c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch net_log_logger_.reset(new net::NetLogLogger(file, *constants)); 230c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch net_log_logger_->StartObserving(context_->net_log()); 231c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 232c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void URLRequestContextAdapter::StopNetLog() { 234c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (net_log_logger_) { 235c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch net_log_logger_->StopObserving(); 236c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch net_log_logger_.reset(); 237c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 238c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 239c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 240a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void NetLogObserver::OnAddEntry(const net::NetLog::Entry& entry) { 2416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) VLOG(2) << "Net log entry: type=" << entry.type() 2426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) << ", source=" << entry.source().type << ", phase=" << entry.phase(); 243a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 2440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} // namespace cronet 246