| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2011, 2012 Google Inc. All rights reserved. | 2 * Copyright (C) 2011, 2012 Google Inc. All rights reserved. |
| 3 * Copyright (C) 2013, Intel Corporation | 3 * Copyright (C) 2013, Intel Corporation |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions are | 6 * modification, are permitted provided that the following conditions are |
| 7 * met: | 7 * met: |
| 8 * | 8 * |
| 9 * * Redistributions of source code must retain the above copyright | 9 * * Redistributions of source code must retain the above copyright |
| 10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 154 BlockingBehavior blockingBehavior, | 154 BlockingBehavior blockingBehavior, |
| 155 const ThreadableLoaderOptions& options, | 155 const ThreadableLoaderOptions& options, |
| 156 const ResourceLoaderOptions& resourceLoaderOptions) | 156 const ResourceLoaderOptions& resourceLoaderOptions) |
| 157 : m_client(client), | 157 : m_client(client), |
| 158 m_document(&document), | 158 m_document(&document), |
| 159 m_options(options), | 159 m_options(options), |
| 160 m_resourceLoaderOptions(resourceLoaderOptions), | 160 m_resourceLoaderOptions(resourceLoaderOptions), |
| 161 m_forceDoNotAllowStoredCredentials(false), | 161 m_forceDoNotAllowStoredCredentials(false), |
| 162 m_securityOrigin(m_resourceLoaderOptions.securityOrigin), | 162 m_securityOrigin(m_resourceLoaderOptions.securityOrigin), |
| 163 m_sameOriginRequest(false), | 163 m_sameOriginRequest(false), |
| 164 m_crossOriginNonSimpleRequest(false), | |
| 165 m_isUsingDataConsumerHandle(false), | 164 m_isUsingDataConsumerHandle(false), |
| 166 m_async(blockingBehavior == LoadAsynchronously), | 165 m_async(blockingBehavior == LoadAsynchronously), |
| 167 m_requestContext(WebURLRequest::RequestContextUnspecified), | 166 m_requestContext(WebURLRequest::RequestContextUnspecified), |
| 168 m_timeoutTimer(this, &DocumentThreadableLoader::didTimeout), | 167 m_timeoutTimer(this, &DocumentThreadableLoader::didTimeout), |
| 169 m_requestStartedSeconds(0.0), | 168 m_requestStartedSeconds(0.0), |
| 170 m_corsRedirectLimit(m_options.crossOriginRequestPolicy == UseAccessControl | 169 m_corsRedirectLimit(m_options.crossOriginRequestPolicy == UseAccessControl |
| 171 ? kMaxCORSRedirects | 170 ? kMaxCORSRedirects |
| 172 : 0), | 171 : 0), |
| 173 m_redirectMode(WebURLRequest::FetchRedirectModeFollow), | 172 m_redirectMode(WebURLRequest::FetchRedirectModeFollow), |
| 174 m_overrideReferrer(false) { | 173 m_overrideReferrer(false) { |
| (...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 379 // example, referrer. We need to accept them. For security, we must reject | 378 // example, referrer. We need to accept them. For security, we must reject |
| 380 // forbidden headers/methods at the point we accept user's input. Not here. | 379 // forbidden headers/methods at the point we accept user's input. Not here. |
| 381 if (!request.isExternalRequest() && | 380 if (!request.isExternalRequest() && |
| 382 ((m_options.preflightPolicy == ConsiderPreflight && | 381 ((m_options.preflightPolicy == ConsiderPreflight && |
| 383 FetchUtils::isSimpleOrForbiddenRequest(request.httpMethod(), | 382 FetchUtils::isSimpleOrForbiddenRequest(request.httpMethod(), |
| 384 request.httpHeaderFields())) || | 383 request.httpHeaderFields())) || |
| 385 m_options.preflightPolicy == PreventPreflight)) { | 384 m_options.preflightPolicy == PreventPreflight)) { |
| 386 prepareCrossOriginRequest(crossOriginRequest); | 385 prepareCrossOriginRequest(crossOriginRequest); |
| 387 loadRequest(crossOriginRequest, crossOriginOptions); | 386 loadRequest(crossOriginRequest, crossOriginOptions); |
| 388 } else { | 387 } else { |
| 389 m_crossOriginNonSimpleRequest = true; | |
| 390 | |
| 391 bool shouldForcePreflight = | 388 bool shouldForcePreflight = |
| 392 request.isExternalRequest() || | 389 request.isExternalRequest() || |
| 393 InspectorInstrumentation::shouldForceCORSPreflight(m_document); | 390 InspectorInstrumentation::shouldForceCORSPreflight(m_document); |
| 394 bool canSkipPreflight = | 391 bool canSkipPreflight = |
| 395 CrossOriginPreflightResultCache::shared().canSkipPreflight( | 392 CrossOriginPreflightResultCache::shared().canSkipPreflight( |
| 396 getSecurityOrigin()->toString(), crossOriginRequest.url(), | 393 getSecurityOrigin()->toString(), crossOriginRequest.url(), |
| 397 effectiveAllowCredentials(), crossOriginRequest.httpMethod(), | 394 effectiveAllowCredentials(), crossOriginRequest.httpMethod(), |
| 398 crossOriginRequest.httpHeaderFields()); | 395 crossOriginRequest.httpHeaderFields()); |
| 399 if (canSkipPreflight && !shouldForcePreflight) { | 396 if (canSkipPreflight && !shouldForcePreflight) { |
| 400 if (getSecurityOrigin()) | 397 if (getSecurityOrigin()) |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 565 --m_corsRedirectLimit; | 562 --m_corsRedirectLimit; |
| 566 | 563 |
| 567 InspectorInstrumentation::didReceiveCORSRedirectResponse( | 564 InspectorInstrumentation::didReceiveCORSRedirectResponse( |
| 568 document().frame(), resource->identifier(), | 565 document().frame(), resource->identifier(), |
| 569 document().frame()->loader().documentLoader(), redirectResponse, | 566 document().frame()->loader().documentLoader(), redirectResponse, |
| 570 resource); | 567 resource); |
| 571 | 568 |
| 572 bool allowRedirect = false; | 569 bool allowRedirect = false; |
| 573 String accessControlErrorDescription; | 570 String accessControlErrorDescription; |
| 574 | 571 |
| 575 if (m_crossOriginNonSimpleRequest) { | 572 if (!CrossOriginAccessControl::isLegalRedirectLocation( |
| 576 // Non-simple cross origin requests (both preflight and actual one) are not | 573 request.url(), accessControlErrorDescription)) { |
| 577 // allowed to follow redirect. | |
| 578 accessControlErrorDescription = | |
| 579 "Redirect from '" + redirectResponse.url().getString() + "' to '" + | |
| 580 request.url().getString() + | |
| 581 "' has been blocked by CORS policy: Request requires preflight, which " | |
| 582 "is disallowed to follow cross-origin redirect."; | |
| 583 } else if (!CrossOriginAccessControl::isLegalRedirectLocation( | |
| 584 request.url(), accessControlErrorDescription)) { | |
| 585 accessControlErrorDescription = | 574 accessControlErrorDescription = |
| 586 "Redirect from '" + redirectResponse.url().getString() + | 575 "Redirect from '" + redirectResponse.url().getString() + |
| 587 "' has been blocked by CORS policy: " + accessControlErrorDescription; | 576 "' has been blocked by CORS policy: " + accessControlErrorDescription; |
| 588 } else if (!m_sameOriginRequest && | 577 } else if (!m_sameOriginRequest && |
| 589 !passesAccessControlCheck( | 578 !passesAccessControlCheck( |
| 590 redirectResponse, effectiveAllowCredentials(), | 579 redirectResponse, effectiveAllowCredentials(), |
| 591 getSecurityOrigin(), accessControlErrorDescription, | 580 getSecurityOrigin(), accessControlErrorDescription, |
| 592 m_requestContext)) { | 581 m_requestContext)) { |
| 593 // The redirect response must pass the access control check if the original | 582 // The redirect response must pass the access control check if the original |
| 594 // request was not same-origin. | 583 // request was not same-origin. |
| (...skipping 540 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1135 } | 1124 } |
| 1136 | 1125 |
| 1137 DEFINE_TRACE(DocumentThreadableLoader) { | 1126 DEFINE_TRACE(DocumentThreadableLoader) { |
| 1138 visitor->trace(m_resource); | 1127 visitor->trace(m_resource); |
| 1139 visitor->trace(m_document); | 1128 visitor->trace(m_document); |
| 1140 ThreadableLoader::trace(visitor); | 1129 ThreadableLoader::trace(visitor); |
| 1141 RawResourceClient::trace(visitor); | 1130 RawResourceClient::trace(visitor); |
| 1142 } | 1131 } |
| 1143 | 1132 |
| 1144 } // namespace blink | 1133 } // namespace blink |
| OLD | NEW |