#pragma once
#if ENABLE(FETCH_API)
#include "ExceptionOr.h"
#include "FetchBodyOwner.h"
#include "FetchOptions.h"
#include "ResourceRequest.h"
#include <wtf/Optional.h>
namespace WebCore {
class Blob;
class ScriptExecutionContext;
class URLSearchParams;
class FetchRequest final : public FetchBodyOwner {
public:
static Ref<FetchRequest> create(ScriptExecutionContext& context) { return adoptRef(*new FetchRequest(context, std::nullopt, FetchHeaders::create(FetchHeaders::Guard::Request), { })); }
using Cache = FetchOptions::Cache;
using Credentials = FetchOptions::Credentials;
using Destination = FetchOptions::Destination;
using Mode = FetchOptions::Mode;
using Redirect = FetchOptions::Redirect;
using ReferrerPolicy = FetchOptions::ReferrerPolicy;
using Type = FetchOptions::Type;
struct Init {
String method;
String referrer;
std::optional<ReferrerPolicy> referrerPolicy;
std::optional<Mode> mode;
std::optional<Credentials> credentials;
std::optional<Cache> cache;
std::optional<Redirect> redirect;
String integrity;
JSC::JSValue window;
};
ExceptionOr<FetchHeaders&> initializeWith(FetchRequest&, const Init&);
ExceptionOr<FetchHeaders&> initializeWith(const String&, const Init&);
ExceptionOr<void> setBody(FetchBody::BindingDataType&&);
ExceptionOr<void> setBodyFromInputRequest(FetchRequest*);
const String& method() const { return m_internalRequest.request.httpMethod(); }
const String& url() const;
FetchHeaders& headers() { return m_headers.get(); }
Type type() const;
Destination destination() const;
String referrer() const;
ReferrerPolicy referrerPolicy() const;
Mode mode() const;
Credentials credentials() const;
Cache cache() const;
Redirect redirect() const;
const String& integrity() const { return m_internalRequest.options.integrity; }
ExceptionOr<Ref<FetchRequest>> clone(ScriptExecutionContext&);
struct InternalRequest {
ResourceRequest request;
FetchOptions options;
String referrer;
};
const FetchOptions& fetchOptions() const { return m_internalRequest.options; }
ResourceRequest internalRequest() const;
bool isBodyReadableStream() const { return !isBodyNull() && body().isReadableStream(); }
const String& internalRequestReferrer() const { return m_internalRequest.referrer; }
private:
FetchRequest(ScriptExecutionContext&, std::optional<FetchBody>&&, Ref<FetchHeaders>&&, InternalRequest&&);
ExceptionOr<FetchHeaders&> initializeOptions(const Init&);
const char* activeDOMObjectName() const final;
bool canSuspendForDocumentSuspension() const final;
InternalRequest m_internalRequest;
mutable String m_requestURL;
};
inline FetchRequest::FetchRequest(ScriptExecutionContext& context, std::optional<FetchBody>&& body, Ref<FetchHeaders>&& headers, InternalRequest&& internalRequest)
: FetchBodyOwner(context, WTFMove(body), WTFMove(headers))
, m_internalRequest(WTFMove(internalRequest))
{
}
inline auto FetchRequest::cache() const -> Cache
{
return m_internalRequest.options.cache;
}
inline auto FetchRequest::credentials() const -> Credentials
{
return m_internalRequest.options.credentials;
}
inline auto FetchRequest::destination() const -> Destination
{
return m_internalRequest.options.destination;
}
inline auto FetchRequest::mode() const -> Mode
{
return m_internalRequest.options.mode;
}
inline auto FetchRequest::redirect() const -> Redirect
{
return m_internalRequest.options.redirect;
}
inline auto FetchRequest::referrerPolicy() const -> ReferrerPolicy
{
return m_internalRequest.options.referrerPolicy;
}
inline auto FetchRequest::type() const -> Type
{
return m_internalRequest.options.type;
}
}
#endif // ENABLE(FETCH_API)