Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1147)

Unified Diff: services/authenticating_url_loader/authenticating_url_loader_interceptor.cc

Issue 1155283003: Change AuthenticatingURLLoader to be a URLLoaderInterceptor (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Address review Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: services/authenticating_url_loader/authenticating_url_loader_interceptor.cc
diff --git a/services/authenticating_url_loader/authenticating_url_loader_impl.cc b/services/authenticating_url_loader/authenticating_url_loader_interceptor.cc
similarity index 41%
rename from services/authenticating_url_loader/authenticating_url_loader_impl.cc
rename to services/authenticating_url_loader/authenticating_url_loader_interceptor.cc
index 6de8ba605f73ac0c9bab252a33b4f41cc70e4537..7e0f574a0e25e0fd63a918a018103caa2f0d7263 100644
--- a/services/authenticating_url_loader/authenticating_url_loader_impl.cc
+++ b/services/authenticating_url_loader/authenticating_url_loader_interceptor.cc
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "services/authenticating_url_loader/authenticating_url_loader_impl.h"
+#include "services/authenticating_url_loader/authenticating_url_loader_interceptor.h"
#include "base/bind.h"
#include "base/logging.h"
@@ -10,34 +10,36 @@
namespace mojo {
-AuthenticatingURLLoaderImpl::AuthenticatingURLLoaderImpl(
- InterfaceRequest<AuthenticatingURLLoader> request,
- AuthenticatingURLLoaderFactoryImpl* factory)
+AuthenticatingURLLoaderInterceptor::AuthenticatingURLLoaderInterceptor(
+ mojo::InterfaceRequest<URLLoaderInterceptor> request,
+ AuthenticatingURLLoaderInterceptorFactory* factory)
: binding_(this, request.Pass()),
factory_(factory),
request_authorization_state_(REQUEST_INITIAL) {
binding_.set_error_handler(this);
}
-AuthenticatingURLLoaderImpl::~AuthenticatingURLLoaderImpl() {
+AuthenticatingURLLoaderInterceptor::~AuthenticatingURLLoaderInterceptor() {
}
-void AuthenticatingURLLoaderImpl::Start(
- URLRequestPtr request,
- const Callback<void(URLResponsePtr)>& callback) {
+void AuthenticatingURLLoaderInterceptor::InterceptRequest(
+ mojo::URLRequestPtr request,
+ const InterceptRequestCallback& callback) {
// TODO(blundell): If we need to handle requests with bodies, we'll need to
// do something here.
if (request->body) {
- LOG(ERROR)
- << "Cannot pass a request to AuthenticatingURLLoader that has a body";
+ LOG(ERROR) << "Cannot pass a request to AuthenticatingURLLoaderInterceptor"
+ "that has a body";
callback.Run(nullptr);
return;
}
+ pending_interception_callback_ = callback;
url_ = GURL(request->url);
auto_follow_redirects_ = request->auto_follow_redirects;
+ request->auto_follow_redirects = false;
bypass_cache_ = request->bypass_cache;
headers_ = request->headers.Clone();
- pending_request_callback_ = callback;
+
std::string token = factory_->GetCachedToken(url_);
if (token != "") {
auto auth_header = HttpHeader::New();
@@ -45,20 +47,21 @@ void AuthenticatingURLLoaderImpl::Start(
auth_header->value = "Bearer " + token;
request->headers.push_back(auth_header.Pass());
}
- StartNetworkRequest(request.Pass());
+
+ StartRequest(request.Pass());
}
-void AuthenticatingURLLoaderImpl::FollowRedirect(
- const Callback<void(URLResponsePtr)>& callback) {
+void AuthenticatingURLLoaderInterceptor::InterceptFollowRedirect(
+ const InterceptResponseCallback& callback) {
mojo::String error;
- if (!url_.is_valid() || !url_loader_) {
+ if (!url_.is_valid()) {
error = "No redirect to follow";
}
if (auto_follow_redirects_) {
error =
- "FollowRedirect() should not be "
+ "InterceptFollowRedirect() should not be "
"called when auto_follow_redirects has been set";
}
@@ -67,52 +70,53 @@ void AuthenticatingURLLoaderImpl::FollowRedirect(
}
if (!error.is_null()) {
- LOG(ERROR) << "AuthenticatingURLLoader: " << error;
+ LOG(ERROR) << "AuthenticatingURLLoaderInterceptor: " << error;
callback.Run(nullptr);
return;
}
- pending_request_callback_ = callback;
- FollowRedirectInternal();
-}
+ // If there is no cached token, have the URLLoader follow the redirect
+ // itself.
+ std::string token = factory_->GetCachedToken(url_);
+ if (token == "") {
+ callback.Run(nullptr);
+ return;
+ }
-void AuthenticatingURLLoaderImpl::StartNetworkRequest(URLRequestPtr request) {
- factory_->network_service()->CreateURLLoader(mojo::GetProxy(&url_loader_));
- url_loader_->Start(request.Pass(),
- base::Bind(&AuthenticatingURLLoaderImpl::OnLoadComplete,
- base::Unretained(this)));
+ pending_interception_callback_ = callback;
+ StartRequest(BuildRequest(token));
}
-void AuthenticatingURLLoaderImpl::OnConnectionError() {
- factory_->OnURLLoaderError(this);
- // The factory deleted this object.
-}
+void AuthenticatingURLLoaderInterceptor::InterceptResponse(
+ mojo::URLResponsePtr response,
+ const InterceptResponseCallback& callback) {
+ pending_interception_callback_ = callback;
+ pending_response_ = response.Pass();
-void AuthenticatingURLLoaderImpl::OnLoadComplete(URLResponsePtr response) {
- if (response->redirect_url) {
- url_ = GURL(response->redirect_url);
- request_authorization_state_ = REQUEST_INITIAL;
-
- if (auto_follow_redirects_) {
- FollowRedirectInternal();
- } else {
- // NOTE: We do not reset |url_loader_| here as it will be needed if the
- // client calls |FollowRedirect()|.
- pending_request_callback_.Run(response.Pass());
+ if (pending_response_->status_code != 401 ||
+ request_authorization_state_ == REQUEST_USED_FRESH_AUTH_SERVICE_TOKEN) {
+ if (pending_response_->redirect_url) {
+ url_ = GURL(pending_response_->redirect_url);
+ request_authorization_state_ = REQUEST_INITIAL;
+ if (auto_follow_redirects_) {
+ // If there is no cached token, have the URLLoader follow the
+ // redirect itself.
+ std::string token = factory_->GetCachedToken(url_);
+ if (token == "")
+ pending_interception_callback_.Run(nullptr);
+ else
+ StartRequest(BuildRequest(token));
+ return;
+ }
}
- return;
- }
- url_loader_.reset();
-
- if (response->status_code != 401 ||
- request_authorization_state_ == REQUEST_USED_FRESH_AUTH_SERVICE_TOKEN) {
- pending_request_callback_.Run(response.Pass());
+ URLLoaderInterceptorResponsePtr interceptor_response =
+ URLLoaderInterceptorResponse::New();
+ interceptor_response->response = pending_response_.Pass();
+ pending_interception_callback_.Run(interceptor_response.Pass());
return;
}
- pending_response_ = response.Pass();
-
DCHECK(request_authorization_state_ == REQUEST_INITIAL ||
request_authorization_state_ ==
REQUEST_USED_CURRENT_AUTH_SERVICE_TOKEN);
@@ -122,34 +126,31 @@ void AuthenticatingURLLoaderImpl::OnLoadComplete(URLResponsePtr response) {
request_authorization_state_ = REQUEST_USED_FRESH_AUTH_SERVICE_TOKEN;
}
factory_->RetrieveToken(
- url_, base::Bind(&AuthenticatingURLLoaderImpl::OnOAuth2TokenReceived,
- base::Unretained(this)));
- return;
+ url_,
+ base::Bind(&AuthenticatingURLLoaderInterceptor::OnOAuth2TokenReceived,
+ base::Unretained(this)));
}
-void AuthenticatingURLLoaderImpl::FollowRedirectInternal() {
- DCHECK(url_.is_valid());
- DCHECK(url_loader_);
- DCHECK(request_authorization_state_ == REQUEST_INITIAL);
-
- url_loader_->FollowRedirect(base::Bind(
- &AuthenticatingURLLoaderImpl::OnLoadComplete, base::Unretained(this)));
+void AuthenticatingURLLoaderInterceptor::OnConnectionError() {
+ factory_->OnInterceptorError(this);
+ // The factory deleted this object.
}
-void AuthenticatingURLLoaderImpl::OnOAuth2TokenReceived(std::string token) {
- if (token.empty()) {
- LOG(ERROR) << "Error while getting token";
- pending_request_callback_.Run(pending_response_.Pass());
- return;
- }
-
- auto auth_header = HttpHeader::New();
- auth_header->name = "Authorization";
- auth_header->value = "Bearer " + token;
+URLRequestPtr AuthenticatingURLLoaderInterceptor::BuildRequest(
+ std::string token) {
Array<HttpHeaderPtr> headers;
if (headers_)
headers = headers_.Clone();
- headers.push_back(auth_header.Pass());
+
+ if (token == "")
+ token = factory_->GetCachedToken(url_);
+
+ if (token != "") {
+ auto auth_header = HttpHeader::New();
+ auth_header->name = "Authorization";
+ auth_header->value = "Bearer " + token;
+ headers.push_back(auth_header.Pass());
+ }
URLRequestPtr request(mojo::URLRequest::New());
request->url = url_.spec();
@@ -157,7 +158,30 @@ void AuthenticatingURLLoaderImpl::OnOAuth2TokenReceived(std::string token) {
request->bypass_cache = bypass_cache_;
request->headers = headers.Pass();
- StartNetworkRequest(request.Pass());
+ return request.Pass();
+}
+
+void AuthenticatingURLLoaderInterceptor::StartRequest(
+ mojo::URLRequestPtr request) {
+ URLLoaderInterceptorResponsePtr interceptor_response =
+ URLLoaderInterceptorResponse::New();
+ interceptor_response->request = request.Pass();
+ pending_interception_callback_.Run(interceptor_response.Pass());
+}
+
+void AuthenticatingURLLoaderInterceptor::OnOAuth2TokenReceived(
+ std::string token) {
+ URLLoaderInterceptorResponsePtr interceptor_response =
+ URLLoaderInterceptorResponse::New();
+
+ if (token.empty()) {
+ LOG(ERROR) << "Error while getting token";
+ interceptor_response->response = pending_response_.Pass();
+ } else {
+ interceptor_response->request = BuildRequest(token);
+ }
+
+ pending_interception_callback_.Run(interceptor_response.Pass());
}
} // namespace mojo

Powered by Google App Engine
This is Rietveld 408576698