Index: Source/modules/serviceworkers/FetchResponseData.cpp |
diff --git a/Source/modules/serviceworkers/FetchResponseData.cpp b/Source/modules/serviceworkers/FetchResponseData.cpp |
deleted file mode 100644 |
index 0c22cc7173f608befef7e0b04c7c1849bb6d88ec..0000000000000000000000000000000000000000 |
--- a/Source/modules/serviceworkers/FetchResponseData.cpp |
+++ /dev/null |
@@ -1,283 +0,0 @@ |
-// 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 "config.h" |
-#include "FetchResponseData.h" |
- |
-#include "core/dom/DOMArrayBuffer.h" |
-#include "core/fetch/CrossOriginAccessControl.h" |
-#include "modules/serviceworkers/BodyStreamBuffer.h" |
-#include "modules/serviceworkers/FetchHeaderList.h" |
-#include "public/platform/WebServiceWorkerResponse.h" |
- |
-namespace blink { |
- |
-namespace { |
- |
-WebServiceWorkerResponseType fetchTypeToWebType(FetchResponseData::Type fetchType) |
-{ |
- WebServiceWorkerResponseType webType = WebServiceWorkerResponseTypeDefault; |
- switch (fetchType) { |
- case FetchResponseData::BasicType: |
- webType = WebServiceWorkerResponseTypeBasic; |
- break; |
- case FetchResponseData::CORSType: |
- webType = WebServiceWorkerResponseTypeCORS; |
- break; |
- case FetchResponseData::DefaultType: |
- webType = WebServiceWorkerResponseTypeDefault; |
- break; |
- case FetchResponseData::ErrorType: |
- webType = WebServiceWorkerResponseTypeError; |
- break; |
- case FetchResponseData::OpaqueType: |
- webType = WebServiceWorkerResponseTypeOpaque; |
- break; |
- } |
- return webType; |
-} |
- |
-class StreamTeePump : public BodyStreamBuffer::Observer { |
-public: |
- StreamTeePump(BodyStreamBuffer* inBuffer, BodyStreamBuffer* outBuffer1, BodyStreamBuffer* outBuffer2) |
- : m_inBuffer(inBuffer) |
- , m_outBuffer1(outBuffer1) |
- , m_outBuffer2(outBuffer2) |
- { |
- } |
- void onWrite() override |
- { |
- while (RefPtr<DOMArrayBuffer> buf = m_inBuffer->read()) { |
- m_outBuffer1->write(buf); |
- m_outBuffer2->write(buf); |
- } |
- } |
- void onClose() override |
- { |
- m_outBuffer1->close(); |
- m_outBuffer2->close(); |
- cleanup(); |
- } |
- void onError() override |
- { |
- m_outBuffer1->error(m_inBuffer->exception()); |
- m_outBuffer2->error(m_inBuffer->exception()); |
- cleanup(); |
- } |
- void trace(Visitor* visitor) override |
- { |
- BodyStreamBuffer::Observer::trace(visitor); |
- visitor->trace(m_inBuffer); |
- visitor->trace(m_outBuffer1); |
- visitor->trace(m_outBuffer2); |
- } |
- void start() |
- { |
- m_inBuffer->registerObserver(this); |
- onWrite(); |
- if (m_inBuffer->hasError()) |
- return onError(); |
- if (m_inBuffer->isClosed()) |
- return onClose(); |
- } |
- |
-private: |
- void cleanup() |
- { |
- m_inBuffer->unregisterObserver(); |
- m_inBuffer.clear(); |
- m_outBuffer1.clear(); |
- m_outBuffer2.clear(); |
- } |
- Member<BodyStreamBuffer> m_inBuffer; |
- Member<BodyStreamBuffer> m_outBuffer1; |
- Member<BodyStreamBuffer> m_outBuffer2; |
-}; |
- |
-} // namespace |
- |
-FetchResponseData* FetchResponseData::create() |
-{ |
- // "Unless stated otherwise, a response's url is null, status is 200, status |
- // message is `OK`, header list is an empty header list, and body is null." |
- return new FetchResponseData(DefaultType, 200, "OK"); |
-} |
- |
-FetchResponseData* FetchResponseData::createNetworkErrorResponse() |
-{ |
- // "A network error is a response whose status is always 0, status message |
- // is always the empty byte sequence, header list is aways an empty list, |
- // and body is always null." |
- return new FetchResponseData(ErrorType, 0, ""); |
-} |
- |
-FetchResponseData* FetchResponseData::createWithBuffer(BodyStreamBuffer* buffer) |
-{ |
- FetchResponseData* response = FetchResponseData::create(); |
- response->m_buffer = buffer; |
- return response; |
-} |
- |
-FetchResponseData* FetchResponseData::createBasicFilteredResponse() |
-{ |
- // "A basic filtered response is a filtered response whose type is |basic|, |
- // header list excludes any headers in internal response's header list whose |
- // name is `Set-Cookie` or `Set-Cookie2`." |
- FetchResponseData* response = new FetchResponseData(BasicType, m_status, m_statusMessage); |
- response->m_url = m_url; |
- for (size_t i = 0; i < m_headerList->size(); ++i) { |
- const FetchHeaderList::Header* header = m_headerList->list()[i].get(); |
- if (header->first == "set-cookie" || header->first == "set-cookie2") |
- continue; |
- response->m_headerList->append(header->first, header->second); |
- } |
- response->m_blobDataHandle = m_blobDataHandle; |
- response->m_buffer = m_buffer; |
- response->m_contentTypeForBuffer = m_contentTypeForBuffer; |
- response->m_internalResponse = this; |
- return response; |
-} |
- |
-FetchResponseData* FetchResponseData::createCORSFilteredResponse() |
-{ |
- // "A CORS filtered response is a filtered response whose type is |CORS|, |
- // header list excludes all headers in internal response's header list, |
- // except those whose name is either one of `Cache-Control`, |
- // `Content-Language`, `Content-Type`, `Expires`, `Last-Modified`, and |
- // `Pragma`, and except those whose name is one of the values resulting from |
- // parsing `Access-Control-Expose-Headers` in internal response's header |
- // list." |
- FetchResponseData* response = new FetchResponseData(CORSType, m_status, m_statusMessage); |
- response->m_url = m_url; |
- HTTPHeaderSet accessControlExposeHeaderSet; |
- String accessControlExposeHeaders; |
- if (m_headerList->get("access-control-expose-headers", accessControlExposeHeaders)) |
- parseAccessControlExposeHeadersAllowList(accessControlExposeHeaders, accessControlExposeHeaderSet); |
- for (size_t i = 0; i < m_headerList->size(); ++i) { |
- const FetchHeaderList::Header* header = m_headerList->list()[i].get(); |
- if (!isOnAccessControlResponseHeaderWhitelist(header->first) && !accessControlExposeHeaderSet.contains(header->first)) |
- continue; |
- response->m_headerList->append(header->first, header->second); |
- } |
- response->m_blobDataHandle = m_blobDataHandle; |
- response->m_buffer = m_buffer; |
- response->m_contentTypeForBuffer = m_contentTypeForBuffer; |
- response->m_internalResponse = this; |
- return response; |
-} |
- |
-FetchResponseData* FetchResponseData::createOpaqueFilteredResponse() |
-{ |
- // "An opaque filtered response is a filtered response whose type is |
- // |opaque|, status is 0, status message is the empty byte sequence, header |
- // list is an empty list, and body is null." |
- FetchResponseData* response = new FetchResponseData(OpaqueType, 0, ""); |
- response->m_internalResponse = this; |
- return response; |
-} |
- |
-String FetchResponseData::contentTypeForBuffer() const |
-{ |
- return m_contentTypeForBuffer; |
-} |
- |
-PassRefPtr<BlobDataHandle> FetchResponseData::internalBlobDataHandle() const |
-{ |
- if (m_internalResponse) { |
- return m_internalResponse->m_blobDataHandle; |
- } |
- return m_blobDataHandle; |
-} |
- |
-BodyStreamBuffer* FetchResponseData::internalBuffer() const |
-{ |
- if (m_internalResponse) { |
- return m_internalResponse->m_buffer; |
- } |
- return m_buffer; |
-} |
- |
-String FetchResponseData::internalContentTypeForBuffer() const |
-{ |
- if (m_internalResponse) { |
- return m_internalResponse->contentTypeForBuffer(); |
- } |
- return m_contentTypeForBuffer; |
-} |
- |
-FetchResponseData* FetchResponseData::clone() |
-{ |
- FetchResponseData* newResponse = create(); |
- newResponse->m_type = m_type; |
- if (m_terminationReason) { |
- newResponse->m_terminationReason = adoptPtr(new TerminationReason); |
- *newResponse->m_terminationReason = *m_terminationReason; |
- } |
- newResponse->m_url = m_url; |
- newResponse->m_status = m_status; |
- newResponse->m_statusMessage = m_statusMessage; |
- newResponse->m_headerList = m_headerList->createCopy(); |
- newResponse->m_blobDataHandle = m_blobDataHandle; |
- newResponse->m_contentTypeForBuffer = m_contentTypeForBuffer; |
- if (!m_internalResponse) { |
- if (!m_buffer) |
- return newResponse; |
- BodyStreamBuffer* original = m_buffer; |
- m_buffer = new BodyStreamBuffer(); |
- newResponse->m_buffer = new BodyStreamBuffer(); |
- StreamTeePump* teePump = new StreamTeePump(original, m_buffer, newResponse->m_buffer); |
- teePump->start(); |
- return newResponse; |
- } |
- |
- ASSERT(!m_buffer || m_buffer == m_internalResponse->m_buffer); |
- newResponse->m_internalResponse = m_internalResponse->clone(); |
- if (m_buffer) { |
- m_buffer = m_internalResponse->m_buffer; |
- newResponse->m_buffer = newResponse->m_internalResponse->m_buffer; |
- } |
- return newResponse; |
-} |
- |
-void FetchResponseData::populateWebServiceWorkerResponse(WebServiceWorkerResponse& response) |
-{ |
- if (m_internalResponse) { |
- m_internalResponse->populateWebServiceWorkerResponse(response); |
- response.setResponseType(fetchTypeToWebType(m_type)); |
- return; |
- } |
- |
- response.setURL(url()); |
- response.setStatus(status()); |
- response.setStatusText(statusMessage()); |
- response.setResponseType(fetchTypeToWebType(m_type)); |
- for (size_t i = 0; i < headerList()->size(); ++i) { |
- const FetchHeaderList::Header* header = headerList()->list()[i].get(); |
- response.appendHeader(header->first, header->second); |
- } |
- response.setBlobDataHandle(m_blobDataHandle); |
-} |
- |
-FetchResponseData::FetchResponseData(Type type, unsigned short status, AtomicString statusMessage) |
- : m_type(type) |
- , m_status(status) |
- , m_statusMessage(statusMessage) |
- , m_headerList(FetchHeaderList::create()) |
-{ |
-} |
- |
-void FetchResponseData::setBlobDataHandle(PassRefPtr<BlobDataHandle> blobDataHandle) |
-{ |
- ASSERT(!m_buffer); |
- m_blobDataHandle = blobDataHandle; |
-} |
- |
-void FetchResponseData::trace(Visitor* visitor) |
-{ |
- visitor->trace(m_headerList); |
- visitor->trace(m_internalResponse); |
- visitor->trace(m_buffer); |
-} |
- |
-} // namespace blink |