| Index: Source/modules/fetch/FetchManager.cpp
|
| diff --git a/Source/modules/fetch/FetchManager.cpp b/Source/modules/fetch/FetchManager.cpp
|
| index 989297dbe59509b104bd2b9edd2ab7dba3c3915e..564544c7aac9f889fdaba30ff90450e20764d2c1 100644
|
| --- a/Source/modules/fetch/FetchManager.cpp
|
| +++ b/Source/modules/fetch/FetchManager.cpp
|
| @@ -37,15 +37,6 @@
|
|
|
| namespace blink {
|
|
|
| -namespace {
|
| -
|
| -bool IsRedirectStatusCode(int statusCode)
|
| -{
|
| - return (statusCode == 301 || statusCode == 302 || statusCode == 303 || statusCode == 307 || statusCode == 308);
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| class FetchManager::Loader final : public NoBaseWillBeGarbageCollectedFinalized<FetchManager::Loader>, public ThreadableLoaderClient, public ContextLifecycleObserver {
|
| WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(FetchManager::Loader);
|
| public:
|
| @@ -111,8 +102,6 @@ DEFINE_TRACE(FetchManager::Loader)
|
|
|
| void FetchManager::Loader::didReceiveResponse(unsigned long, const ResourceResponse& response, PassOwnPtr<WebDataConsumerHandle> handle)
|
| {
|
| - ASSERT(handle);
|
| -
|
| m_responseHttpStatusCode = response.httpStatusCode();
|
|
|
| // Recompute the tainting if the request was redirected to a different
|
| @@ -131,7 +120,17 @@ void FetchManager::Loader::didReceiveResponse(unsigned long, const ResourceRespo
|
| break;
|
| }
|
| }
|
| - FetchResponseData* responseData = FetchResponseData::createWithBuffer(new BodyStreamBuffer(createFetchDataConsumerHandleFromWebHandle(handle)));
|
| +
|
| + bool isRedirectResponse = false;
|
| + FetchResponseData* responseData = nullptr;
|
| + if (!handle) {
|
| + ASSERT(IsRedirectStatusCode(m_responseHttpStatusCode));
|
| + ASSERT(m_request->redirect() == WebURLRequest::FetchRedirectModeManual);
|
| + isRedirectResponse = true;
|
| + responseData = FetchResponseData::create();
|
| + } else {
|
| + responseData = FetchResponseData::createWithBuffer(new BodyStreamBuffer(createFetchDataConsumerHandleFromWebHandle(handle)));
|
| + }
|
| responseData->setStatus(response.httpStatusCode());
|
| responseData->setStatusMessage(response.httpStatusText());
|
| for (auto& it : response.httpHeaderFields())
|
| @@ -141,26 +140,9 @@ void FetchManager::Loader::didReceiveResponse(unsigned long, const ResourceRespo
|
|
|
| FetchResponseData* taintedResponse = nullptr;
|
|
|
| - if (IsRedirectStatusCode(m_responseHttpStatusCode)) {
|
| - Vector<String> locations;
|
| - responseData->headerList()->getAll("location", locations);
|
| - if (locations.size() > 1) {
|
| - performNetworkError("Multiple Location header.");
|
| - return;
|
| - }
|
| - if (locations.size() == 1) {
|
| - KURL locationURL(m_request->url(), locations[0]);
|
| - if (!locationURL.isValid()) {
|
| - performNetworkError("Invalid Location header.");
|
| - return;
|
| - }
|
| - ASSERT(m_request->redirect() == WebURLRequest::FetchRedirectModeManual);
|
| - taintedResponse = responseData->createOpaqueRedirectFilteredResponse();
|
| - }
|
| - // When the location header doesn't exist, we don't treat the response
|
| - // as a redirect response, and execute tainting.
|
| - }
|
| - if (!taintedResponse) {
|
| + if (isRedirectResponse) {
|
| + taintedResponse = responseData->createOpaqueRedirectFilteredResponse();
|
| + } else {
|
| switch (m_request->tainting()) {
|
| case FetchRequestData::BasicTainting:
|
| taintedResponse = responseData->createBasicFilteredResponse();
|
| @@ -177,6 +159,16 @@ void FetchManager::Loader::didReceiveResponse(unsigned long, const ResourceRespo
|
| r->headers()->setGuard(Headers::ImmutableGuard);
|
| m_resolver->resolve(r);
|
| m_resolver.clear();
|
| +
|
| + if (isRedirectResponse) {
|
| + // There is no need to read the body of redirect response because there
|
| + // is no way to read the body of opaque-redirect filtered response's
|
| + // internal response.
|
| + // TODO(horo): If we support any API which expose the internal body, we
|
| + // will have to read the body. And also HTTPCache changes will be needed
|
| + // because it doesn't store the body of redirect responses.
|
| + notifyFinished();
|
| + }
|
| }
|
|
|
| void FetchManager::Loader::didFinishLoading(unsigned long, double)
|
|
|