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

Side by Side Diff: Source/modules/fetch/FetchManager.cpp

Issue 1265133002: [1/3 blink] Support redirect option of Request and "opaqueredirect" response type. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: rebase Created 5 years, 4 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 unified diff | Download patch
« no previous file with comments | « no previous file | Source/modules/fetch/FetchRequestData.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "config.h" 5 #include "config.h"
6 #include "modules/fetch/FetchManager.h" 6 #include "modules/fetch/FetchManager.h"
7 7
8 #include "bindings/core/v8/ExceptionState.h" 8 #include "bindings/core/v8/ExceptionState.h"
9 #include "bindings/core/v8/ScriptPromiseResolver.h" 9 #include "bindings/core/v8/ScriptPromiseResolver.h"
10 #include "bindings/core/v8/ScriptState.h" 10 #include "bindings/core/v8/ScriptState.h"
(...skipping 19 matching lines...) Expand all
30 #include "modules/fetch/ResponseInit.h" 30 #include "modules/fetch/ResponseInit.h"
31 #include "platform/network/ResourceError.h" 31 #include "platform/network/ResourceError.h"
32 #include "platform/network/ResourceRequest.h" 32 #include "platform/network/ResourceRequest.h"
33 #include "platform/network/ResourceResponse.h" 33 #include "platform/network/ResourceResponse.h"
34 #include "platform/weborigin/SecurityOrigin.h" 34 #include "platform/weborigin/SecurityOrigin.h"
35 #include "public/platform/WebURLRequest.h" 35 #include "public/platform/WebURLRequest.h"
36 #include "wtf/HashSet.h" 36 #include "wtf/HashSet.h"
37 37
38 namespace blink { 38 namespace blink {
39 39
40 namespace {
41
42 bool IsRedirectStatusCode(int statusCode)
43 {
44 return (statusCode == 301 || statusCode == 302 || statusCode == 303 || statu sCode == 307 || statusCode == 308);
45 }
46
47 } // namespace
48
40 class FetchManager::Loader final : public NoBaseWillBeGarbageCollectedFinalized< FetchManager::Loader>, public ThreadableLoaderClient, public ContextLifecycleObs erver { 49 class FetchManager::Loader final : public NoBaseWillBeGarbageCollectedFinalized< FetchManager::Loader>, public ThreadableLoaderClient, public ContextLifecycleObs erver {
41 WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(FetchManager::Loader); 50 WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(FetchManager::Loader);
42 public: 51 public:
43 static PassOwnPtrWillBeRawPtr<Loader> create(ExecutionContext* executionCont ext, FetchManager* fetchManager, ScriptPromiseResolver* resolver, FetchRequestDa ta* request) 52 static PassOwnPtrWillBeRawPtr<Loader> create(ExecutionContext* executionCont ext, FetchManager* fetchManager, ScriptPromiseResolver* resolver, FetchRequestDa ta* request)
44 { 53 {
45 return adoptPtrWillBeNoop(new Loader(executionContext, fetchManager, res olver, request)); 54 return adoptPtrWillBeNoop(new Loader(executionContext, fetchManager, res olver, request));
46 } 55 }
47 56
48 ~Loader() override; 57 ~Loader() override;
49 DECLARE_VIRTUAL_TRACE(); 58 DECLARE_VIRTUAL_TRACE();
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
123 } 132 }
124 } 133 }
125 FetchResponseData* responseData = FetchResponseData::createWithBuffer(new Bo dyStreamBuffer(createFetchDataConsumerHandleFromWebHandle(handle))); 134 FetchResponseData* responseData = FetchResponseData::createWithBuffer(new Bo dyStreamBuffer(createFetchDataConsumerHandleFromWebHandle(handle)));
126 responseData->setStatus(response.httpStatusCode()); 135 responseData->setStatus(response.httpStatusCode());
127 responseData->setStatusMessage(response.httpStatusText()); 136 responseData->setStatusMessage(response.httpStatusText());
128 for (auto& it : response.httpHeaderFields()) 137 for (auto& it : response.httpHeaderFields())
129 responseData->headerList()->append(it.key, it.value); 138 responseData->headerList()->append(it.key, it.value);
130 responseData->setURL(response.url()); 139 responseData->setURL(response.url());
131 responseData->setMIMEType(response.mimeType()); 140 responseData->setMIMEType(response.mimeType());
132 141
133 FetchResponseData* taintedResponse = responseData; 142 FetchResponseData* taintedResponse = nullptr;
134 switch (m_request->tainting()) { 143
135 case FetchRequestData::BasicTainting: 144 if (IsRedirectStatusCode(m_responseHttpStatusCode)) {
136 taintedResponse = responseData->createBasicFilteredResponse(); 145 Vector<String> locations;
137 break; 146 responseData->headerList()->getAll("location", locations);
138 case FetchRequestData::CORSTainting: 147 if (locations.size() > 1) {
139 taintedResponse = responseData->createCORSFilteredResponse(); 148 performNetworkError("Multiple Location header.");
140 break; 149 return;
141 case FetchRequestData::OpaqueTainting: 150 }
142 taintedResponse = responseData->createOpaqueFilteredResponse(); 151 if (locations.size() == 1) {
143 break; 152 KURL locationURL(m_request->url(), locations[0]);
153 if (!locationURL.isValid()) {
154 performNetworkError("Invalid Location header.");
155 return;
156 }
157 ASSERT(m_request->redirect() == WebURLRequest::FetchRedirectModeManu al);
158 taintedResponse = responseData->createOpaqueRedirectFilteredResponse ();
159 }
160 // When the location header doesn't exist, we don't treat the response
161 // as a redirect response, and execute tainting.
162 }
163 if (!taintedResponse) {
164 switch (m_request->tainting()) {
165 case FetchRequestData::BasicTainting:
166 taintedResponse = responseData->createBasicFilteredResponse();
167 break;
168 case FetchRequestData::CORSTainting:
169 taintedResponse = responseData->createCORSFilteredResponse();
170 break;
171 case FetchRequestData::OpaqueTainting:
172 taintedResponse = responseData->createOpaqueFilteredResponse();
173 break;
174 }
144 } 175 }
145 Response* r = Response::create(m_resolver->executionContext(), taintedRespon se); 176 Response* r = Response::create(m_resolver->executionContext(), taintedRespon se);
146 r->headers()->setGuard(Headers::ImmutableGuard); 177 r->headers()->setGuard(Headers::ImmutableGuard);
147 m_resolver->resolve(r); 178 m_resolver->resolve(r);
148 m_resolver.clear(); 179 m_resolver.clear();
149 } 180 }
150 181
151 void FetchManager::Loader::didFinishLoading(unsigned long, double) 182 void FetchManager::Loader::didFinishLoading(unsigned long, double)
152 { 183 {
153 ASSERT(!m_failed); 184 ASSERT(!m_failed);
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
328 359
329 if (m_request->method() != "GET" && m_request->method() != "HEAD") { 360 if (m_request->method() != "GET" && m_request->method() != "HEAD") {
330 if (BodyStreamBuffer* buffer = m_request->buffer()) { 361 if (BodyStreamBuffer* buffer = m_request->buffer()) {
331 RefPtr<BlobDataHandle> blobDataHandle = buffer->drainAsBlobDataHandl e(FetchDataConsumerHandle::Reader::AllowBlobWithInvalidSize); 362 RefPtr<BlobDataHandle> blobDataHandle = buffer->drainAsBlobDataHandl e(FetchDataConsumerHandle::Reader::AllowBlobWithInvalidSize);
332 RefPtr<FormData> httpBody(FormData::create()); 363 RefPtr<FormData> httpBody(FormData::create());
333 if (blobDataHandle) 364 if (blobDataHandle)
334 httpBody->appendBlob(blobDataHandle->uuid(), blobDataHandle); 365 httpBody->appendBlob(blobDataHandle->uuid(), blobDataHandle);
335 request.setHTTPBody(httpBody); 366 request.setHTTPBody(httpBody);
336 } 367 }
337 } 368 }
338 369 request.setFetchRedirectMode(m_request->redirect());
339 request.setUseStreamOnResponse(true); 370 request.setUseStreamOnResponse(true);
340 371
341 // "2. Append `Referer`/empty byte sequence, if |HTTPRequest|'s |referrer| 372 // "2. Append `Referer`/empty byte sequence, if |HTTPRequest|'s |referrer|
342 // is none, and `Referer`/|HTTPRequest|'s referrer, serialized and utf-8 373 // is none, and `Referer`/|HTTPRequest|'s referrer, serialized and utf-8
343 // encoded, otherwise, to HTTPRequest's header list. 374 // encoded, otherwise, to HTTPRequest's header list.
344 // We set the referrer using workerGlobalScope's URL in 375 // We set the referrer using workerGlobalScope's URL in
345 // WorkerThreadableLoader. 376 // WorkerThreadableLoader.
346 377
347 // "3. Append `Host`, ..." 378 // "3. Append `Host`, ..."
348 // FIXME: Implement this when the spec is fixed. 379 // FIXME: Implement this when the spec is fixed.
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
457 488
458 DEFINE_TRACE(FetchManager) 489 DEFINE_TRACE(FetchManager)
459 { 490 {
460 #if ENABLE(OILPAN) 491 #if ENABLE(OILPAN)
461 visitor->trace(m_executionContext); 492 visitor->trace(m_executionContext);
462 visitor->trace(m_loaders); 493 visitor->trace(m_loaders);
463 #endif 494 #endif
464 } 495 }
465 496
466 } // namespace blink 497 } // namespace blink
OLDNEW
« no previous file with comments | « no previous file | Source/modules/fetch/FetchRequestData.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698