Chromium Code Reviews| 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 #include "net/url_request/url_request.h" | 5 #include "net/url_request/url_request.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 152 SSLCertRequestInfo* cert_request_info) { | 152 SSLCertRequestInfo* cert_request_info) { |
| 153 request->CancelWithError(ERR_SSL_CLIENT_AUTH_CERT_NEEDED); | 153 request->CancelWithError(ERR_SSL_CLIENT_AUTH_CERT_NEEDED); |
| 154 } | 154 } |
| 155 | 155 |
| 156 void URLRequest::Delegate::OnSSLCertificateError(URLRequest* request, | 156 void URLRequest::Delegate::OnSSLCertificateError(URLRequest* request, |
| 157 const SSLInfo& ssl_info, | 157 const SSLInfo& ssl_info, |
| 158 bool is_hsts_ok) { | 158 bool is_hsts_ok) { |
| 159 request->Cancel(); | 159 request->Cancel(); |
| 160 } | 160 } |
| 161 | 161 |
| 162 void URLRequest::Delegate::NotifyOnResponseStarted(URLRequest* request, | |
| 163 int net_error) { | |
| 164 DCHECK(request); | |
| 165 | |
| 166 implemented_ = true; | |
| 167 | |
| 168 OnResponseStarted(request, net_error); | |
| 169 if (!implemented_) | |
|
mmenke
2016/08/26 19:36:48
The issue with the failures is that the OnResponse
maksims (do not use this acc)
2016/08/29 12:30:35
Oh, thanks! Good to know this trick!
| |
| 170 OnResponseStarted(request); | |
| 171 } | |
| 172 | |
| 173 void URLRequest::Delegate::OnResponseStarted(URLRequest* request, | |
| 174 int net_error) { | |
| 175 NOTIMPLEMENTED(); | |
| 176 implemented_ = false; | |
| 177 } | |
| 178 | |
| 179 void URLRequest::Delegate::OnResponseStarted(URLRequest* request) {} | |
| 180 | |
| 162 /////////////////////////////////////////////////////////////////////////////// | 181 /////////////////////////////////////////////////////////////////////////////// |
| 163 // URLRequest | 182 // URLRequest |
| 164 | 183 |
| 165 URLRequest::~URLRequest() { | 184 URLRequest::~URLRequest() { |
| 166 Cancel(); | 185 Cancel(); |
| 167 | 186 |
| 168 if (network_delegate_) { | 187 if (network_delegate_) { |
| 169 network_delegate_->NotifyURLRequestDestroyed(this); | 188 network_delegate_->NotifyURLRequestDestroyed(this); |
| 170 if (job_.get()) | 189 if (job_.get()) |
| 171 job_->NotifyURLRequestDestroyed(); | 190 job_->NotifyURLRequestDestroyed(); |
| (...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 489 | 508 |
| 490 void URLRequest::set_delegate(Delegate* delegate) { | 509 void URLRequest::set_delegate(Delegate* delegate) { |
| 491 DCHECK(!delegate_); | 510 DCHECK(!delegate_); |
| 492 DCHECK(delegate); | 511 DCHECK(delegate); |
| 493 delegate_ = delegate; | 512 delegate_ = delegate; |
| 494 } | 513 } |
| 495 | 514 |
| 496 void URLRequest::Start() { | 515 void URLRequest::Start() { |
| 497 DCHECK(delegate_); | 516 DCHECK(delegate_); |
| 498 | 517 |
| 518 if (!status_.is_success()) | |
| 519 return; | |
| 520 | |
| 499 // TODO(pkasting): Remove ScopedTracker below once crbug.com/456327 is fixed. | 521 // TODO(pkasting): Remove ScopedTracker below once crbug.com/456327 is fixed. |
| 500 tracked_objects::ScopedTracker tracking_profile( | 522 tracked_objects::ScopedTracker tracking_profile( |
| 501 FROM_HERE_WITH_EXPLICIT_FUNCTION("456327 URLRequest::Start")); | 523 FROM_HERE_WITH_EXPLICIT_FUNCTION("456327 URLRequest::Start")); |
| 502 | 524 |
| 503 // Some values can be NULL, but the job factory must not be. | 525 // Some values can be NULL, but the job factory must not be. |
| 504 DCHECK(context_->job_factory()); | 526 DCHECK(context_->job_factory()); |
| 505 | 527 |
| 506 // Anything that sets |blocked_by_| before start should have cleaned up after | 528 // Anything that sets |blocked_by_| before start should have cleaned up after |
| 507 // itself. | 529 // itself. |
| 508 DCHECK(blocked_by_.empty()); | 530 DCHECK(blocked_by_.empty()); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 548 network_delegate_(network_delegate ? network_delegate | 570 network_delegate_(network_delegate ? network_delegate |
| 549 : context->network_delegate()), | 571 : context->network_delegate()), |
| 550 net_log_( | 572 net_log_( |
| 551 BoundNetLog::Make(context->net_log(), NetLog::SOURCE_URL_REQUEST)), | 573 BoundNetLog::Make(context->net_log(), NetLog::SOURCE_URL_REQUEST)), |
| 552 url_chain_(1, url), | 574 url_chain_(1, url), |
| 553 method_("GET"), | 575 method_("GET"), |
| 554 referrer_policy_(CLEAR_REFERRER_ON_TRANSITION_FROM_SECURE_TO_INSECURE), | 576 referrer_policy_(CLEAR_REFERRER_ON_TRANSITION_FROM_SECURE_TO_INSECURE), |
| 555 first_party_url_policy_(NEVER_CHANGE_FIRST_PARTY_URL), | 577 first_party_url_policy_(NEVER_CHANGE_FIRST_PARTY_URL), |
| 556 load_flags_(LOAD_NORMAL), | 578 load_flags_(LOAD_NORMAL), |
| 557 delegate_(delegate), | 579 delegate_(delegate), |
| 580 status_(URLRequestStatus::FromError(OK)), | |
| 558 is_pending_(false), | 581 is_pending_(false), |
| 559 is_redirecting_(false), | 582 is_redirecting_(false), |
| 560 redirect_limit_(kMaxRedirects), | 583 redirect_limit_(kMaxRedirects), |
| 561 priority_(priority), | 584 priority_(priority), |
| 562 identifier_(GenerateURLRequestIdentifier()), | 585 identifier_(GenerateURLRequestIdentifier()), |
| 563 calling_delegate_(false), | 586 calling_delegate_(false), |
| 564 use_blocked_by_as_load_param_(false), | 587 use_blocked_by_as_load_param_(false), |
| 565 before_request_callback_(base::Bind(&URLRequest::BeforeRequestComplete, | 588 before_request_callback_(base::Bind(&URLRequest::BeforeRequestComplete, |
| 566 base::Unretained(this))), | 589 base::Unretained(this))), |
| 567 has_notified_completion_(false), | 590 has_notified_completion_(false), |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 665 RestartWithJob( | 688 RestartWithJob( |
| 666 URLRequestJobManager::GetInstance()->CreateJob(this, network_delegate_)); | 689 URLRequestJobManager::GetInstance()->CreateJob(this, network_delegate_)); |
| 667 } | 690 } |
| 668 | 691 |
| 669 void URLRequest::RestartWithJob(URLRequestJob *job) { | 692 void URLRequest::RestartWithJob(URLRequestJob *job) { |
| 670 DCHECK(job->request() == this); | 693 DCHECK(job->request() == this); |
| 671 PrepareToRestart(); | 694 PrepareToRestart(); |
| 672 StartJob(job); | 695 StartJob(job); |
| 673 } | 696 } |
| 674 | 697 |
| 675 void URLRequest::Cancel() { | 698 int URLRequest::Cancel() { |
| 676 DoCancel(ERR_ABORTED, SSLInfo()); | 699 return DoCancel(ERR_ABORTED, SSLInfo()); |
| 677 } | 700 } |
| 678 | 701 |
| 679 void URLRequest::CancelWithError(int error) { | 702 int URLRequest::CancelWithError(int error) { |
| 680 DoCancel(error, SSLInfo()); | 703 return DoCancel(error, SSLInfo()); |
| 681 } | 704 } |
| 682 | 705 |
| 683 void URLRequest::CancelWithSSLError(int error, const SSLInfo& ssl_info) { | 706 void URLRequest::CancelWithSSLError(int error, const SSLInfo& ssl_info) { |
| 684 // This should only be called on a started request. | 707 // This should only be called on a started request. |
| 685 if (!is_pending_ || !job_.get() || job_->has_response_started()) { | 708 if (!is_pending_ || !job_.get() || job_->has_response_started()) { |
| 686 NOTREACHED(); | 709 NOTREACHED(); |
| 687 return; | 710 return; |
| 688 } | 711 } |
| 689 DoCancel(error, ssl_info); | 712 DoCancel(error, ssl_info); |
| 690 } | 713 } |
| 691 | 714 |
| 692 void URLRequest::DoCancel(int error, const SSLInfo& ssl_info) { | 715 int URLRequest::DoCancel(int error, const SSLInfo& ssl_info) { |
| 693 DCHECK(error < 0); | 716 DCHECK(error < 0); |
| 694 // If cancelled while calling a delegate, clear delegate info. | 717 // If cancelled while calling a delegate, clear delegate info. |
| 695 if (calling_delegate_) { | 718 if (calling_delegate_) { |
| 696 LogUnblocked(); | 719 LogUnblocked(); |
| 697 OnCallToDelegateComplete(); | 720 OnCallToDelegateComplete(); |
| 698 } | 721 } |
| 699 | 722 |
| 700 // If the URL request already has an error status, then canceling is a no-op. | 723 // If the URL request already has an error status, then canceling is a no-op. |
| 701 // Plus, we don't want to change the error status once it has been set. | 724 // Plus, we don't want to change the error status once it has been set. |
| 702 if (status_.is_success()) { | 725 if (status_.is_success()) { |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 715 job_->Kill(); | 738 job_->Kill(); |
| 716 | 739 |
| 717 // We need to notify about the end of this job here synchronously. The | 740 // We need to notify about the end of this job here synchronously. The |
| 718 // Job sends an asynchronous notification but by the time this is processed, | 741 // Job sends an asynchronous notification but by the time this is processed, |
| 719 // our |context_| is NULL. | 742 // our |context_| is NULL. |
| 720 NotifyRequestCompleted(); | 743 NotifyRequestCompleted(); |
| 721 | 744 |
| 722 // The Job will call our NotifyDone method asynchronously. This is done so | 745 // The Job will call our NotifyDone method asynchronously. This is done so |
| 723 // that the Delegate implementation can call Cancel without having to worry | 746 // that the Delegate implementation can call Cancel without having to worry |
| 724 // about being called recursively. | 747 // about being called recursively. |
| 748 return status_.error(); | |
| 725 } | 749 } |
| 726 | 750 |
| 751 int URLRequest::Read(IOBuffer* dest, int dest_size) { | |
| 752 DCHECK(job_.get()); | |
| 753 | |
| 754 // If this is the first read, end the delegate call that may have started in | |
| 755 // OnResponseStarted. | |
| 756 OnCallToDelegateComplete(); | |
| 757 | |
| 758 // Once the request fails or is cancelled, read will just return 0 bytes | |
| 759 // to indicate end of stream. | |
| 760 if (!status_.is_success()) { | |
|
mmenke
2016/08/26 19:36:48
Can this happen, if job_->is_done() is false?
(Al
maksims (do not use this acc)
2016/08/29 12:30:35
Yes, if URLRequestJob::NotifyStartError() is calle
| |
| 761 return status_.error(); | |
| 762 } | |
| 763 | |
| 764 // This handles a cancel that happens while paused. | |
| 765 // TODO(ahendrickson): DCHECK() that it is not done after | |
| 766 // http://crbug.com/115705 is fixed. | |
| 767 if (job_->is_done()) | |
| 768 return status_.error(); | |
| 769 | |
| 770 if (dest_size == 0) { | |
| 771 // Caller is not too bright. I guess we've done what they asked. | |
| 772 return OK; | |
| 773 } | |
| 774 | |
| 775 int rv = job_->Read(dest, dest_size); | |
| 776 if (rv == ERR_IO_PENDING) | |
| 777 set_status(URLRequestStatus::FromError(ERR_IO_PENDING)); | |
| 778 | |
| 779 // If rv is not 0 or actual bytes read, the status cannot be success. | |
| 780 DCHECK(!(rv < 0) || status_.status() != URLRequestStatus::SUCCESS); | |
|
mmenke
2016/08/26 19:36:48
Think rv >= 0 is easier to read, for the first che
maksims (do not use this acc)
2016/08/29 12:30:35
Done.
| |
| 781 | |
| 782 if (rv == 0 && status_.is_success()) | |
| 783 NotifyRequestCompleted(); | |
| 784 return rv; | |
| 785 } | |
| 786 | |
| 787 // Deprecated. | |
| 727 bool URLRequest::Read(IOBuffer* dest, int dest_size, int* bytes_read) { | 788 bool URLRequest::Read(IOBuffer* dest, int dest_size, int* bytes_read) { |
| 728 DCHECK(job_.get()); | 789 DCHECK(job_.get()); |
| 729 DCHECK(bytes_read); | 790 DCHECK(bytes_read); |
|
mmenke
2016/08/26 19:36:48
Isn't everything below this the same as:
int resu
maksims (do not use this acc)
2016/08/29 12:30:35
Right! Thanks!
| |
| 730 *bytes_read = 0; | 791 *bytes_read = 0; |
| 731 | 792 |
| 732 // If this is the first read, end the delegate call that may have started in | 793 // If this is the first read, end the delegate call that may have started in |
| 733 // OnResponseStarted. | 794 // OnResponseStarted. |
| 734 OnCallToDelegateComplete(); | 795 OnCallToDelegateComplete(); |
| 735 | 796 |
| 736 // This handles a cancel that happens while paused. | 797 // This handles a cancel that happens while paused. |
| 737 // TODO(ahendrickson): DCHECK() that it is not done after | 798 // TODO(ahendrickson): DCHECK() that it is not done after |
| 738 // http://crbug.com/115705 is fixed. | 799 // http://crbug.com/115705 is fixed. |
| 739 if (job_->is_done()) | 800 if (job_->is_done()) |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 819 URLRequestJob* job = | 880 URLRequestJob* job = |
| 820 URLRequestJobManager::GetInstance()->MaybeInterceptResponse( | 881 URLRequestJobManager::GetInstance()->MaybeInterceptResponse( |
| 821 this, network_delegate_); | 882 this, network_delegate_); |
| 822 if (job) { | 883 if (job) { |
| 823 RestartWithJob(job); | 884 RestartWithJob(job); |
| 824 } else { | 885 } else { |
| 825 // In some cases (e.g. an event was canceled), we might have sent the | 886 // In some cases (e.g. an event was canceled), we might have sent the |
| 826 // completion event and receive a NotifyResponseStarted() later. | 887 // completion event and receive a NotifyResponseStarted() later. |
| 827 if (!has_notified_completion_ && status_.is_success()) { | 888 if (!has_notified_completion_ && status_.is_success()) { |
| 828 if (network_delegate_) | 889 if (network_delegate_) |
| 829 network_delegate_->NotifyResponseStarted(this); | 890 network_delegate_->NotifyResponseStarted(this, net_error); |
| 830 } | 891 } |
| 831 | 892 |
| 832 // Notify in case the entire URL Request has been finished. | 893 // Notify in case the entire URL Request has been finished. |
| 833 if (!has_notified_completion_ && !status_.is_success()) | 894 if (!has_notified_completion_ && !status_.is_success()) |
| 834 NotifyRequestCompleted(); | 895 NotifyRequestCompleted(); |
| 835 | 896 |
| 836 OnCallToDelegate(); | 897 OnCallToDelegate(); |
| 837 delegate_->OnResponseStarted(this); | 898 delegate_->NotifyOnResponseStarted(this, net_error); |
| 838 // Nothing may appear below this line as OnResponseStarted may delete | 899 // Nothing may appear below this line as OnResponseStarted may delete |
| 839 // |this|. | 900 // |this|. |
| 840 } | 901 } |
| 841 } | 902 } |
| 842 | 903 |
| 843 void URLRequest::FollowDeferredRedirect() { | 904 void URLRequest::FollowDeferredRedirect() { |
| 844 DCHECK(job_.get()); | 905 DCHECK(job_.get()); |
| 845 DCHECK(status_.is_success()); | 906 DCHECK(status_.is_success()); |
| 846 | 907 |
| 847 status_ = URLRequestStatus::FromError(ERR_IO_PENDING); | 908 status_ = URLRequestStatus::FromError(ERR_IO_PENDING); |
| (...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1133 } | 1194 } |
| 1134 | 1195 |
| 1135 | 1196 |
| 1136 void URLRequest::NotifyReadCompleted(int bytes_read) { | 1197 void URLRequest::NotifyReadCompleted(int bytes_read) { |
| 1137 if (bytes_read > 0) | 1198 if (bytes_read > 0) |
| 1138 set_status(URLRequestStatus()); | 1199 set_status(URLRequestStatus()); |
| 1139 // Notify in case the entire URL Request has been finished. | 1200 // Notify in case the entire URL Request has been finished. |
| 1140 if (bytes_read <= 0) | 1201 if (bytes_read <= 0) |
| 1141 NotifyRequestCompleted(); | 1202 NotifyRequestCompleted(); |
| 1142 | 1203 |
| 1204 // When URLRequestJob notices there was an error in URLRequest's |status_|, | |
| 1205 // it calls this method with |bytes_read| set to -1. Set it to a real error | |
| 1206 // here. | |
| 1207 if (bytes_read == -1) | |
| 1208 bytes_read = status_.error(); | |
| 1209 | |
| 1143 // Notify NetworkChangeNotifier that we just received network data. | 1210 // Notify NetworkChangeNotifier that we just received network data. |
| 1144 // This is to identify cases where the NetworkChangeNotifier thinks we | 1211 // This is to identify cases where the NetworkChangeNotifier thinks we |
| 1145 // are off-line but we are still receiving network data (crbug.com/124069), | 1212 // are off-line but we are still receiving network data (crbug.com/124069), |
| 1146 // and to get rough network connection measurements. | 1213 // and to get rough network connection measurements. |
| 1147 if (bytes_read > 0 && !was_cached()) | 1214 if (bytes_read > 0 && !was_cached()) |
| 1148 NetworkChangeNotifier::NotifyDataReceived(*this, bytes_read); | 1215 NetworkChangeNotifier::NotifyDataReceived(*this, bytes_read); |
| 1149 | 1216 |
| 1150 delegate_->OnReadCompleted(this, bytes_read); | 1217 delegate_->OnReadCompleted(this, bytes_read); |
| 1151 | 1218 |
| 1152 // Nothing below this line as OnReadCompleted may delete |this|. | 1219 // Nothing below this line as OnReadCompleted may delete |this|. |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 1177 void URLRequest::NotifyRequestCompleted() { | 1244 void URLRequest::NotifyRequestCompleted() { |
| 1178 // TODO(battre): Get rid of this check, according to willchan it should | 1245 // TODO(battre): Get rid of this check, according to willchan it should |
| 1179 // not be needed. | 1246 // not be needed. |
| 1180 if (has_notified_completion_) | 1247 if (has_notified_completion_) |
| 1181 return; | 1248 return; |
| 1182 | 1249 |
| 1183 is_pending_ = false; | 1250 is_pending_ = false; |
| 1184 is_redirecting_ = false; | 1251 is_redirecting_ = false; |
| 1185 has_notified_completion_ = true; | 1252 has_notified_completion_ = true; |
| 1186 if (network_delegate_) | 1253 if (network_delegate_) |
| 1187 network_delegate_->NotifyCompleted(this, job_.get() != NULL); | 1254 network_delegate_->NotifyCompleted(this, job_.get() != NULL, |
| 1255 status_.error()); | |
| 1188 } | 1256 } |
| 1189 | 1257 |
| 1190 void URLRequest::OnCallToDelegate() { | 1258 void URLRequest::OnCallToDelegate() { |
| 1191 DCHECK(!calling_delegate_); | 1259 DCHECK(!calling_delegate_); |
| 1192 DCHECK(blocked_by_.empty()); | 1260 DCHECK(blocked_by_.empty()); |
| 1193 calling_delegate_ = true; | 1261 calling_delegate_ = true; |
| 1194 net_log_.BeginEvent(NetLog::TYPE_URL_REQUEST_DELEGATE); | 1262 net_log_.BeginEvent(NetLog::TYPE_URL_REQUEST_DELEGATE); |
| 1195 } | 1263 } |
| 1196 | 1264 |
| 1197 void URLRequest::OnCallToDelegateComplete() { | 1265 void URLRequest::OnCallToDelegateComplete() { |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 1210 out->clear(); | 1278 out->clear(); |
| 1211 } | 1279 } |
| 1212 | 1280 |
| 1213 void URLRequest::set_status(URLRequestStatus status) { | 1281 void URLRequest::set_status(URLRequestStatus status) { |
| 1214 DCHECK(status_.is_io_pending() || status_.is_success() || | 1282 DCHECK(status_.is_io_pending() || status_.is_success() || |
| 1215 (!status.is_success() && !status.is_io_pending())); | 1283 (!status.is_success() && !status.is_io_pending())); |
| 1216 status_ = status; | 1284 status_ = status; |
| 1217 } | 1285 } |
| 1218 | 1286 |
| 1219 } // namespace net | 1287 } // namespace net |
| OLD | NEW |