| Index: net/url_request/url_request_ftp_job.cc
|
| diff --git a/net/url_request/url_request_ftp_job.cc b/net/url_request/url_request_ftp_job.cc
|
| deleted file mode 100644
|
| index d1050e332a5b60faafb49e2787f2fda695f2cec3..0000000000000000000000000000000000000000
|
| --- a/net/url_request/url_request_ftp_job.cc
|
| +++ /dev/null
|
| @@ -1,419 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "net/url_request/url_request_ftp_job.h"
|
| -
|
| -#include "base/compiler_specific.h"
|
| -#include "base/message_loop/message_loop.h"
|
| -#include "base/profiler/scoped_tracker.h"
|
| -#include "base/strings/utf_string_conversions.h"
|
| -#include "net/base/auth.h"
|
| -#include "net/base/host_port_pair.h"
|
| -#include "net/base/load_flags.h"
|
| -#include "net/base/net_errors.h"
|
| -#include "net/base/net_util.h"
|
| -#include "net/ftp/ftp_auth_cache.h"
|
| -#include "net/ftp/ftp_response_info.h"
|
| -#include "net/ftp/ftp_transaction_factory.h"
|
| -#include "net/http/http_response_headers.h"
|
| -#include "net/http/http_transaction_factory.h"
|
| -#include "net/url_request/url_request.h"
|
| -#include "net/url_request/url_request_context.h"
|
| -#include "net/url_request/url_request_error_job.h"
|
| -
|
| -namespace net {
|
| -
|
| -URLRequestFtpJob::URLRequestFtpJob(
|
| - URLRequest* request,
|
| - NetworkDelegate* network_delegate,
|
| - FtpTransactionFactory* ftp_transaction_factory,
|
| - FtpAuthCache* ftp_auth_cache)
|
| - : URLRequestJob(request, network_delegate),
|
| - priority_(DEFAULT_PRIORITY),
|
| - proxy_service_(request_->context()->proxy_service()),
|
| - pac_request_(NULL),
|
| - http_response_info_(NULL),
|
| - read_in_progress_(false),
|
| - ftp_transaction_factory_(ftp_transaction_factory),
|
| - ftp_auth_cache_(ftp_auth_cache),
|
| - weak_factory_(this) {
|
| - DCHECK(proxy_service_);
|
| - DCHECK(ftp_transaction_factory);
|
| - DCHECK(ftp_auth_cache);
|
| -}
|
| -
|
| -URLRequestFtpJob::~URLRequestFtpJob() {
|
| - if (pac_request_)
|
| - proxy_service_->CancelPacRequest(pac_request_);
|
| -}
|
| -
|
| -bool URLRequestFtpJob::IsSafeRedirect(const GURL& location) {
|
| - // Disallow all redirects.
|
| - return false;
|
| -}
|
| -
|
| -bool URLRequestFtpJob::GetMimeType(std::string* mime_type) const {
|
| - if (proxy_info_.is_direct()) {
|
| - if (ftp_transaction_->GetResponseInfo()->is_directory_listing) {
|
| - *mime_type = "text/vnd.chromium.ftp-dir";
|
| - return true;
|
| - }
|
| - } else {
|
| - // No special handling of MIME type is needed. As opposed to direct FTP
|
| - // transaction, we do not get a raw directory listing to parse.
|
| - return http_transaction_->GetResponseInfo()->
|
| - headers->GetMimeType(mime_type);
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -void URLRequestFtpJob::GetResponseInfo(HttpResponseInfo* info) {
|
| - if (http_response_info_)
|
| - *info = *http_response_info_;
|
| -}
|
| -
|
| -HostPortPair URLRequestFtpJob::GetSocketAddress() const {
|
| - if (proxy_info_.is_direct()) {
|
| - if (!ftp_transaction_)
|
| - return HostPortPair();
|
| - return ftp_transaction_->GetResponseInfo()->socket_address;
|
| - } else {
|
| - if (!http_transaction_)
|
| - return HostPortPair();
|
| - return http_transaction_->GetResponseInfo()->socket_address;
|
| - }
|
| -}
|
| -
|
| -void URLRequestFtpJob::SetPriority(RequestPriority priority) {
|
| - priority_ = priority;
|
| - if (http_transaction_)
|
| - http_transaction_->SetPriority(priority);
|
| -}
|
| -
|
| -void URLRequestFtpJob::Start() {
|
| - DCHECK(!pac_request_);
|
| - DCHECK(!ftp_transaction_);
|
| - DCHECK(!http_transaction_);
|
| -
|
| - int rv = OK;
|
| - if (request_->load_flags() & LOAD_BYPASS_PROXY) {
|
| - proxy_info_.UseDirect();
|
| - } else {
|
| - DCHECK_EQ(request_->context()->proxy_service(), proxy_service_);
|
| - rv = proxy_service_->ResolveProxy(
|
| - request_->url(),
|
| - request_->load_flags(),
|
| - &proxy_info_,
|
| - base::Bind(&URLRequestFtpJob::OnResolveProxyComplete,
|
| - base::Unretained(this)),
|
| - &pac_request_,
|
| - NULL,
|
| - request_->net_log());
|
| -
|
| - if (rv == ERR_IO_PENDING)
|
| - return;
|
| - }
|
| - OnResolveProxyComplete(rv);
|
| -}
|
| -
|
| -void URLRequestFtpJob::Kill() {
|
| - if (ftp_transaction_)
|
| - ftp_transaction_.reset();
|
| - if (http_transaction_)
|
| - http_transaction_.reset();
|
| - URLRequestJob::Kill();
|
| - weak_factory_.InvalidateWeakPtrs();
|
| -}
|
| -
|
| -void URLRequestFtpJob::OnResolveProxyComplete(int result) {
|
| - pac_request_ = NULL;
|
| -
|
| - if (result != OK) {
|
| - OnStartCompletedAsync(result);
|
| - return;
|
| - }
|
| -
|
| - // Remove unsupported proxies from the list.
|
| - proxy_info_.RemoveProxiesWithoutScheme(
|
| - ProxyServer::SCHEME_DIRECT |
|
| - ProxyServer::SCHEME_HTTP |
|
| - ProxyServer::SCHEME_HTTPS);
|
| -
|
| - // TODO(phajdan.jr): Implement proxy fallback, http://crbug.com/171495 .
|
| - if (proxy_info_.is_direct())
|
| - StartFtpTransaction();
|
| - else if (proxy_info_.is_http() || proxy_info_.is_https())
|
| - StartHttpTransaction();
|
| - else
|
| - OnStartCompletedAsync(ERR_NO_SUPPORTED_PROXIES);
|
| -}
|
| -
|
| -void URLRequestFtpJob::StartFtpTransaction() {
|
| - // Create a transaction.
|
| - DCHECK(!ftp_transaction_);
|
| -
|
| - ftp_request_info_.url = request_->url();
|
| - ftp_transaction_.reset(ftp_transaction_factory_->CreateTransaction());
|
| -
|
| - // No matter what, we want to report our status as IO pending since we will
|
| - // be notifying our consumer asynchronously via OnStartCompleted.
|
| - SetStatus(URLRequestStatus(URLRequestStatus::IO_PENDING, 0));
|
| - int rv;
|
| - if (ftp_transaction_) {
|
| - rv = ftp_transaction_->Start(
|
| - &ftp_request_info_,
|
| - base::Bind(&URLRequestFtpJob::OnStartCompleted,
|
| - base::Unretained(this)),
|
| - request_->net_log());
|
| - if (rv == ERR_IO_PENDING)
|
| - return;
|
| - } else {
|
| - rv = ERR_FAILED;
|
| - }
|
| - // The transaction started synchronously, but we need to notify the
|
| - // URLRequest delegate via the message loop.
|
| - OnStartCompletedAsync(rv);
|
| -}
|
| -
|
| -void URLRequestFtpJob::StartHttpTransaction() {
|
| - // Create a transaction.
|
| - DCHECK(!http_transaction_);
|
| -
|
| - // Do not cache FTP responses sent through HTTP proxy.
|
| - request_->SetLoadFlags(request_->load_flags() |
|
| - LOAD_DISABLE_CACHE |
|
| - LOAD_DO_NOT_SAVE_COOKIES |
|
| - LOAD_DO_NOT_SEND_COOKIES);
|
| -
|
| - http_request_info_.url = request_->url();
|
| - http_request_info_.method = request_->method();
|
| - http_request_info_.load_flags = request_->load_flags();
|
| -
|
| - int rv = request_->context()->http_transaction_factory()->CreateTransaction(
|
| - priority_, &http_transaction_);
|
| - if (rv == OK) {
|
| - rv = http_transaction_->Start(
|
| - &http_request_info_,
|
| - base::Bind(&URLRequestFtpJob::OnStartCompleted,
|
| - base::Unretained(this)),
|
| - request_->net_log());
|
| - if (rv == ERR_IO_PENDING)
|
| - return;
|
| - }
|
| - // The transaction started synchronously, but we need to notify the
|
| - // URLRequest delegate via the message loop.
|
| - OnStartCompletedAsync(rv);
|
| -}
|
| -
|
| -void URLRequestFtpJob::OnStartCompleted(int result) {
|
| - // Clear the IO_PENDING status
|
| - SetStatus(URLRequestStatus());
|
| -
|
| - // Note that ftp_transaction_ may be NULL due to a creation failure.
|
| - if (ftp_transaction_) {
|
| - // FTP obviously doesn't have HTTP Content-Length header. We have to pass
|
| - // the content size information manually.
|
| - set_expected_content_size(
|
| - ftp_transaction_->GetResponseInfo()->expected_content_size);
|
| - }
|
| -
|
| - if (result == OK) {
|
| - if (http_transaction_) {
|
| - http_response_info_ = http_transaction_->GetResponseInfo();
|
| - SetProxyServer(http_response_info_->proxy_server);
|
| -
|
| - if (http_response_info_->headers->response_code() == 401 ||
|
| - http_response_info_->headers->response_code() == 407) {
|
| - HandleAuthNeededResponse();
|
| - return;
|
| - }
|
| - }
|
| - NotifyHeadersComplete();
|
| - } else if (ftp_transaction_ &&
|
| - ftp_transaction_->GetResponseInfo()->needs_auth) {
|
| - HandleAuthNeededResponse();
|
| - return;
|
| - } else {
|
| - NotifyDone(URLRequestStatus(URLRequestStatus::FAILED, result));
|
| - }
|
| -}
|
| -
|
| -void URLRequestFtpJob::OnStartCompletedAsync(int result) {
|
| - base::MessageLoop::current()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&URLRequestFtpJob::OnStartCompleted,
|
| - weak_factory_.GetWeakPtr(), result));
|
| -}
|
| -
|
| -void URLRequestFtpJob::OnReadCompleted(int result) {
|
| - read_in_progress_ = false;
|
| - if (result == 0) {
|
| - NotifyDone(URLRequestStatus());
|
| - } else if (result < 0) {
|
| - NotifyDone(URLRequestStatus(URLRequestStatus::FAILED, result));
|
| - } else {
|
| - // Clear the IO_PENDING status
|
| - SetStatus(URLRequestStatus());
|
| - }
|
| - NotifyReadComplete(result);
|
| -}
|
| -
|
| -void URLRequestFtpJob::RestartTransactionWithAuth() {
|
| - DCHECK(auth_data_.get() && auth_data_->state == AUTH_STATE_HAVE_AUTH);
|
| -
|
| - // No matter what, we want to report our status as IO pending since we will
|
| - // be notifying our consumer asynchronously via OnStartCompleted.
|
| - SetStatus(URLRequestStatus(URLRequestStatus::IO_PENDING, 0));
|
| -
|
| - int rv;
|
| - if (proxy_info_.is_direct()) {
|
| - rv = ftp_transaction_->RestartWithAuth(
|
| - auth_data_->credentials,
|
| - base::Bind(&URLRequestFtpJob::OnStartCompleted,
|
| - base::Unretained(this)));
|
| - } else {
|
| - rv = http_transaction_->RestartWithAuth(
|
| - auth_data_->credentials,
|
| - base::Bind(&URLRequestFtpJob::OnStartCompleted,
|
| - base::Unretained(this)));
|
| - }
|
| - if (rv == ERR_IO_PENDING)
|
| - return;
|
| -
|
| - OnStartCompletedAsync(rv);
|
| -}
|
| -
|
| -LoadState URLRequestFtpJob::GetLoadState() const {
|
| - // TODO(pkasting): Remove ScopedTracker below once crbug.com/455952 is
|
| - // fixed.
|
| - tracked_objects::ScopedTracker tracking_profile(
|
| - FROM_HERE_WITH_EXPLICIT_FUNCTION(
|
| - "455952 URLRequestFtpJob::GetLoadState"));
|
| - if (proxy_info_.is_direct()) {
|
| - return ftp_transaction_ ?
|
| - ftp_transaction_->GetLoadState() : LOAD_STATE_IDLE;
|
| - } else {
|
| - return http_transaction_ ?
|
| - http_transaction_->GetLoadState() : LOAD_STATE_IDLE;
|
| - }
|
| -}
|
| -
|
| -bool URLRequestFtpJob::NeedsAuth() {
|
| - return auth_data_.get() && auth_data_->state == AUTH_STATE_NEED_AUTH;
|
| -}
|
| -
|
| -void URLRequestFtpJob::GetAuthChallengeInfo(
|
| - scoped_refptr<AuthChallengeInfo>* result) {
|
| - DCHECK(NeedsAuth());
|
| -
|
| - if (http_response_info_) {
|
| - *result = http_response_info_->auth_challenge;
|
| - return;
|
| - }
|
| -
|
| - scoped_refptr<AuthChallengeInfo> auth_info(new AuthChallengeInfo);
|
| - auth_info->is_proxy = false;
|
| - auth_info->challenger = HostPortPair::FromURL(request_->url());
|
| - // scheme and realm are kept empty.
|
| - DCHECK(auth_info->scheme.empty());
|
| - DCHECK(auth_info->realm.empty());
|
| - result->swap(auth_info);
|
| -}
|
| -
|
| -void URLRequestFtpJob::SetAuth(const AuthCredentials& credentials) {
|
| - DCHECK(ftp_transaction_ || http_transaction_);
|
| - DCHECK(NeedsAuth());
|
| -
|
| - auth_data_->state = AUTH_STATE_HAVE_AUTH;
|
| - auth_data_->credentials = credentials;
|
| -
|
| - if (ftp_transaction_) {
|
| - ftp_auth_cache_->Add(request_->url().GetOrigin(),
|
| - auth_data_->credentials);
|
| - }
|
| -
|
| - RestartTransactionWithAuth();
|
| -}
|
| -
|
| -void URLRequestFtpJob::CancelAuth() {
|
| - DCHECK(ftp_transaction_ || http_transaction_);
|
| - DCHECK(NeedsAuth());
|
| -
|
| - auth_data_->state = AUTH_STATE_CANCELED;
|
| -
|
| - // Once the auth is cancelled, we proceed with the request as though
|
| - // there were no auth. Schedule this for later so that we don't cause
|
| - // any recursing into the caller as a result of this call.
|
| - OnStartCompletedAsync(OK);
|
| -}
|
| -
|
| -UploadProgress URLRequestFtpJob::GetUploadProgress() const {
|
| - return UploadProgress();
|
| -}
|
| -
|
| -bool URLRequestFtpJob::ReadRawData(IOBuffer* buf,
|
| - int buf_size,
|
| - int *bytes_read) {
|
| - // TODO(vadimt): Remove ScopedTracker below once crbug.com/423948 is fixed.
|
| - tracked_objects::ScopedTracker tracking_profile(
|
| - FROM_HERE_WITH_EXPLICIT_FUNCTION("423948 URLRequestFtpJob::ReadRawData"));
|
| -
|
| - DCHECK_NE(buf_size, 0);
|
| - DCHECK(bytes_read);
|
| - DCHECK(!read_in_progress_);
|
| -
|
| - int rv;
|
| - if (proxy_info_.is_direct()) {
|
| - rv = ftp_transaction_->Read(buf, buf_size,
|
| - base::Bind(&URLRequestFtpJob::OnReadCompleted,
|
| - base::Unretained(this)));
|
| - } else {
|
| - rv = http_transaction_->Read(buf, buf_size,
|
| - base::Bind(&URLRequestFtpJob::OnReadCompleted,
|
| - base::Unretained(this)));
|
| - }
|
| -
|
| - if (rv >= 0) {
|
| - *bytes_read = rv;
|
| - return true;
|
| - }
|
| -
|
| - if (rv == ERR_IO_PENDING) {
|
| - read_in_progress_ = true;
|
| - SetStatus(URLRequestStatus(URLRequestStatus::IO_PENDING, 0));
|
| - } else {
|
| - NotifyDone(URLRequestStatus(URLRequestStatus::FAILED, rv));
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -void URLRequestFtpJob::HandleAuthNeededResponse() {
|
| - GURL origin = request_->url().GetOrigin();
|
| -
|
| - if (auth_data_.get()) {
|
| - if (auth_data_->state == AUTH_STATE_CANCELED) {
|
| - NotifyHeadersComplete();
|
| - return;
|
| - }
|
| -
|
| - if (ftp_transaction_ && auth_data_->state == AUTH_STATE_HAVE_AUTH)
|
| - ftp_auth_cache_->Remove(origin, auth_data_->credentials);
|
| - } else {
|
| - auth_data_ = new AuthData;
|
| - }
|
| - auth_data_->state = AUTH_STATE_NEED_AUTH;
|
| -
|
| - FtpAuthCache::Entry* cached_auth = NULL;
|
| - if (ftp_transaction_ && ftp_transaction_->GetResponseInfo()->needs_auth)
|
| - cached_auth = ftp_auth_cache_->Lookup(origin);
|
| - if (cached_auth) {
|
| - // Retry using cached auth data.
|
| - SetAuth(cached_auth->credentials);
|
| - } else {
|
| - // Prompt for a username/password.
|
| - NotifyHeadersComplete();
|
| - }
|
| -}
|
| -
|
| -} // namespace net
|
|
|