Chromium Code Reviews| 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 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 42 #include "core/frame/LocalFrame.h" | 42 #include "core/frame/LocalFrame.h" |
| 43 #include "core/frame/csp/ContentSecurityPolicy.h" | 43 #include "core/frame/csp/ContentSecurityPolicy.h" |
| 44 #include "core/inspector/InspectorInstrumentation.h" | 44 #include "core/inspector/InspectorInstrumentation.h" |
| 45 #include "core/inspector/InspectorTraceEvents.h" | 45 #include "core/inspector/InspectorTraceEvents.h" |
| 46 #include "core/loader/CrossOriginPreflightResultCache.h" | 46 #include "core/loader/CrossOriginPreflightResultCache.h" |
| 47 #include "core/loader/DocumentThreadableLoaderClient.h" | 47 #include "core/loader/DocumentThreadableLoaderClient.h" |
| 48 #include "core/loader/FrameLoader.h" | 48 #include "core/loader/FrameLoader.h" |
| 49 #include "core/loader/FrameLoaderClient.h" | 49 #include "core/loader/FrameLoaderClient.h" |
| 50 #include "core/loader/ThreadableLoaderClient.h" | 50 #include "core/loader/ThreadableLoaderClient.h" |
| 51 #include "platform/SharedBuffer.h" | 51 #include "platform/SharedBuffer.h" |
| 52 #include "platform/Task.h" | |
| 52 #include "platform/network/ResourceRequest.h" | 53 #include "platform/network/ResourceRequest.h" |
| 53 #include "platform/weborigin/SchemeRegistry.h" | 54 #include "platform/weborigin/SchemeRegistry.h" |
| 54 #include "platform/weborigin/SecurityOrigin.h" | 55 #include "platform/weborigin/SecurityOrigin.h" |
| 56 #include "public/platform/Platform.h" | |
| 55 #include "public/platform/WebURLRequest.h" | 57 #include "public/platform/WebURLRequest.h" |
| 56 #include "wtf/Assertions.h" | 58 #include "wtf/Assertions.h" |
| 57 | 59 |
| 58 namespace blink { | 60 namespace blink { |
| 59 | 61 |
| 62 namespace { | |
| 63 | |
| 64 class EmptyDataHandle final : public WebDataConsumerHandle { | |
| 65 private: | |
| 66 class EmptyDataReader final : public WebDataConsumerHandle::Reader { | |
| 67 public: | |
| 68 explicit EmptyDataReader(WebDataConsumerHandle::Client* client) : m_fact ory(this) | |
| 69 { | |
| 70 Platform::current()->currentThread()->postTask(FROM_HERE, new Task(b ind(&EmptyDataReader::notify, m_factory.createWeakPtr(), client))); | |
| 71 } | |
| 72 private: | |
| 73 Result read(void*, size_t, WebDataConsumerHandle::Flags, size_t *readSiz e) override | |
| 74 { | |
| 75 *readSize = 0; | |
| 76 return Done; | |
| 77 } | |
| 78 Result beginRead(const void** buffer, WebDataConsumerHandle::Flags, size _t *available) override | |
| 79 { | |
| 80 *available = 0; | |
| 81 *buffer = nullptr; | |
| 82 return Done; | |
| 83 } | |
| 84 Result endRead(size_t) override | |
| 85 { | |
| 86 return WebDataConsumerHandle::UnexpectedError; | |
| 87 } | |
| 88 void notify(WebDataConsumerHandle::Client* client) | |
| 89 { | |
| 90 client->didGetReadable(); | |
| 91 } | |
| 92 WeakPtrFactory<EmptyDataReader> m_factory; | |
| 93 }; | |
| 94 | |
| 95 Reader* obtainReaderInternal(Client* client) override | |
| 96 { | |
| 97 return new EmptyDataReader(client); | |
| 98 } | |
| 99 const char* debugName() const override { return "EmptyDataHandle"; } | |
| 100 }; | |
| 101 | |
| 102 } // namespace | |
| 103 | |
| 60 // Max number of CORS redirects handled in DocumentThreadableLoader. | 104 // Max number of CORS redirects handled in DocumentThreadableLoader. |
| 61 // Same number as net/url_request/url_request.cc, and | 105 // Same number as net/url_request/url_request.cc, and |
| 62 // same number as https://fetch.spec.whatwg.org/#concept-http-fetch, Step 4. | 106 // same number as https://fetch.spec.whatwg.org/#concept-http-fetch, Step 4. |
| 63 // FIXME: currently the number of redirects is counted and limited here and in | 107 // FIXME: currently the number of redirects is counted and limited here and in |
| 64 // net/url_request/url_request.cc separately. | 108 // net/url_request/url_request.cc separately. |
| 65 static const int kMaxCORSRedirects = 20; | 109 static const int kMaxCORSRedirects = 20; |
| 66 | 110 |
| 67 void DocumentThreadableLoader::loadResourceSynchronously(Document& document, con st ResourceRequest& request, ThreadableLoaderClient& client, const ThreadableLoa derOptions& options, const ResourceLoaderOptions& resourceLoaderOptions) | 111 void DocumentThreadableLoader::loadResourceSynchronously(Document& document, con st ResourceRequest& request, ThreadableLoaderClient& client, const ThreadableLoa derOptions& options, const ResourceLoaderOptions& resourceLoaderOptions) |
| 68 { | 112 { |
| 69 // The loader will be deleted as soon as this function exits. | 113 // The loader will be deleted as soon as this function exits. |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 87 , m_forceDoNotAllowStoredCredentials(false) | 131 , m_forceDoNotAllowStoredCredentials(false) |
| 88 , m_securityOrigin(m_resourceLoaderOptions.securityOrigin) | 132 , m_securityOrigin(m_resourceLoaderOptions.securityOrigin) |
| 89 , m_sameOriginRequest(securityOrigin()->canRequestNoSuborigin(request.url()) ) | 133 , m_sameOriginRequest(securityOrigin()->canRequestNoSuborigin(request.url()) ) |
| 90 , m_crossOriginNonSimpleRequest(false) | 134 , m_crossOriginNonSimpleRequest(false) |
| 91 , m_isUsingDataConsumerHandle(false) | 135 , m_isUsingDataConsumerHandle(false) |
| 92 , m_async(blockingBehavior == LoadAsynchronously) | 136 , m_async(blockingBehavior == LoadAsynchronously) |
| 93 , m_requestContext(request.requestContext()) | 137 , m_requestContext(request.requestContext()) |
| 94 , m_timeoutTimer(this, &DocumentThreadableLoader::didTimeout) | 138 , m_timeoutTimer(this, &DocumentThreadableLoader::didTimeout) |
| 95 , m_requestStartedSeconds(0.0) | 139 , m_requestStartedSeconds(0.0) |
| 96 , m_corsRedirectLimit(kMaxCORSRedirects) | 140 , m_corsRedirectLimit(kMaxCORSRedirects) |
| 141 , m_redirectMode(request.fetchRedirectMode()) | |
| 97 { | 142 { |
| 98 ASSERT(client); | 143 ASSERT(client); |
| 99 // Setting an outgoing referer is only supported in the async code path. | 144 // Setting an outgoing referer is only supported in the async code path. |
| 100 ASSERT(m_async || request.httpReferrer().isEmpty()); | 145 ASSERT(m_async || request.httpReferrer().isEmpty()); |
| 101 | 146 |
| 102 if (!m_sameOriginRequest && m_options.crossOriginRequestPolicy == DenyCrossO riginRequests) { | 147 if (!m_sameOriginRequest && m_options.crossOriginRequestPolicy == DenyCrossO riginRequests) { |
| 103 m_client->didFail(ResourceError(errorDomainBlinkInternal, 0, request.url ().string(), "Cross origin requests are not supported.")); | 148 m_client->didFail(ResourceError(errorDomainBlinkInternal, 0, request.url ().string(), "Cross origin requests are not supported.")); |
| 104 return; | 149 return; |
| 105 } | 150 } |
| 106 | 151 |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 262 // to content::WebURLLoaderImpl. So, this loader must also get detached from | 307 // to content::WebURLLoaderImpl. So, this loader must also get detached from |
| 263 // the resource by calling clearResource(). | 308 // the resource by calling clearResource(). |
| 264 void DocumentThreadableLoader::redirectReceived(Resource* resource, ResourceRequ est& request, const ResourceResponse& redirectResponse) | 309 void DocumentThreadableLoader::redirectReceived(Resource* resource, ResourceRequ est& request, const ResourceResponse& redirectResponse) |
| 265 { | 310 { |
| 266 ASSERT(m_client); | 311 ASSERT(m_client); |
| 267 ASSERT_UNUSED(resource, resource == this->resource()); | 312 ASSERT_UNUSED(resource, resource == this->resource()); |
| 268 ASSERT(m_async); | 313 ASSERT(m_async); |
| 269 | 314 |
| 270 RefPtr<DocumentThreadableLoader> protect(this); | 315 RefPtr<DocumentThreadableLoader> protect(this); |
| 271 | 316 |
| 272 if (!isAllowedByContentSecurityPolicy(request.url(), ContentSecurityPolicy:: DidRedirect)) { | 317 if (m_redirectMode == WebURLRequest::FetchRedirectModeManual) { |
|
yhirano
2015/08/19 07:54:52
Can't we use request.fetchRedirectMode() instead o
horo
2015/08/19 08:23:04
No we can't.
This |request| is a new request for r
yhirano
2015/08/19 08:32:15
Acknowledged.
kinuko
2015/08/19 08:58:18
Adding a comment about it might help readers a bit
horo
2015/08/19 09:47:02
Done.
| |
| 318 ASSERT(request.useStreamOnResponse()); | |
| 319 // There is no need to read the body of redirect response because there | |
| 320 // is no way to read the body of opaque-redirect filtered response's | |
| 321 // internal response. | |
| 322 // TODO(horo): If we support any API which expose the internal body, we | |
| 323 // will have to read the body. And also HTTPCache changes will be needed | |
| 324 // because it doesn't store the body of redirect responses. | |
| 325 responseReceived(resource, redirectResponse, adoptPtr(new EmptyDataHandl e())); | |
| 326 notifyFinished(resource); | |
| 327 clearResource(); | |
| 328 request = ResourceRequest(); | |
| 329 return; | |
| 330 } | |
| 331 | |
| 332 if (m_redirectMode == WebURLRequest::FetchRedirectModeError || !isAllowedByC ontentSecurityPolicy(request.url(), ContentSecurityPolicy::DidRedirect)) { | |
| 273 m_client->didFailRedirectCheck(); | 333 m_client->didFailRedirectCheck(); |
| 274 | 334 |
| 275 clearResource(); | 335 clearResource(); |
| 276 request = ResourceRequest(); | 336 request = ResourceRequest(); |
| 277 | 337 |
| 278 m_requestStartedSeconds = 0.0; | 338 m_requestStartedSeconds = 0.0; |
| 279 return; | 339 return; |
| 280 } | 340 } |
| 281 | 341 |
| 282 // Allow same origin requests to continue after allowing clients to audit th e redirect. | 342 // Allow same origin requests to continue after allowing clients to audit th e redirect. |
| (...skipping 392 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 675 return DoNotAllowStoredCredentials; | 735 return DoNotAllowStoredCredentials; |
| 676 return m_resourceLoaderOptions.allowCredentials; | 736 return m_resourceLoaderOptions.allowCredentials; |
| 677 } | 737 } |
| 678 | 738 |
| 679 SecurityOrigin* DocumentThreadableLoader::securityOrigin() const | 739 SecurityOrigin* DocumentThreadableLoader::securityOrigin() const |
| 680 { | 740 { |
| 681 return m_securityOrigin ? m_securityOrigin.get() : m_document.securityOrigin (); | 741 return m_securityOrigin ? m_securityOrigin.get() : m_document.securityOrigin (); |
| 682 } | 742 } |
| 683 | 743 |
| 684 } // namespace blink | 744 } // namespace blink |
| OLD | NEW |