Chromium Code Reviews| Index: net/http/http_stream_factory_impl_job.cc |
| diff --git a/net/http/http_stream_factory_impl_job.cc b/net/http/http_stream_factory_impl_job.cc |
| index 8ac81e681e670de409449473ebfb84201a763235..d838cc8d2a5e62f3a9661022515f29e5261ec765 100644 |
| --- a/net/http/http_stream_factory_impl_job.cc |
| +++ b/net/http/http_stream_factory_impl_job.cc |
| @@ -130,15 +130,6 @@ std::unique_ptr<base::Value> NetLogHttpStreamJobCallback( |
| return std::move(dict); |
| } |
| -// Returns parameters associated with the delay of the HTTP stream job. |
| -std::unique_ptr<base::Value> NetLogHttpStreamJobDelayCallback( |
| - base::TimeDelta delay, |
| - NetLogCaptureMode /* capture_mode */) { |
| - std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
| - dict->SetInteger("resume_after_ms", static_cast<int>(delay.InMilliseconds())); |
| - return std::move(dict); |
| -} |
| - |
| // Returns parameters associated with the Proto (with NPN negotiation) of a HTTP |
| // stream. |
| std::unique_ptr<base::Value> NetLogHttpStreamProtoCallback( |
| @@ -201,8 +192,6 @@ HttpStreamFactoryImpl::Job::Job(Delegate* delegate, |
| alternative_service_(alternative_service), |
| delegate_(delegate), |
| job_type_(job_type), |
| - blocking_job_(NULL), |
| - waiting_job_(NULL), |
| using_ssl_(false), |
| using_spdy_(false), |
| using_quic_(false), |
| @@ -288,60 +277,16 @@ LoadState HttpStreamFactoryImpl::Job::GetLoadState() const { |
| } |
| } |
| -void HttpStreamFactoryImpl::Job::WaitFor(Job* job) { |
| - DCHECK_EQ(STATE_NONE, next_state_); |
| - DCHECK_EQ(STATE_NONE, job->next_state_); |
| - DCHECK(!blocking_job_); |
| - DCHECK(!job->waiting_job_); |
| - |
| - // Never share connection with other jobs for FTP requests. |
| - DCHECK(!request_info_.url.SchemeIs("ftp")); |
| - |
| - blocking_job_ = job; |
| - job->waiting_job_ = this; |
| -} |
| - |
| -void HttpStreamFactoryImpl::Job::ResumeAfterDelay() { |
| - DCHECK(!blocking_job_); |
| - DCHECK_EQ(STATE_WAIT_FOR_JOB_COMPLETE, next_state_); |
| - |
| - net_log_.AddEvent(NetLog::TYPE_HTTP_STREAM_JOB_DELAYED, |
| - base::Bind(&NetLogHttpStreamJobDelayCallback, wait_time_)); |
| - base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
| - FROM_HERE, base::Bind(&HttpStreamFactoryImpl::Job::OnIOComplete, |
| - ptr_factory_.GetWeakPtr(), OK), |
| - wait_time_); |
| -} |
| - |
| -void HttpStreamFactoryImpl::Job::Resume(Job* job, |
| - const base::TimeDelta& delay) { |
| - DCHECK_EQ(blocking_job_, job); |
| - blocking_job_ = NULL; |
| - |
| - // If |this| job is not past STATE_WAIT_FOR_JOB_COMPLETE state, then it will |
| - // be delayed by the |wait_time_| when it resumes. |
| - if (next_state_ == STATE_NONE || next_state_ <= STATE_WAIT_FOR_JOB_COMPLETE) |
| - wait_time_ = delay; |
| - |
| - // We know we're blocked if the next_state_ is STATE_WAIT_FOR_JOB_COMPLETE. |
| - // Unblock |this|. |
| - if (next_state_ == STATE_WAIT_FOR_JOB_COMPLETE) |
| - ResumeAfterDelay(); |
| +void HttpStreamFactoryImpl::Job::Resume() { |
| + DCHECK_EQ(job_type_, MAIN); |
| + DCHECK_EQ(next_state_, STATE_WAIT_COMPLETE); |
| + OnIOComplete(OK); |
| } |
| void HttpStreamFactoryImpl::Job::Orphan() { |
| net_log_.AddEvent(NetLog::TYPE_HTTP_STREAM_JOB_ORPHANED); |
| - if (blocking_job_) { |
| - // We've been orphaned, but there's a job we're blocked on. Don't bother |
| - // racing, just cancel ourself. |
| - DCHECK(blocking_job_->waiting_job_); |
| - blocking_job_->waiting_job_ = NULL; |
| - blocking_job_ = NULL; |
| - if (delegate_->for_websockets() && connection_ && connection_->socket()) { |
| - connection_->socket()->Disconnect(); |
| - } |
| - delegate_->OnOrphanedJobComplete(this); |
| - } else if (delegate_->for_websockets()) { |
| + |
| + if (delegate_->for_websockets()) { |
| // We cancel this job because a WebSocketHandshakeStream can't be created |
| // without a WebSocketHandshakeStreamBase::CreateHelper which is stored in |
| // the Request class and isn't retrievable by this job. |
| @@ -558,10 +503,6 @@ int HttpStreamFactoryImpl::Job::RunLoop(int result) { |
| if (result == ERR_IO_PENDING) |
| return result; |
| - // If there was an error, we should have already resumed the |waiting_job_|, |
| - // if there was one. |
| - DCHECK(result == OK || waiting_job_ == NULL); |
| - |
| if (job_type_ == PRECONNECT) { |
| base::ThreadTaskRunnerHandle::Get()->PostTask( |
| FROM_HERE, |
| @@ -695,12 +636,12 @@ int HttpStreamFactoryImpl::Job::DoLoop(int result) { |
| case STATE_RESOLVE_PROXY_COMPLETE: |
| rv = DoResolveProxyComplete(rv); |
| break; |
| - case STATE_WAIT_FOR_JOB: |
| + case STATE_WAIT: |
| DCHECK_EQ(OK, rv); |
| - rv = DoWaitForJob(); |
| + rv = DoWait(); |
| break; |
| - case STATE_WAIT_FOR_JOB_COMPLETE: |
| - rv = DoWaitForJobComplete(rv); |
| + case STATE_WAIT_COMPLETE: |
| + rv = DoWaitComplete(rv); |
| break; |
| case STATE_INIT_CONNECTION: |
| DCHECK_EQ(OK, rv); |
| @@ -761,10 +702,6 @@ int HttpStreamFactoryImpl::Job::DoStart() { |
| // Don't connect to restricted ports. |
| if (!IsPortAllowedForScheme(destination_.port(), |
| request_info_.url.scheme())) { |
| - if (waiting_job_) { |
| - waiting_job_->Resume(this, base::TimeDelta()); |
| - waiting_job_ = NULL; |
| - } |
| return ERR_UNSAFE_PORT; |
| } |
| @@ -837,14 +774,10 @@ int HttpStreamFactoryImpl::Job::DoResolveProxyComplete(int result) { |
| } |
| if (result != OK) { |
| - if (waiting_job_) { |
| - waiting_job_->Resume(this, base::TimeDelta()); |
| - waiting_job_ = NULL; |
| - } |
| return result; |
| } |
| - next_state_ = STATE_WAIT_FOR_JOB; |
| + next_state_ = STATE_WAIT; |
| return OK; |
| } |
| @@ -855,37 +788,33 @@ bool HttpStreamFactoryImpl::Job::ShouldForceQuic() const { |
| proxy_info_.is_direct() && origin_url_.SchemeIs("https"); |
| } |
| -int HttpStreamFactoryImpl::Job::DoWaitForJob() { |
| - if (!blocking_job_ && wait_time_.is_zero()) { |
| - // There is no |blocking_job_| and there is no |wait_time_|. |
| - next_state_ = STATE_INIT_CONNECTION; |
| - return OK; |
| - } |
| - |
| - next_state_ = STATE_WAIT_FOR_JOB_COMPLETE; |
| - if (!wait_time_.is_zero()) { |
| - // If there is a waiting_time, then resume the job after the wait_time_. |
| - DCHECK(!blocking_job_); |
| - ResumeAfterDelay(); |
| - } |
| +int HttpStreamFactoryImpl::Job::DoWait() { |
| + next_state_ = STATE_WAIT_COMPLETE; |
| + if (delegate_->ShouldWait(this)) |
| + return ERR_IO_PENDING; |
| - return ERR_IO_PENDING; |
| + next_state_ = STATE_INIT_CONNECTION; |
|
Ryan Hamilton
2016/07/12 00:21:45
nit: It's cleaner to just remove this. Then we'll
Zhongyi Shi
2016/07/12 23:03:12
Done.
|
| + return OK; |
| } |
| -int HttpStreamFactoryImpl::Job::DoWaitForJobComplete(int result) { |
| - DCHECK(!blocking_job_); |
| +int HttpStreamFactoryImpl::Job::DoWaitComplete(int result) { |
| DCHECK_EQ(OK, result); |
| - wait_time_ = base::TimeDelta(); |
| next_state_ = STATE_INIT_CONNECTION; |
| return OK; |
| } |
| int HttpStreamFactoryImpl::Job::DoInitConnection() { |
| + int result = DoInitConnectionImpl(); |
| + delegate_->OnConnectionInitialized(this, result); |
| + |
| + return result; |
| +} |
| + |
| +int HttpStreamFactoryImpl::Job::DoInitConnectionImpl() { |
| // TODO(pkasting): Remove ScopedTracker below once crbug.com/462812 is fixed. |
| tracked_objects::ScopedTracker tracking_profile( |
| FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| "462812 HttpStreamFactoryImpl::Job::DoInitConnection")); |
| - DCHECK(!blocking_job_); |
| DCHECK(!connection_->is_initialized()); |
| DCHECK(proxy_info_.proxy_server().is_valid()); |
| next_state_ = STATE_INIT_CONNECTION_COMPLETE; |
| @@ -957,21 +886,13 @@ int HttpStreamFactoryImpl::Job::DoInitConnection() { |
| if (rv == OK) { |
| using_existing_quic_session_ = true; |
| } else { |
| - // OK, there's no available QUIC session. Let |waiting_job_| resume |
| - // if it's paused. |
| - if (waiting_job_) { |
| - if (rv == ERR_IO_PENDING) { |
| - // Start the |waiting_job_| after the delay returned by |
| - // GetTimeDelayForWaitingJob(). |
| - // |
| - // If QUIC request fails during handshake, then |
| - // DoInitConnectionComplete() will start the |waiting_job_|. |
| - waiting_job_->Resume(this, quic_request_.GetTimeDelayForWaitingJob()); |
| - } else { |
| - // QUIC request has failed, resume the |waiting_job_|. |
| - waiting_job_->Resume(this, base::TimeDelta()); |
| - } |
| - waiting_job_ = NULL; |
| + base::TimeDelta delay; |
| + // OK, there's no available QUIC session. Let JobController to resume |
| + // the waiting job if it's paused. |
|
Ryan Hamilton
2016/07/12 00:21:44
nit: Let's tweak this comment slightly since all t
Zhongyi Shi
2016/07/12 23:03:12
Done.
|
| + if (rv == ERR_IO_PENDING) { |
| + // Set the wait time for main job if it is delayed TCP. |
| + delegate_->SetWaitTimeForMainJob( |
| + quic_request_.GetTimeDelayForWaitingJob()); |
| } |
| } |
| return rv; |
| @@ -1004,13 +925,6 @@ int HttpStreamFactoryImpl::Job::DoInitConnection() { |
| delegate_->SetSpdySessionKey(this, spdy_session_key); |
| } |
| - // OK, there's no available SPDY session. Let |waiting_job_| resume if it's |
| - // paused. |
| - if (waiting_job_) { |
| - waiting_job_->Resume(this, base::TimeDelta()); |
| - waiting_job_ = NULL; |
| - } |
| - |
| if (proxy_info_.is_http() || proxy_info_.is_https()) |
| establishing_tunnel_ = using_ssl_; |
| @@ -1063,10 +977,6 @@ int HttpStreamFactoryImpl::Job::DoInitConnection() { |
| } |
| int HttpStreamFactoryImpl::Job::DoInitConnectionComplete(int result) { |
| - if (using_quic_ && result < 0 && waiting_job_) { |
| - waiting_job_->Resume(this, base::TimeDelta()); |
| - waiting_job_ = NULL; |
| - } |
| if (job_type_ == PRECONNECT) { |
| if (using_quic_) |
| return result; |
| @@ -1075,7 +985,7 @@ int HttpStreamFactoryImpl::Job::DoInitConnectionComplete(int result) { |
| } |
| if (result == ERR_SPDY_SESSION_ALREADY_EXISTS) { |
| - // We found a SPDY connection after resolving the host. This is |
| + // We found a SPDY connection after resolving the host. This is |
| // probably an IP pooled connection. |
| SpdySessionKey spdy_session_key = GetSpdySessionKey(); |
| existing_spdy_session_ = |
| @@ -1101,13 +1011,6 @@ int HttpStreamFactoryImpl::Job::DoInitConnectionComplete(int result) { |
| } |
| } |
| - // TODO(willchan): Make this a bit more exact. Maybe there are recoverable |
| - // errors, such as ignoring certificate errors for Alternate-Protocol. |
| - if (result < 0 && waiting_job_) { |
| - waiting_job_->Resume(this, base::TimeDelta()); |
| - waiting_job_ = NULL; |
| - } |
| - |
| // |result| may be the result of any of the stacked pools. The following |
| // logic is used when determining how to interpret an error. |
| // If |result| < 0: |