1197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch// found in the LICENSE file. 4197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 5197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "config.h" 6197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "FetchResponseData.h" 7197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 8197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "core/fetch/CrossOriginAccessControl.h" 9197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "modules/serviceworkers/FetchHeaderList.h" 10197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "public/platform/WebServiceWorkerResponse.h" 11197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 12c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 13197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciFetchResponseData* FetchResponseData::create() 15197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{ 16197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // "Unless stated otherwise, a response's url is null, status is 200, status 17197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // message is `OK`, header list is an empty header list, and body is null." 187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return new FetchResponseData(DefaultType, 200, "OK"); 19197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch} 20197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciFetchResponseData* FetchResponseData::createNetworkErrorResponse() 22197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{ 23197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // "A network error is a response whose status is always 0, status message 24197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // is always the empty byte sequence, header list is aways an empty list, 25197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // and body is always null." 267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return new FetchResponseData(ErrorType, 0, ""); 27197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch} 28197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciFetchResponseData* FetchResponseData::createBasicFilteredResponse() 30197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{ 31197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // "A basic filtered response is a filtered response whose type is |basic|, 32197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // header list excludes any headers in internal response's header list whose 33197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // name is `Set-Cookie` or `Set-Cookie2`." 347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci FetchResponseData* response = new FetchResponseData(BasicType, m_status, m_statusMessage); 35197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch response->m_url = m_url; 36197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch for (size_t i = 0; i < m_headerList->size(); ++i) { 37197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch const FetchHeaderList::Header* header = m_headerList->list()[i].get(); 38197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (header->first == "set-cookie" || header->first == "set-cookie2") 39197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch continue; 40197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch response->m_headerList->append(header->first, header->second); 41197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch } 42197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch response->m_blobDataHandle = m_blobDataHandle; 43197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch response->m_internalResponse = this; 447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return response; 45197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch} 46197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciFetchResponseData* FetchResponseData::createCORSFilteredResponse() 48197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{ 49197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // "A CORS filtered response is a filtered response whose type is |CORS|, 50197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // header list excludes all headers in internal response's header list, 51197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // except those whose name is either one of `Cache-Control`, 52197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // `Content-Language`, `Content-Type`, `Expires`, `Last-Modified`, and 53197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // `Pragma`, and except those whose name is one of the values resulting from 54197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // parsing `Access-Control-Expose-Headers` in internal response's header 55197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // list." 567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci FetchResponseData* response = new FetchResponseData(CORSType, m_status, m_statusMessage); 57197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch response->m_url = m_url; 58197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch HTTPHeaderSet accessControlExposeHeaderSet; 59197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch String accessControlExposeHeaders; 60197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (m_headerList->get("access-control-expose-headers", accessControlExposeHeaders)) 61197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch parseAccessControlExposeHeadersAllowList(accessControlExposeHeaders, accessControlExposeHeaderSet); 62197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch for (size_t i = 0; i < m_headerList->size(); ++i) { 63197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch const FetchHeaderList::Header* header = m_headerList->list()[i].get(); 64197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (!isOnAccessControlResponseHeaderWhitelist(header->first) && !accessControlExposeHeaderSet.contains(header->first)) 65197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch continue; 66197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch response->m_headerList->append(header->first, header->second); 67197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch } 68197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch response->m_blobDataHandle = m_blobDataHandle; 69197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch response->m_internalResponse = this; 707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return response; 71197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch} 72197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciFetchResponseData* FetchResponseData::createOpaqueFilteredResponse() 74197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{ 75197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // "An opaque filtered response is a filtered response whose type is 76197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // |opaque|, status is 0, status message is the empty byte sequence, header 77197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // list is an empty list, and body is null." 787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci FetchResponseData* response = new FetchResponseData(OpaqueType, 0, ""); 79197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch response->m_internalResponse = this; 807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return response; 81197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch} 82197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 83e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)void FetchResponseData::populateWebServiceWorkerResponse(WebServiceWorkerResponse& response) 84197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{ 85197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (m_internalResponse) { 86197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch m_internalResponse->populateWebServiceWorkerResponse(response); 87197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return; 88197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch } 89197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch response.setURL(url()); 90197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch response.setStatus(status()); 91197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch response.setStatusText(statusMessage()); 92197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch for (size_t i = 0; i < headerList()->size(); ++i) { 93197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch const FetchHeaderList::Header* header = headerList()->list()[i].get(); 947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci response.appendHeader(header->first, header->second); 95197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch } 96197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch response.setBlobDataHandle(blobDataHandle()); 97197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch} 98197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 99197021e6b966cfb06891637935ef33fff06433d1Ben MurdochFetchResponseData::FetchResponseData(Type type, unsigned short status, AtomicString statusMessage) 100197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch : m_type(type) 101197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch , m_status(status) 102197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch , m_statusMessage(statusMessage) 103197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch , m_headerList(FetchHeaderList::create()) 104197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{ 105197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch} 106197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 107197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid FetchResponseData::trace(Visitor* visitor) 108197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{ 109197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch visitor->trace(m_headerList); 110197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch visitor->trace(m_internalResponse); 111197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch} 112197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 113c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 114