Index: third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp |
diff --git a/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp b/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp |
index c71ae427dc6b403dfa01852a61f7e1fb76093323..f40059a0706314776004806d369f3b2c0017ff7b 100644 |
--- a/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp |
+++ b/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp |
@@ -553,27 +553,39 @@ bool DocumentThreadableLoader::redirectReceived( |
document().frame()->loader().documentLoader(), redirectResponse, |
resource); |
- bool allowRedirect = false; |
String accessControlErrorDescription; |
- if (!CrossOriginAccessControl::isLegalRedirectLocation( |
- request.url(), accessControlErrorDescription)) { |
- accessControlErrorDescription = |
- "Redirect from '" + redirectResponse.url().getString() + |
- "' has been blocked by CORS policy: " + accessControlErrorDescription; |
- } else if (!m_sameOriginRequest && |
- !passesAccessControlCheck( |
- redirectResponse, effectiveAllowCredentials(), |
- getSecurityOrigin(), accessControlErrorDescription, |
- m_requestContext)) { |
+ CrossOriginAccessControl::RedirectStatus redirectStatus = |
+ CrossOriginAccessControl::checkRedirectLocation(request.url()); |
+ bool allowRedirect = |
+ redirectStatus == CrossOriginAccessControl::kRedirectSuccess; |
+ if (!allowRedirect) { |
+ StringBuilder builder; |
+ builder.append("Redirect from '"); |
+ builder.append(redirectResponse.url().getString()); |
+ builder.append("' has been blocked by CORS policy: "); |
+ CrossOriginAccessControl::redirectErrorString(builder, redirectStatus, |
+ request.url()); |
+ accessControlErrorDescription = builder.toString(); |
+ } else if (!m_sameOriginRequest) { |
// The redirect response must pass the access control check if the original |
// request was not same-origin. |
- accessControlErrorDescription = |
- "Redirect from '" + redirectResponse.url().getString() + "' to '" + |
- request.url().getString() + "' has been blocked by CORS policy: " + |
- accessControlErrorDescription; |
- } else { |
- allowRedirect = true; |
+ CrossOriginAccessControl::AccessStatus corsStatus = |
+ CrossOriginAccessControl::checkAccess( |
+ redirectResponse, effectiveAllowCredentials(), getSecurityOrigin()); |
+ allowRedirect = corsStatus == CrossOriginAccessControl::kAccessAllowed; |
+ if (!allowRedirect) { |
+ StringBuilder builder; |
+ builder.append("Redirect from '"); |
+ builder.append(redirectResponse.url().getString()); |
+ builder.append("' to '"); |
+ builder.append(request.url().getString()); |
+ builder.append("' has been blocked by CORS policy: "); |
+ CrossOriginAccessControl::accessControlErrorString( |
+ builder, corsStatus, redirectResponse, getSecurityOrigin(), |
+ m_requestContext); |
+ accessControlErrorDescription = builder.toString(); |
+ } |
} |
if (!allowRedirect) { |
@@ -693,27 +705,41 @@ void DocumentThreadableLoader::handlePreflightResponse( |
const ResourceResponse& response) { |
String accessControlErrorDescription; |
- if (!passesAccessControlCheck( |
- response, effectiveAllowCredentials(), getSecurityOrigin(), |
- accessControlErrorDescription, m_requestContext)) { |
- handlePreflightFailure( |
- response.url().getString(), |
- "Response to preflight request doesn't pass access control check: " + |
- accessControlErrorDescription); |
+ CrossOriginAccessControl::AccessStatus corsStatus = |
+ CrossOriginAccessControl::checkAccess( |
+ response, effectiveAllowCredentials(), getSecurityOrigin()); |
+ if (corsStatus != CrossOriginAccessControl::kAccessAllowed) { |
+ StringBuilder builder; |
+ builder.append( |
+ "Response to preflight request doesn't pass access " |
+ "control check: "); |
+ CrossOriginAccessControl::accessControlErrorString( |
+ builder, corsStatus, response, getSecurityOrigin(), m_requestContext); |
+ handlePreflightFailure(response.url().getString(), builder.toString()); |
return; |
} |
- if (!passesPreflightStatusCheck(response, accessControlErrorDescription)) { |
- handlePreflightFailure(response.url().getString(), |
- accessControlErrorDescription); |
+ CrossOriginAccessControl::PreflightStatus preflightStatus = |
+ CrossOriginAccessControl::checkPreflight(response); |
+ if (preflightStatus != CrossOriginAccessControl::kPreflightSuccess) { |
+ StringBuilder builder; |
+ CrossOriginAccessControl::preflightErrorString(builder, preflightStatus, |
+ response); |
+ handlePreflightFailure(response.url().getString(), builder.toString()); |
return; |
} |
- if (m_actualRequest.isExternalRequest() && |
- !passesExternalPreflightCheck(response, accessControlErrorDescription)) { |
- handlePreflightFailure(response.url().getString(), |
- accessControlErrorDescription); |
- return; |
+ if (m_actualRequest.isExternalRequest()) { |
+ CrossOriginAccessControl::PreflightStatus externalPreflightStatus = |
+ CrossOriginAccessControl::checkExternalPreflight(response); |
+ if (externalPreflightStatus != |
+ CrossOriginAccessControl::kPreflightSuccess) { |
+ StringBuilder builder; |
+ CrossOriginAccessControl::preflightErrorString( |
+ builder, externalPreflightStatus, response); |
+ handlePreflightFailure(response.url().getString(), builder.toString()); |
+ return; |
+ } |
} |
std::unique_ptr<CrossOriginPreflightResultCacheItem> preflightResult = |
@@ -798,15 +824,17 @@ void DocumentThreadableLoader::handleResponse( |
if (!m_sameOriginRequest && |
m_options.crossOriginRequestPolicy == UseAccessControl) { |
- String accessControlErrorDescription; |
- if (!passesAccessControlCheck( |
- response, effectiveAllowCredentials(), getSecurityOrigin(), |
- accessControlErrorDescription, m_requestContext)) { |
+ CrossOriginAccessControl::AccessStatus corsStatus = |
+ CrossOriginAccessControl::checkAccess( |
+ response, effectiveAllowCredentials(), getSecurityOrigin()); |
+ if (corsStatus != CrossOriginAccessControl::kAccessAllowed) { |
reportResponseReceived(identifier, response); |
- |
+ StringBuilder builder; |
+ CrossOriginAccessControl::accessControlErrorString( |
+ builder, corsStatus, response, getSecurityOrigin(), m_requestContext); |
dispatchDidFailAccessControlCheck( |
ResourceError(errorDomainBlinkInternal, 0, response.url().getString(), |
- accessControlErrorDescription)); |
+ builder.toString())); |
return; |
} |
} |