| Index: net/http/http_cache_transaction.cc
|
| diff --git a/net/http/http_cache_transaction.cc b/net/http/http_cache_transaction.cc
|
| index 32386f06a4b5be24d60e67b72abf64a1e8ee5147..4ee0af1162ff7c126717330e6f5720acfc99e3f1 100644
|
| --- a/net/http/http_cache_transaction.cc
|
| +++ b/net/http/http_cache_transaction.cc
|
| @@ -18,11 +18,14 @@
|
| #include "base/ref_counted.h"
|
| #include "base/string_util.h"
|
| #include "base/time.h"
|
| +#include "base/utf_string_conversions.h"
|
| +#include "net/base/auth.h"
|
| #include "net/base/cert_status_flags.h"
|
| #include "net/base/io_buffer.h"
|
| #include "net/base/load_flags.h"
|
| #include "net/base/net_errors.h"
|
| #include "net/base/net_log.h"
|
| +#include "net/base/net_util.h"
|
| #include "net/base/ssl_cert_request_info.h"
|
| #include "net/base/ssl_config_service.h"
|
| #include "net/disk_cache/disk_cache.h"
|
| @@ -105,6 +108,7 @@ HttpCache::Transaction::Transaction(HttpCache* cache)
|
| new_entry_(NULL),
|
| network_trans_(NULL),
|
| callback_(NULL),
|
| + tls_login_auth_data_(NULL),
|
| new_response_(NULL),
|
| mode_(NONE),
|
| target_state_(STATE_NONE),
|
| @@ -293,6 +297,37 @@ int HttpCache::Transaction::RestartWithCertificate(
|
| return rv;
|
| }
|
|
|
| +void HttpCache::Transaction::SetTLSLoginAuthData(AuthData* auth_data) {
|
| + if (network_trans_.get())
|
| + network_trans_->SetTLSLoginAuthData(auth_data);
|
| + tls_login_auth_data_ = auth_data;
|
| +}
|
| +
|
| +int HttpCache::Transaction::RestartWithTLSLogin(CompletionCallback *callback) {
|
| + DCHECK(callback);
|
| +
|
| + // Ensure that we only have one asynchronous call at a time.
|
| + DCHECK(!callback_);
|
| +
|
| + if (!cache_)
|
| + return ERR_UNEXPECTED;
|
| +
|
| + int rv;
|
| +
|
| + if (network_trans_.get()) {
|
| + rv = RestartNetworkRequestWithTLSLogin();
|
| + } else {
|
| + // Start the transaction.
|
| + next_state_ = STATE_SEND_REQUEST;
|
| + rv = DoLoop(OK);
|
| + }
|
| +
|
| + if (rv == ERR_IO_PENDING)
|
| + callback_ = callback;
|
| +
|
| + return rv;
|
| +}
|
| +
|
| int HttpCache::Transaction::RestartWithAuth(
|
| const string16& username,
|
| const string16& password,
|
| @@ -382,7 +417,9 @@ const HttpResponseInfo* HttpCache::Transaction::GetResponseInfo() const {
|
| if (auth_response_.headers)
|
| return &auth_response_;
|
| return (response_.headers || response_.ssl_info.cert ||
|
| - response_.cert_request_info) ? &response_ : NULL;
|
| + !response_.ssl_info.tls_username.empty() ||
|
| + response_.cert_request_info || response_.login_request_info) ?
|
| + &response_ : NULL;
|
| }
|
|
|
| LoadState HttpCache::Transaction::GetLoadState() const {
|
| @@ -642,6 +679,11 @@ int HttpCache::Transaction::DoSendRequest() {
|
| if (rv != OK)
|
| return rv;
|
|
|
| + if (tls_login_auth_data_ &&
|
| + tls_login_auth_data_->state == AUTH_STATE_HAVE_AUTH) {
|
| + network_trans_->SetTLSLoginAuthData(tls_login_auth_data_);
|
| + }
|
| +
|
| next_state_ = STATE_SEND_REQUEST_COMPLETE;
|
| rv = network_trans_->Start(request_, &io_callback_, net_log_);
|
| return rv;
|
| @@ -666,6 +708,11 @@ int HttpCache::Transaction::DoSendRequestComplete(int result) {
|
| const HttpResponseInfo* response = network_trans_->GetResponseInfo();
|
| DCHECK(response);
|
| response_.cert_request_info = response->cert_request_info;
|
| + } else if (result == ERR_TLS_CLIENT_LOGIN_NEEDED ||
|
| + result == ERR_TLS_CLIENT_LOGIN_FAILED) {
|
| + const HttpResponseInfo* response = network_trans_->GetResponseInfo();
|
| + DCHECK(response);
|
| + response_.login_request_info = response->login_request_info;
|
| }
|
| return result;
|
| }
|
| @@ -1571,6 +1618,18 @@ int HttpCache::Transaction::RestartNetworkRequestWithCertificate(
|
| return rv;
|
| }
|
|
|
| +int HttpCache::Transaction::RestartNetworkRequestWithTLSLogin() {
|
| + DCHECK(mode_ & WRITE || mode_ == NONE);
|
| + DCHECK(network_trans_.get());
|
| + DCHECK_EQ(STATE_NONE, next_state_);
|
| +
|
| + next_state_ = STATE_SEND_REQUEST_COMPLETE;
|
| + int rv = network_trans_->RestartWithTLSLogin(&io_callback_);
|
| + if (rv != ERR_IO_PENDING)
|
| + return DoLoop(rv);
|
| + return rv;
|
| +}
|
| +
|
| int HttpCache::Transaction::RestartNetworkRequestWithAuth(
|
| const string16& username,
|
| const string16& password) {
|
|
|