#pragma once
#include "AbortSignal.h"
#include "ExceptionOr.h"
#include "FetchBodyOwner.h"
#include "FetchOptions.h"
#include "FetchRequestInit.h"
#include "ResourceRequest.h"
#include <wtf/Optional.h>
namespace WebCore {
class Blob;
class ScriptExecutionContext;
class URLSearchParams;
class FetchRequest final : public FetchBodyOwner {
public:
using Init = FetchRequestInit;
using Info = Variant<RefPtr<FetchRequest>, String>;
using Cache = FetchOptions::Cache;
using Credentials = FetchOptions::Credentials;
using Destination = FetchOptions::Destination;
using Mode = FetchOptions::Mode;
using Redirect = FetchOptions::Redirect;
static ExceptionOr<Ref<FetchRequest>> create(ScriptExecutionContext&, Info&&, Init&&);
static Ref<FetchRequest> create(ScriptExecutionContext& context, Optional<FetchBody>&& body, Ref<FetchHeaders>&& headers, ResourceRequest&& request, FetchOptions&& options, String&& referrer) { return adoptRef(*new FetchRequest(context, WTFMove(body), WTFMove(headers), WTFMove(request), WTFMove(options), WTFMove(referrer))); }
const String& method() const { return m_request.httpMethod(); }
const String& urlString() const;
FetchHeaders& headers() { return m_headers.get(); }
const FetchHeaders& headers() const { return m_headers.get(); }
Destination destination() const { return m_options.destination; }
String referrer() const;
ReferrerPolicy referrerPolicy() const { return m_options.referrerPolicy; }
Mode mode() const { return m_options.mode; }
Credentials credentials() const { return m_options.credentials; }
Cache cache() const { return m_options.cache; }
Redirect redirect() const { return m_options.redirect; }
bool keepalive() const { return m_options.keepAlive; };
AbortSignal& signal() { return m_signal.get(); }
const String& integrity() const { return m_options.integrity; }
ExceptionOr<Ref<FetchRequest>> clone(ScriptExecutionContext&);
const FetchOptions& fetchOptions() const { return m_options; }
const ResourceRequest& internalRequest() const { return m_request; }
const String& internalRequestReferrer() const { return m_referrer; }
const URL& url() const { return m_request.url(); }
ResourceRequest resourceRequest() const;
private:
FetchRequest(ScriptExecutionContext&, Optional<FetchBody>&&, Ref<FetchHeaders>&&, ResourceRequest&&, FetchOptions&&, String&& referrer);
ExceptionOr<void> initializeOptions(const Init&);
ExceptionOr<void> initializeWith(FetchRequest&, Init&&);
ExceptionOr<void> initializeWith(const String&, Init&&);
ExceptionOr<void> setBody(FetchBody::Init&&);
ExceptionOr<void> setBody(FetchRequest&);
const char* activeDOMObjectName() const final;
bool canSuspendForDocumentSuspension() const final;
ResourceRequest m_request;
FetchOptions m_options;
String m_referrer;
mutable String m_requestURL;
Ref<AbortSignal> m_signal;
};
inline FetchRequest::FetchRequest(ScriptExecutionContext& context, Optional<FetchBody>&& body, Ref<FetchHeaders>&& headers, ResourceRequest&& request, FetchOptions&& options, String&& referrer)
: FetchBodyOwner(context, WTFMove(body), WTFMove(headers))
, m_request(WTFMove(request))
, m_options(WTFMove(options))
, m_referrer(WTFMove(referrer))
, m_signal(AbortSignal::create(context))
{
updateContentType();
}
}