| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 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 #include "components/cronet/android/cronet_url_request_adapter.h" | 5 #include "components/cronet/android/cronet_url_request_adapter.h" |
| 6 | 6 |
| 7 #include <limits> | 7 #include <limits> |
| 8 #include <utility> | 8 #include <utility> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 85 const GURL& url, | 85 const GURL& url, |
| 86 net::RequestPriority priority, | 86 net::RequestPriority priority, |
| 87 jboolean jdisable_cache, | 87 jboolean jdisable_cache, |
| 88 jboolean jdisable_connection_migration, | 88 jboolean jdisable_connection_migration, |
| 89 jboolean jenable_metrics) | 89 jboolean jenable_metrics) |
| 90 : context_(context), | 90 : context_(context), |
| 91 initial_url_(url), | 91 initial_url_(url), |
| 92 initial_priority_(priority), | 92 initial_priority_(priority), |
| 93 initial_method_("GET"), | 93 initial_method_("GET"), |
| 94 load_flags_(context->default_load_flags()), | 94 load_flags_(context->default_load_flags()), |
| 95 enable_metrics_(jenable_metrics == JNI_TRUE) { | 95 enable_metrics_(jenable_metrics == JNI_TRUE), |
| 96 metrics_reported_(false) { |
| 96 DCHECK(!context_->IsOnNetworkThread()); | 97 DCHECK(!context_->IsOnNetworkThread()); |
| 97 owner_.Reset(env, jurl_request); | 98 owner_.Reset(env, jurl_request); |
| 98 if (jdisable_cache == JNI_TRUE) | 99 if (jdisable_cache == JNI_TRUE) |
| 99 load_flags_ |= net::LOAD_DISABLE_CACHE; | 100 load_flags_ |= net::LOAD_DISABLE_CACHE; |
| 100 if (jdisable_connection_migration == JNI_TRUE) | 101 if (jdisable_connection_migration == JNI_TRUE) |
| 101 load_flags_ |= net::LOAD_DISABLE_CONNECTION_MIGRATION; | 102 load_flags_ |= net::LOAD_DISABLE_CONNECTION_MIGRATION; |
| 102 } | 103 } |
| 103 | 104 |
| 104 CronetURLRequestAdapter::~CronetURLRequestAdapter() { | 105 CronetURLRequestAdapter::~CronetURLRequestAdapter() { |
| 105 DCHECK(context_->IsOnNetworkThread()); | 106 DCHECK(context_->IsOnNetworkThread()); |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 238 request->ContinueWithCertificate(nullptr, nullptr); | 239 request->ContinueWithCertificate(nullptr, nullptr); |
| 239 } | 240 } |
| 240 | 241 |
| 241 void CronetURLRequestAdapter::OnSSLCertificateError( | 242 void CronetURLRequestAdapter::OnSSLCertificateError( |
| 242 net::URLRequest* request, | 243 net::URLRequest* request, |
| 243 const net::SSLInfo& ssl_info, | 244 const net::SSLInfo& ssl_info, |
| 244 bool fatal) { | 245 bool fatal) { |
| 245 DCHECK(context_->IsOnNetworkThread()); | 246 DCHECK(context_->IsOnNetworkThread()); |
| 246 request->Cancel(); | 247 request->Cancel(); |
| 247 int net_error = net::MapCertStatusToNetError(ssl_info.cert_status); | 248 int net_error = net::MapCertStatusToNetError(ssl_info.cert_status); |
| 248 JNIEnv* env = base::android::AttachCurrentThread(); | 249 ReportError(request, net_error); |
| 249 cronet::Java_CronetUrlRequest_onError( | |
| 250 env, owner_.obj(), NetErrorToUrlRequestError(net_error), net_error, | |
| 251 net::QUIC_NO_ERROR, | |
| 252 ConvertUTF8ToJavaString(env, net::ErrorToString(net_error)).obj(), | |
| 253 request->GetTotalReceivedBytes()); | |
| 254 } | 250 } |
| 255 | 251 |
| 256 void CronetURLRequestAdapter::OnResponseStarted(net::URLRequest* request, | 252 void CronetURLRequestAdapter::OnResponseStarted(net::URLRequest* request, |
| 257 int net_error) { | 253 int net_error) { |
| 258 DCHECK_NE(net::ERR_IO_PENDING, net_error); | 254 DCHECK_NE(net::ERR_IO_PENDING, net_error); |
| 259 DCHECK(context_->IsOnNetworkThread()); | 255 DCHECK(context_->IsOnNetworkThread()); |
| 260 | 256 |
| 261 if (net_error != net::OK) { | 257 if (net_error != net::OK) { |
| 262 ReportError(request, net_error); | 258 ReportError(request, net_error); |
| 263 return; | 259 return; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 279 int bytes_read) { | 275 int bytes_read) { |
| 280 DCHECK(context_->IsOnNetworkThread()); | 276 DCHECK(context_->IsOnNetworkThread()); |
| 281 | 277 |
| 282 if (bytes_read < 0) { | 278 if (bytes_read < 0) { |
| 283 ReportError(request, bytes_read); | 279 ReportError(request, bytes_read); |
| 284 return; | 280 return; |
| 285 } | 281 } |
| 286 | 282 |
| 287 if (bytes_read == 0) { | 283 if (bytes_read == 0) { |
| 288 JNIEnv* env = base::android::AttachCurrentThread(); | 284 JNIEnv* env = base::android::AttachCurrentThread(); |
| 285 MaybeReportMetrics(env); |
| 289 cronet::Java_CronetUrlRequest_onSucceeded( | 286 cronet::Java_CronetUrlRequest_onSucceeded( |
| 290 env, owner_.obj(), url_request_->GetTotalReceivedBytes()); | 287 env, owner_.obj(), url_request_->GetTotalReceivedBytes()); |
| 291 } else { | 288 } else { |
| 292 JNIEnv* env = base::android::AttachCurrentThread(); | 289 JNIEnv* env = base::android::AttachCurrentThread(); |
| 293 cronet::Java_CronetUrlRequest_onReadCompleted( | 290 cronet::Java_CronetUrlRequest_onReadCompleted( |
| 294 env, owner_.obj(), read_buffer_->byte_buffer(), bytes_read, | 291 env, owner_.obj(), read_buffer_->byte_buffer(), bytes_read, |
| 295 read_buffer_->initial_position(), read_buffer_->initial_limit(), | 292 read_buffer_->initial_position(), read_buffer_->initial_limit(), |
| 296 request->GetTotalReceivedBytes()); | 293 request->GetTotalReceivedBytes()); |
| 297 // Free the read buffer. This lets the Java ByteBuffer be freed, if the | 294 // Free the read buffer. This lets the Java ByteBuffer be freed, if the |
| 298 // embedder releases it, too. | 295 // embedder releases it, too. |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 369 // If IO is pending, wait for the URLRequest to call OnReadCompleted. | 366 // If IO is pending, wait for the URLRequest to call OnReadCompleted. |
| 370 if (result == net::ERR_IO_PENDING) | 367 if (result == net::ERR_IO_PENDING) |
| 371 return; | 368 return; |
| 372 | 369 |
| 373 OnReadCompleted(url_request_.get(), result); | 370 OnReadCompleted(url_request_.get(), result); |
| 374 } | 371 } |
| 375 | 372 |
| 376 void CronetURLRequestAdapter::DestroyOnNetworkThread(bool send_on_canceled) { | 373 void CronetURLRequestAdapter::DestroyOnNetworkThread(bool send_on_canceled) { |
| 377 DCHECK(context_->IsOnNetworkThread()); | 374 DCHECK(context_->IsOnNetworkThread()); |
| 378 JNIEnv* env = base::android::AttachCurrentThread(); | 375 JNIEnv* env = base::android::AttachCurrentThread(); |
| 379 if (send_on_canceled) { | 376 MaybeReportMetrics(env); |
| 377 if (send_on_canceled) |
| 380 cronet::Java_CronetUrlRequest_onCanceled(env, owner_.obj()); | 378 cronet::Java_CronetUrlRequest_onCanceled(env, owner_.obj()); |
| 381 } | 379 cronet::Java_CronetUrlRequest_onNativeAdapterDestroyed(env, owner_.obj()); |
| 382 MaybeReportMetrics(env); | |
| 383 delete this; | 380 delete this; |
| 384 } | 381 } |
| 385 | 382 |
| 386 void CronetURLRequestAdapter::ReportError(net::URLRequest* request, | 383 void CronetURLRequestAdapter::ReportError(net::URLRequest* request, |
| 387 int net_error) { | 384 int net_error) { |
| 388 DCHECK_NE(net::ERR_IO_PENDING, net_error); | 385 DCHECK_NE(net::ERR_IO_PENDING, net_error); |
| 389 DCHECK_LT(net_error, 0); | 386 DCHECK_LT(net_error, 0); |
| 390 DCHECK_EQ(request, url_request_.get()); | 387 DCHECK_EQ(request, url_request_.get()); |
| 391 | 388 |
| 392 net::NetErrorDetails net_error_details; | 389 net::NetErrorDetails net_error_details; |
| 393 url_request_->PopulateNetErrorDetails(&net_error_details); | 390 url_request_->PopulateNetErrorDetails(&net_error_details); |
| 394 VLOG(1) << "Error " << net::ErrorToString(net_error) | 391 VLOG(1) << "Error " << net::ErrorToString(net_error) |
| 395 << " on chromium request: " << initial_url_.possibly_invalid_spec(); | 392 << " on chromium request: " << initial_url_.possibly_invalid_spec(); |
| 396 JNIEnv* env = base::android::AttachCurrentThread(); | 393 JNIEnv* env = base::android::AttachCurrentThread(); |
| 397 cronet::Java_CronetUrlRequest_onError( | 394 cronet::Java_CronetUrlRequest_onError( |
| 398 env, owner_.obj(), NetErrorToUrlRequestError(net_error), net_error, | 395 env, owner_.obj(), NetErrorToUrlRequestError(net_error), net_error, |
| 399 net_error_details.quic_connection_error, | 396 net_error_details.quic_connection_error, |
| 400 ConvertUTF8ToJavaString(env, net::ErrorToString(net_error)).obj(), | 397 ConvertUTF8ToJavaString(env, net::ErrorToString(net_error)).obj(), |
| 401 request->GetTotalReceivedBytes()); | 398 request->GetTotalReceivedBytes()); |
| 402 } | 399 } |
| 403 | 400 |
| 404 void CronetURLRequestAdapter::MaybeReportMetrics(JNIEnv* env) const { | 401 void CronetURLRequestAdapter::MaybeReportMetrics(JNIEnv* env) { |
| 405 // If there was an exception while starting the CronetUrlRequest, there won't | 402 // If there was an exception while starting the CronetUrlRequest, there won't |
| 406 // be a native URLRequest. In this case, the caller gets the exception | 403 // be a native URLRequest. In this case, the caller gets the exception |
| 407 // immediately, and the onFailed callback isn't called, so don't report | 404 // immediately, and the onFailed callback isn't called, so don't report |
| 408 // metrics either. | 405 // metrics either. |
| 409 if (!enable_metrics_ || !url_request_) { | 406 if (!enable_metrics_ || metrics_reported_ || !url_request_) { |
| 410 return; | 407 return; |
| 411 } | 408 } |
| 409 metrics_reported_ = true; |
| 412 net::LoadTimingInfo metrics; | 410 net::LoadTimingInfo metrics; |
| 413 url_request_->GetLoadTimingInfo(&metrics); | 411 url_request_->GetLoadTimingInfo(&metrics); |
| 414 base::Time start_time = metrics.request_start_time; | 412 base::Time start_time = metrics.request_start_time; |
| 415 base::TimeTicks start_ticks = metrics.request_start; | 413 base::TimeTicks start_ticks = metrics.request_start; |
| 416 Java_CronetUrlRequest_onMetricsCollected( | 414 Java_CronetUrlRequest_onMetricsCollected( |
| 417 env, owner_.obj(), | 415 env, owner_.obj(), |
| 418 metrics_util::ConvertTime(start_ticks, start_ticks, start_time), | 416 metrics_util::ConvertTime(start_ticks, start_ticks, start_time), |
| 419 metrics_util::ConvertTime(metrics.connect_timing.dns_start, start_ticks, | 417 metrics_util::ConvertTime(metrics.connect_timing.dns_start, start_ticks, |
| 420 start_time), | 418 start_time), |
| 421 metrics_util::ConvertTime(metrics.connect_timing.dns_end, start_ticks, | 419 metrics_util::ConvertTime(metrics.connect_timing.dns_end, start_ticks, |
| (...skipping 12 matching lines...) Expand all Loading... |
| 434 metrics_util::ConvertTime(metrics.push_end, start_ticks, start_time), | 432 metrics_util::ConvertTime(metrics.push_end, start_ticks, start_time), |
| 435 metrics_util::ConvertTime(metrics.receive_headers_end, start_ticks, | 433 metrics_util::ConvertTime(metrics.receive_headers_end, start_ticks, |
| 436 start_time), | 434 start_time), |
| 437 metrics_util::ConvertTime(base::TimeTicks::Now(), start_ticks, | 435 metrics_util::ConvertTime(base::TimeTicks::Now(), start_ticks, |
| 438 start_time), | 436 start_time), |
| 439 metrics.socket_reused, url_request_->GetTotalSentBytes(), | 437 metrics.socket_reused, url_request_->GetTotalSentBytes(), |
| 440 url_request_->GetTotalReceivedBytes()); | 438 url_request_->GetTotalReceivedBytes()); |
| 441 } | 439 } |
| 442 | 440 |
| 443 } // namespace cronet | 441 } // namespace cronet |
| OLD | NEW |