OLD | NEW |
(Empty) | |
| 1 // Copyright 2014 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 #include "net/cronet/android/url_request_context_peer.h" |
| 6 |
| 7 #include "net/cert/cert_verifier.h" |
| 8 #include "net/cronet/android/android_log.h" |
| 9 #include "net/http/http_auth_handler_factory.h" |
| 10 #include "net/http/http_network_layer.h" |
| 11 #include "net/http/http_server_properties_impl.h" |
| 12 #include "net/proxy/proxy_config_service_fixed.h" |
| 13 #include "net/proxy/proxy_service.h" |
| 14 #include "net/ssl/ssl_config_service_defaults.h" |
| 15 #include "net/url_request/static_http_user_agent_settings.h" |
| 16 #include "net/url_request/url_request_context_storage.h" |
| 17 #include "net/url_request/url_request_job_factory_impl.h" |
| 18 |
| 19 #define LOG_TAG "ChromiumNetwork" |
| 20 |
| 21 class BasicNetworkDelegate : public net::NetworkDelegate { |
| 22 public: |
| 23 BasicNetworkDelegate() {} |
| 24 virtual ~BasicNetworkDelegate() {} |
| 25 |
| 26 private: |
| 27 virtual int OnBeforeURLRequest(net::URLRequest* request, |
| 28 const net::CompletionCallback& callback, |
| 29 GURL* new_url) { |
| 30 return net::OK; |
| 31 } |
| 32 |
| 33 virtual int OnBeforeSendHeaders(net::URLRequest* request, |
| 34 const net::CompletionCallback& callback, |
| 35 net::HttpRequestHeaders* headers) { |
| 36 return net::OK; |
| 37 } |
| 38 |
| 39 virtual void OnSendHeaders(net::URLRequest* request, |
| 40 const net::HttpRequestHeaders& headers) {} |
| 41 |
| 42 virtual int OnHeadersReceived( |
| 43 net::URLRequest* request, const net::CompletionCallback& callback, |
| 44 const net::HttpResponseHeaders* original_response_headers, |
| 45 scoped_refptr<net::HttpResponseHeaders>* _response_headers) { |
| 46 return net::OK; |
| 47 } |
| 48 |
| 49 virtual void OnBeforeRedirect(net::URLRequest* request, |
| 50 const GURL& new_location) {} |
| 51 |
| 52 virtual void OnResponseStarted(net::URLRequest* request) {} |
| 53 |
| 54 virtual void OnRawBytesRead(const net::URLRequest& request, int bytes_read) {} |
| 55 |
| 56 virtual void OnCompleted(net::URLRequest* request, bool started) {} |
| 57 |
| 58 virtual void OnURLRequestDestroyed(net::URLRequest* request) {} |
| 59 |
| 60 virtual void OnPACScriptError(int line_number, const base::string16& error) {} |
| 61 |
| 62 virtual NetworkDelegate::AuthRequiredResponse OnAuthRequired( |
| 63 net::URLRequest* request, const net::AuthChallengeInfo& auth_info, |
| 64 const AuthCallback& callback, net::AuthCredentials* credentials) { |
| 65 return net::NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION; |
| 66 } |
| 67 |
| 68 virtual bool OnCanGetCookies(const net::URLRequest& request, |
| 69 const net::CookieList& cookie_list) { |
| 70 return false; |
| 71 } |
| 72 |
| 73 virtual bool OnCanSetCookie(const net::URLRequest& request, |
| 74 const std::string& cookie_line, |
| 75 net::CookieOptions* options) { |
| 76 return false; |
| 77 } |
| 78 |
| 79 virtual bool OnCanAccessFile(const net::URLRequest& request, |
| 80 const base::FilePath& path) const { |
| 81 return false; |
| 82 } |
| 83 |
| 84 virtual bool OnCanThrottleRequest(const net::URLRequest& request) const { |
| 85 return false; |
| 86 } |
| 87 |
| 88 virtual int OnBeforeSocketStreamConnect( |
| 89 net::SocketStream* stream, const net::CompletionCallback& callback) { |
| 90 return net::OK; |
| 91 } |
| 92 |
| 93 DISALLOW_COPY_AND_ASSIGN(BasicNetworkDelegate); |
| 94 }; |
| 95 |
| 96 class BasicURLRequestContext : public net::URLRequestContext { |
| 97 public: |
| 98 BasicURLRequestContext() : storage_(this) {} |
| 99 |
| 100 net::URLRequestContextStorage* storage() { return &storage_; } |
| 101 |
| 102 protected: |
| 103 virtual ~BasicURLRequestContext() {} |
| 104 |
| 105 private: |
| 106 net::URLRequestContextStorage storage_; |
| 107 DISALLOW_COPY_AND_ASSIGN(BasicURLRequestContext); |
| 108 }; |
| 109 |
| 110 URLRequestContextPeer::URLRequestContextPeer( |
| 111 URLRequestContextPeerDelegate* delegate, std::string user_agent, |
| 112 LoggingLevel logging_level, const char* version) { |
| 113 delegate_ = delegate; |
| 114 user_agent_ = user_agent; |
| 115 logging_level_ = logging_level; |
| 116 version_ = version; |
| 117 } |
| 118 |
| 119 void URLRequestContextPeer::Initialize() { |
| 120 network_thread_ = new base::Thread("network"); |
| 121 base::Thread::Options options; |
| 122 options.message_loop_type = base::MessageLoop::TYPE_IO; |
| 123 network_thread_->StartWithOptions(options); |
| 124 |
| 125 GetNetworkTaskRunner()->PostTask( |
| 126 FROM_HERE, |
| 127 base::Bind(&URLRequestContextPeer::InitializeURLRequestContext, this)); |
| 128 } |
| 129 |
| 130 void URLRequestContextPeer::InitializeURLRequestContext() { |
| 131 BasicURLRequestContext* context = new BasicURLRequestContext; |
| 132 net::URLRequestContextStorage* storage = context->storage(); |
| 133 |
| 134 net::NetworkDelegate* network_delegate = new BasicNetworkDelegate; |
| 135 storage->set_network_delegate(network_delegate); |
| 136 |
| 137 storage->set_host_resolver(net::HostResolver::CreateDefaultResolver(NULL)); |
| 138 |
| 139 net::ProxyConfigService* proxy_config_service = |
| 140 new net::ProxyConfigServiceFixed(net::ProxyConfig()); |
| 141 storage->set_proxy_service(net::ProxyService::CreateUsingSystemProxyResolver( |
| 142 proxy_config_service, |
| 143 4, // TODO(willchan): Find a better constant somewhere. |
| 144 context->net_log())); |
| 145 storage->set_ssl_config_service(new net::SSLConfigServiceDefaults); |
| 146 storage->set_http_auth_handler_factory( |
| 147 net::HttpAuthHandlerRegistryFactory::CreateDefault( |
| 148 context->host_resolver())); |
| 149 storage->set_transport_security_state(new net::TransportSecurityState()); |
| 150 storage->set_http_server_properties( |
| 151 scoped_ptr<net::HttpServerProperties>( |
| 152 new net::HttpServerPropertiesImpl())); |
| 153 storage->set_cert_verifier(net::CertVerifier::CreateDefault()); |
| 154 |
| 155 net::HttpNetworkSession::Params network_session_params; |
| 156 network_session_params.host_resolver = context->host_resolver(); |
| 157 network_session_params.cert_verifier = context->cert_verifier(); |
| 158 network_session_params.transport_security_state = |
| 159 context->transport_security_state(); |
| 160 network_session_params.proxy_service = context->proxy_service(); |
| 161 network_session_params.ssl_config_service = context->ssl_config_service(); |
| 162 network_session_params.http_auth_handler_factory = |
| 163 context->http_auth_handler_factory(); |
| 164 network_session_params.network_delegate = network_delegate; |
| 165 network_session_params.http_server_properties = |
| 166 context->http_server_properties(); |
| 167 network_session_params.net_log = context->net_log(); |
| 168 |
| 169 scoped_refptr<net::HttpNetworkSession> network_session( |
| 170 new net::HttpNetworkSession(network_session_params)); |
| 171 |
| 172 net::HttpTransactionFactory* http_transaction_factory = |
| 173 new net::HttpNetworkLayer(network_session.get()); |
| 174 storage->set_http_transaction_factory(http_transaction_factory); |
| 175 |
| 176 net::URLRequestJobFactoryImpl* job_factory = |
| 177 new net::URLRequestJobFactoryImpl; |
| 178 storage->set_job_factory(job_factory); |
| 179 |
| 180 context_.reset(context); |
| 181 |
| 182 if (logging_level_ == LOG_VERBOSE) { |
| 183 context_->set_net_log(new net::NetLog); |
| 184 netlog_observer_.reset(new NetLogObserver(logging_level_)); |
| 185 context_->net_log()->AddThreadSafeObserver(netlog_observer_.get(), |
| 186 net::NetLog::LOG_ALL_BUT_BYTES); |
| 187 } |
| 188 |
| 189 net::HttpStreamFactory::EnableNpnSpdy31(); |
| 190 |
| 191 delegate_->OnContextInitialized(this); |
| 192 } |
| 193 |
| 194 URLRequestContextPeer::~URLRequestContextPeer() { |
| 195 } |
| 196 |
| 197 const std::string &URLRequestContextPeer::GetUserAgent(const GURL &url) const { |
| 198 return user_agent_; |
| 199 } |
| 200 |
| 201 LoggingLevel URLRequestContextPeer::logging_level() const { |
| 202 return logging_level_; |
| 203 } |
| 204 |
| 205 const char* URLRequestContextPeer::version() const { |
| 206 return version_; |
| 207 } |
| 208 |
| 209 net::URLRequestContext *URLRequestContextPeer::GetURLRequestContext() { |
| 210 if (!context_) { |
| 211 LOGE(LOG_TAG, "URLRequestContext is not set up"); |
| 212 } |
| 213 return context_.get(); |
| 214 } |
| 215 |
| 216 scoped_refptr<base::SingleThreadTaskRunner> |
| 217 URLRequestContextPeer::GetNetworkTaskRunner() const { |
| 218 return network_thread_->message_loop_proxy(); |
| 219 } |
| 220 |
| 221 void NetLogObserver::OnAddEntry(const net::NetLog::Entry& entry) { |
| 222 if (log_level_ == LOG_VERBOSE) { |
| 223 const char* const source_type = |
| 224 net::NetLog::SourceTypeToString(entry.source().type); |
| 225 const char* const event_type = |
| 226 net::NetLog::EventTypeToString(entry.type()); |
| 227 const char* const event_phase = |
| 228 net::NetLog::EventPhaseToString(entry.phase()); |
| 229 __android_log_print(ANDROID_LOG_INFO, LOG_TAG, |
| 230 "Net log entry: type=%s source=%s phase=%s\n", |
| 231 event_type, source_type, event_phase); |
| 232 // TODO(dplotnikov): print detailed parameters |
| 233 } |
| 234 } |
| 235 |
| 236 // TODO(dplotnikov): figure out discrepancies between the NDK version bundled |
| 237 // with chromium and the standard version. The chromium version references these |
| 238 // unknown methods. |
| 239 namespace __cxxabiv1 { |
| 240 extern "C" { |
| 241 void __cxa_bad_typeid() {} |
| 242 } |
| 243 } // namespace __cxxabiv1 |
OLD | NEW |