#ifndef SERVICES_NETWORK_CHUNKED_DATA_PIPE_UPLOAD_DATA_STREAM_H_
#define SERVICES_NETWORK_CHUNKED_DATA_PIPE_UPLOAD_DATA_STREAM_H_
#include <stdint.h>
#include <memory>
#include <optional>
#include <vector>
#include "base/component_export.h"
#include "base/memory/scoped_refptr.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "mojo/public/cpp/system/data_pipe.h"
#include "mojo/public/cpp/system/simple_watcher.h"
#include "net/base/completion_once_callback.h"
#include "net/base/net_errors.h"
#include "net/base/upload_data_stream.h"
#include "services/network/public/cpp/resource_request_body.h"
#include "services/network/public/mojom/chunked_data_pipe_getter.mojom.h"
namespace net {
class IOBuffer;
}
namespace network {
class COMPONENT_EXPORT(NETWORK_SERVICE) ChunkedDataPipeUploadDataStream
: public net::UploadDataStream {
public:
ChunkedDataPipeUploadDataStream(
scoped_refptr<ResourceRequestBody> resource_request_body,
mojo::PendingRemote<mojom::ChunkedDataPipeGetter>
chunked_data_pipe_getter,
#if BUILDFLAG(ARKWEB_SCHEME_HANDLER)
bool has_null_source = false,
bool get_size_when_initialize = false);
#else
bool has_null_source = false);
#endif
ChunkedDataPipeUploadDataStream(const ChunkedDataPipeUploadDataStream&) =
delete;
ChunkedDataPipeUploadDataStream& operator=(
const ChunkedDataPipeUploadDataStream&) = delete;
~ChunkedDataPipeUploadDataStream() override;
bool AllowHTTP1() const override;
static const size_t kDefaultDestinationWindowSize = 65535;
void EnableCache(size_t dst_window_size = kDefaultDestinationWindowSize);
#if BUILDFLAG(ARKWEB_SCHEME_HANDLER)
mojo::PendingRemote<mojom::ChunkedDataPipeGetter> ReleaseChunkedDataPipeGetter();
bool has_null_source() const { return has_null_source_; }
#endif
private:
enum class CacheState {
kDisabled,
kActive,
kExhausted,
};
int InitInternal(const net::NetLogWithSource& net_log) override;
int ReadInternal(net::IOBuffer* buf, int buf_len) override;
void ResetInternal() override;
void OnSizeReceived(int32_t status, uint64_t size);
void OnHandleReadable(MojoResult result);
void OnDataPipeGetterClosed();
void WriteToCacheIfNeeded(net::IOBuffer* buf, size_t num_bytes);
int ReadFromCacheIfNeeded(net::IOBuffer* buf, int buf_len);
scoped_refptr<ResourceRequestBody> resource_request_body_;
mojo::Remote<mojom::ChunkedDataPipeGetter> chunked_data_pipe_getter_;
mojo::ScopedDataPipeConsumerHandle data_pipe_;
mojo::SimpleWatcher handle_watcher_;
scoped_refptr<net::IOBuffer> buf_;
int buf_len_ = 0;
std::optional<uint64_t> size_;
size_t bytes_read_ = 0;
int status_ = net::OK;
CacheState cache_state_ = CacheState::kDisabled;
size_t dst_window_size_ = kDefaultDestinationWindowSize;
std::vector<char> cache_;
#if BUILDFLAG(ARKWEB_SCHEME_HANDLER)
void ArkWebInitInternal();
bool has_null_source_{false};
bool get_size_when_initialize_{false};
#endif
};
}
#endif