Chromium Code Reviews| Index: Source/modules/serviceworkers/FetchResponseData.cpp |
| diff --git a/Source/modules/serviceworkers/FetchResponseData.cpp b/Source/modules/serviceworkers/FetchResponseData.cpp |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..e97ca37d8ae7366121ec68aca12135b10fd41c4e |
| --- /dev/null |
| +++ b/Source/modules/serviceworkers/FetchResponseData.cpp |
| @@ -0,0 +1,108 @@ |
| +// 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/fetch/CrossOriginAccessControl.h" |
| +#include "modules/serviceworkers/FetchHeaderList.h" |
| +#include "public/platform/WebServiceWorkerResponse.h" |
| + |
| +namespace WebCore { |
| + |
| +PassRefPtr<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 adoptRef(new FetchResponseData(DefaultType, 200, "OK")); |
| +} |
| + |
| +PassRefPtr<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 adoptRef(new FetchResponseData(ErrorType, 0, "")); |
| +} |
| + |
| +PassRefPtr<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`." |
| + RefPtr<FetchResponseData> response = adoptRef(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; |
|
falken
2014/07/07 08:10:40
errant space
horo
2014/07/07 10:19:44
Done.
|
| + response->m_internalResponse = this; |
| + return response.release(); |
| +} |
| + |
| +PassRefPtr<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." |
| + RefPtr<FetchResponseData> response = adoptRef(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; |
|
falken
2014/07/07 08:10:40
space
horo
2014/07/07 10:19:44
Done.
|
| + response->m_internalResponse = this; |
| + return response.release(); |
| +} |
| + |
| +PassRefPtr<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." |
| + RefPtr<FetchResponseData> response = adoptRef(new FetchResponseData(OpaqueType, 0, "")); |
| + response->m_internalResponse = this; |
| + return response.release(); |
| +} |
| + |
| +void FetchResponseData::populateWebServiceWorkerResponse(blink::WebServiceWorkerResponse& response) |
| +{ |
| + if (m_internalResponse) { |
| + m_internalResponse->populateWebServiceWorkerResponse(response); |
| + return; |
| + } |
| + response.setURL(url()); |
| + response.setStatus(status()); |
| + response.setStatusText(statusMessage()); |
| + for (size_t i = 0; i < headerList()->size(); ++i) { |
| + const FetchHeaderList::Header* header = headerList()->list()[i].get(); |
| + response.setHeader(header->first, header->second); |
| + } |
| + response.setBlobDataHandle(blobDataHandle()); |
| +} |
| + |
| +FetchResponseData::FetchResponseData(Type type, unsigned short status, AtomicString statusMessage) |
| + : m_type(type) |
| + , m_status(status) |
| + , m_statusMessage(statusMessage) |
| + , m_headerList(FetchHeaderList::create()) |
| +{ |
| +} |
| + |
| +} // namespace WebCore |