blob: eb72cc11b08dee8be67d136f1b83c126bfc09712 [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "modules/fetch/FetchRequestData.h"
#include "core/dom/ExecutionContext.h"
#include "core/fetch/ResourceLoaderOptions.h"
#include "core/loader/ThreadableLoader.h"
#include "core/streams/ReadableStream.h"
#include "modules/credentialmanager/PasswordCredential.h"
#include "modules/fetch/BodyStreamBuffer.h"
#include "modules/fetch/DataConsumerHandleUtil.h"
#include "modules/fetch/DataConsumerTee.h"
#include "modules/fetch/FetchBlobDataConsumerHandle.h"
#include "modules/fetch/FetchHeaderList.h"
#include "platform/HTTPNames.h"
#include "platform/network/ResourceRequest.h"
#include "public/platform/WebURLRequest.h"
#include "public/platform/modules/serviceworker/WebServiceWorkerRequest.h"
namespace blink {
FetchRequestData* FetchRequestData::create()
{
return new FetchRequestData();
}
FetchRequestData* FetchRequestData::create(ExecutionContext* executionContext, const WebServiceWorkerRequest& webRequest)
{
FetchRequestData* request = FetchRequestData::create();
request->m_url = webRequest.url();
request->m_method = webRequest.method();
for (HTTPHeaderMap::const_iterator it = webRequest.headers().begin(); it != webRequest.headers().end(); ++it)
request->m_headerList->append(it->key, it->value);
if (webRequest.blobDataHandle())
request->setBuffer(new BodyStreamBuffer(FetchBlobDataConsumerHandle::create(executionContext, webRequest.blobDataHandle())));
request->setContext(webRequest.requestContext());
request->setReferrer(Referrer(webRequest.referrerUrl().string(), ReferrerPolicyDefault));
request->setMode(webRequest.mode());
request->setCredentials(webRequest.credentialsMode());
request->setRedirect(webRequest.redirectMode());
request->setMIMEType(request->m_headerList->extractMIMEType());
return request;
}
FetchRequestData* FetchRequestData::cloneExceptBody()
{
FetchRequestData* request = FetchRequestData::create();
request->m_url = m_url;
request->m_method = m_method;
request->m_headerList = m_headerList->clone();
request->m_unsafeRequestFlag = m_unsafeRequestFlag;
request->m_origin = m_origin;
request->m_sameOriginDataURLFlag = m_sameOriginDataURLFlag;
request->m_context = m_context;
request->m_referrer = m_referrer;
request->m_mode = m_mode;
request->m_credentials = m_credentials;
request->m_redirect = m_redirect;
request->m_responseTainting = m_responseTainting;
request->m_mimeType = m_mimeType;
request->m_integrity = m_integrity;
request->m_attachedCredential = m_attachedCredential;
return request;
}
FetchRequestData* FetchRequestData::clone(ExecutionContext* executionContext)
{
FetchRequestData* request = FetchRequestData::cloneExceptBody();
if (m_buffer) {
OwnPtr<FetchDataConsumerHandle> dest1, dest2;
DataConsumerTee::create(executionContext, m_buffer->releaseHandle(executionContext), &dest1, &dest2);
m_buffer = new BodyStreamBuffer(dest1.release());
request->m_buffer = new BodyStreamBuffer(dest2.release());
}
return request;
}
FetchRequestData* FetchRequestData::pass(ExecutionContext* executionContext)
{
FetchRequestData* request = FetchRequestData::cloneExceptBody();
if (m_buffer) {
request->m_buffer = m_buffer;
m_buffer = new BodyStreamBuffer(createFetchDataConsumerHandleFromWebHandle(createDoneDataConsumerHandle()));
m_buffer->stream()->setIsDisturbed();
}
return request;
}
FetchRequestData::~FetchRequestData()
{
}
FetchRequestData::FetchRequestData()
: m_method(HTTPNames::GET)
, m_headerList(FetchHeaderList::create())
, m_unsafeRequestFlag(false)
, m_context(WebURLRequest::RequestContextUnspecified)
, m_sameOriginDataURLFlag(false)
, m_referrer(Referrer(clientReferrerString(), ReferrerPolicyDefault))
, m_mode(WebURLRequest::FetchRequestModeNoCORS)
, m_credentials(WebURLRequest::FetchCredentialsModeOmit)
, m_redirect(WebURLRequest::FetchRedirectModeFollow)
, m_responseTainting(BasicTainting)
{
}
void FetchRequestData::setCredentials(WebURLRequest::FetchCredentialsMode credentials)
{
m_credentials = credentials;
if (m_credentials != WebURLRequest::FetchCredentialsModePassword)
m_attachedCredential.clear();
}
DEFINE_TRACE(FetchRequestData)
{
visitor->trace(m_buffer);
visitor->trace(m_headerList);
}
} // namespace blink