| 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 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 566 --m_corsRedirectLimit; | 563 --m_corsRedirectLimit; |
| 567 | 564 |
| 568 InspectorInstrumentation::didReceiveCORSRedirectResponse( | 565 InspectorInstrumentation::didReceiveCORSRedirectResponse( |
| 569 document().frame(), resource->identifier(), | 566 document().frame(), resource->identifier(), |
| 570 document().frame()->loader().documentLoader(), redirectResponse, | 567 document().frame()->loader().documentLoader(), redirectResponse, |
| 571 resource); | 568 resource); |
| 572 | 569 |
| 573 bool allowRedirect = false; | 570 bool allowRedirect = false; |
| 574 String accessControlErrorDescription; | 571 String accessControlErrorDescription; |
| 575 | 572 |
| 576 if (m_crossOriginNonSimpleRequest) { | 573 if (!CrossOriginAccessControl::isLegalRedirectLocation( |
| 577 // Non-simple cross origin requests (both preflight and actual one) are not | 574 request.url(), accessControlErrorDescription)) { |
| 578 // allowed to follow redirect. | |
| 579 accessControlErrorDescription = | |
| 580 "Redirect from '" + redirectResponse.url().getString() + "' to '" + | |
| 581 request.url().getString() + | |
| 582 "' has been blocked by CORS policy: Request requires preflight, which " | |
| 583 "is disallowed to follow cross-origin redirect."; | |
| 584 } else if (!CrossOriginAccessControl::isLegalRedirectLocation( | |
| 585 request.url(), accessControlErrorDescription)) { | |
| 586 accessControlErrorDescription = | 575 accessControlErrorDescription = |
| 587 "Redirect from '" + redirectResponse.url().getString() + | 576 "Redirect from '" + redirectResponse.url().getString() + |
| 588 "' has been blocked by CORS policy: " + accessControlErrorDescription; | 577 "' has been blocked by CORS policy: " + accessControlErrorDescription; |
| 589 } else if (!m_sameOriginRequest && | 578 } else if (!m_sameOriginRequest && |
| 590 !passesAccessControlCheck( | 579 !passesAccessControlCheck( |
| 591 redirectResponse, effectiveAllowCredentials(), | 580 redirectResponse, effectiveAllowCredentials(), |
| 592 getSecurityOrigin(), accessControlErrorDescription, | 581 getSecurityOrigin(), accessControlErrorDescription, |
| 593 m_requestContext)) { | 582 m_requestContext)) { |
| 594 // The redirect response must pass the access control check if the original | 583 // The redirect response must pass the access control check if the original |
| 595 // request was not same-origin. | 584 // request was not same-origin. |
| (...skipping 540 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1136 } | 1125 } |
| 1137 | 1126 |
| 1138 DEFINE_TRACE(DocumentThreadableLoader) { | 1127 DEFINE_TRACE(DocumentThreadableLoader) { |
| 1139 visitor->trace(m_resource); | 1128 visitor->trace(m_resource); |
| 1140 visitor->trace(m_document); | 1129 visitor->trace(m_document); |
| 1141 ThreadableLoader::trace(visitor); | 1130 ThreadableLoader::trace(visitor); |
| 1142 RawResourceClient::trace(visitor); | 1131 RawResourceClient::trace(visitor); |
| 1143 } | 1132 } |
| 1144 | 1133 |
| 1145 } // namespace blink | 1134 } // namespace blink |
| OLD | NEW |