blob: 88e08552d285d4cad5b8dbf8d349e9a690cdbeb3 [file] [log] [blame]
// Copyright 2022 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef COBALT_WEB_CACHE_H_
#define COBALT_WEB_CACHE_H_
#include <map>
#include <memory>
#include <string>
#include <utility>
#include <vector>
#include "base/optional.h"
#include "base/synchronization/lock.h"
#include "cobalt/network/network_module.h"
#include "cobalt/script/environment_settings.h"
#include "cobalt/script/script_value_factory.h"
#include "cobalt/script/sequence.h"
#include "cobalt/script/value_handle.h"
#include "cobalt/script/wrappable.h"
#include "net/base/io_buffer.h"
#include "net/url_request/url_request.h"
#include "url/gurl.h"
namespace cobalt {
namespace web {
class Cache : public script::Wrappable {
public:
Cache() = default;
// Web API: Cache
//
script::Handle<script::Promise<script::Handle<script::ValueHandle>>> Match(
script::EnvironmentSettings* environment_settings,
const script::ValueHandleHolder& request);
script::HandlePromiseVoid Add(
script::EnvironmentSettings* environment_settings,
const script::ValueHandleHolder& request);
script::HandlePromiseVoid Put(
script::EnvironmentSettings* environment_settings,
const script::ValueHandleHolder& request,
const script::ValueHandleHolder& response);
script::HandlePromiseBool Delete(
script::EnvironmentSettings* environment_settings,
const script::ValueHandleHolder& request);
script::Handle<script::Promise<script::Handle<script::ValueHandle>>> Keys(
script::EnvironmentSettings* environment_settings);
DEFINE_WRAPPABLE_TYPE(Cache);
private:
class Fetcher : public net::URLRequest::Delegate {
public:
Fetcher(network::NetworkModule* network_module, const GURL& url,
base::OnceCallback<void(bool)> callback);
// net::URLRequest::Delegate implementations.
void OnResponseStarted(net::URLRequest* request, int net_error) override;
void OnReadCompleted(net::URLRequest* request, int bytes_read) override;
const std::string& mime_type() const { return mime_type_; }
GURL url() const { return url_; }
int response_code() const { return response_code_; }
const std::string& status_text() const { return status_text_; }
base::ListValue headers() { return std::move(headers_); }
std::vector<uint8_t> BufferToVector() const;
std::string BufferToString() const;
private:
void Notify(bool success);
void OnDone(bool success);
void ReadResponse(net::URLRequest* request);
void Start();
network::NetworkModule* network_module_;
GURL url_;
base::OnceCallback<void(bool)> callback_;
std::unique_ptr<net::URLRequest> request_;
std::string mime_type_;
scoped_refptr<net::GrowableIOBuffer> buffer_;
int buffer_size_;
int response_code_;
base::ListValue headers_;
std::string status_text_;
};
void PerformAdd(
script::EnvironmentSettings* environment_settings,
std::unique_ptr<script::ValueHandleHolder::Reference> request_reference,
std::unique_ptr<script::ValuePromiseVoid::Reference> promise_reference);
void OnFetchCompleted(uint32_t key, bool success);
void OnFetchCompletedMainThread(uint32_t key, bool success);
std::map<uint32_t, std::unique_ptr<Fetcher>> fetchers_;
mutable base::Lock fetcher_lock_;
std::map<uint32_t, std::pair<std::vector<std::unique_ptr<
script::ValuePromiseVoid::Reference>>,
script::EnvironmentSettings*>>
fetch_contexts_;
};
} // namespace web
} // namespace cobalt
#endif // COBALT_WEB_CACHE_H_