#ifndef FetchBody_h
#define FetchBody_h
#if ENABLE(FETCH_API)
#include "Blob.h"
#include "DOMFormData.h"
#include "FetchLoader.h"
#include "JSDOMPromise.h"
namespace JSC {
class ExecState;
class JSValue;
};
namespace WebCore {
class FetchBodyOwner;
class FetchResponseSource;
class FormData;
class FetchBody {
public:
void arrayBuffer(FetchBodyOwner&, DeferredWrapper&&);
void blob(FetchBodyOwner&, DeferredWrapper&&);
void json(FetchBodyOwner&, DeferredWrapper&&);
void text(FetchBodyOwner&, DeferredWrapper&&);
void formData(FetchBodyOwner&, DeferredWrapper&& promise) { promise.reject(0); }
#if ENABLE(STREAMS_API)
void consumeAsStream(FetchBodyOwner&, FetchResponseSource&);
#endif
bool isEmpty() const { return m_type == Type::None; }
void setMimeType(const String& mimeType) { m_mimeType = mimeType; }
String mimeType() const { return m_mimeType; }
static FetchBody extract(JSC::ExecState&, JSC::JSValue);
static FetchBody extractFromBody(FetchBody*);
static FetchBody loadingBody() { return { Type::Loading }; }
FetchBody() = default;
void loadingFailed();
void loadedAsArrayBuffer(RefPtr<ArrayBuffer>&&);
void loadedAsText(String&&);
RefPtr<FormData> bodyForInternalRequest() const;
enum class Type { None, ArrayBuffer, Loading, Text, Blob, FormData };
Type type() const { return m_type; }
private:
FetchBody(Ref<Blob>&&);
FetchBody(Ref<DOMFormData>&&);
FetchBody(String&&);
FetchBody(Type type) : m_type(type) { }
struct Consumer {
enum class Type { Text, Blob, JSON, ArrayBuffer };
Type type;
DeferredWrapper promise;
};
void consume(FetchBodyOwner&, Consumer::Type, DeferredWrapper&&);
Vector<uint8_t> extractFromText() const;
void consumeArrayBuffer(Consumer::Type, DeferredWrapper&);
void consumeText(Consumer::Type, DeferredWrapper&);
void consumeBlob(FetchBodyOwner&, Consumer::Type, DeferredWrapper&&);
static FetchLoader::Type loadingType(Consumer::Type);
static void fulfillTextPromise(FetchBody::Consumer::Type, const String&, DeferredWrapper&);
static void fulfillArrayBufferPromise(FetchBody::Consumer::Type, const String&, DeferredWrapper&);
Type m_type { Type::None };
String m_mimeType;
RefPtr<Blob> m_blob;
RefPtr<DOMFormData> m_formData;
RefPtr<ArrayBuffer> m_data;
String m_text;
Optional<Consumer> m_consumer;
};
}
#endif // ENABLE(FETCH_API)
#endif // FetchBody_h