1
2/*
3 * Copyright (C) 2017 Apple Inc. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
15 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
16 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
18 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
22 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
23 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
24 * THE POSSIBILITY OF SUCH DAMAGE.
25 */
26
27#include "config.h"
28#include "CacheStorageConnection.h"
29
30#include "FetchResponse.h"
31#include <wtf/RandomNumber.h>
32
33namespace WebCore {
34using namespace WebCore::DOMCacheEngine;
35
36static inline uint64_t computeRealBodySize(const DOMCacheEngine::ResponseBody& body)
37{
38 uint64_t result = 0;
39 WTF::switchOn(body, [&] (const Ref<WebCore::FormData>& formData) {
40 result = formData->lengthInBytes();
41 }, [&] (const Ref<WebCore::SharedBuffer>& buffer) {
42 result = buffer->size();
43 }, [] (const std::nullptr_t&) {
44 });
45 return result;
46}
47
48uint64_t CacheStorageConnection::computeRecordBodySize(const FetchResponse& response, const DOMCacheEngine::ResponseBody& body)
49{
50 if (!response.opaqueLoadIdentifier()) {
51 ASSERT(response.tainting() != ResourceResponse::Tainting::Opaque);
52 return computeRealBodySize(body);
53 }
54
55 return m_opaqueResponseToSizeWithPaddingMap.ensure(response.opaqueLoadIdentifier(), [&] () {
56 uint64_t realSize = computeRealBodySize(body);
57
58 // Padding the size as per https://github.com/whatwg/storage/issues/31.
59 uint64_t sizeWithPadding = realSize + static_cast<uint64_t>(randomNumber() * 128000);
60 sizeWithPadding = ((sizeWithPadding / 32000) + 1) * 32000;
61
62 m_opaqueResponseToSizeWithPaddingMap.set(response.opaqueLoadIdentifier(), sizeWithPadding);
63 return sizeWithPadding;
64 }).iterator->value;
65}
66
67} // namespace WebCore
68