#ifndef NET_WEBSOCKETS_WEBSOCKET_BASIC_STREAM_ADAPTERS_H_
#define NET_WEBSOCKETS_WEBSOCKET_BASIC_STREAM_ADAPTERS_H_
#include <stddef.h>
#include <memory>
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "net/base/completion_once_callback.h"
#include "net/base/net_errors.h"
#include "net/base/net_export.h"
#include "net/log/net_log_source.h"
#include "net/log/net_log_with_source.h"
#include "net/spdy/spdy_read_queue.h"
#include "net/spdy/spdy_stream.h"
#include "net/third_party/quiche/src/quiche/common/http/http_header_block.h"
#include "net/traffic_annotation/network_traffic_annotation.h"
#include "net/websockets/websocket_basic_stream.h"
#include "net/websockets/websocket_quic_spdy_stream.h"
namespace quic {
class QuicHeaderList;
}
namespace net {
class StreamSocketHandle;
class IOBuffer;
class SpdyBuffer;
struct NetworkTrafficAnnotationTag;
class NET_EXPORT_PRIVATE WebSocketClientSocketHandleAdapter
: public WebSocketBasicStream::Adapter {
public:
WebSocketClientSocketHandleAdapter() = delete;
explicit WebSocketClientSocketHandleAdapter(
std::unique_ptr<StreamSocketHandle> connection);
~WebSocketClientSocketHandleAdapter() override;
int Read(IOBuffer* buf,
int buf_len,
CompletionOnceCallback callback) override;
int Write(IOBuffer* buf,
int buf_len,
CompletionOnceCallback callback,
const NetworkTrafficAnnotationTag& traffic_annotation) override;
void Disconnect() override;
bool is_initialized() const override;
private:
std::unique_ptr<StreamSocketHandle> connection_;
};
class NET_EXPORT_PRIVATE WebSocketSpdyStreamAdapter
: public WebSocketBasicStream::Adapter,
public SpdyStream::Delegate {
public:
class Delegate {
public:
virtual ~Delegate() = default;
virtual void OnHeadersSent() = 0;
virtual void OnHeadersReceived(
const quiche::HttpHeaderBlock& response_headers) = 0;
virtual void OnClose(int status) = 0;
};
WebSocketSpdyStreamAdapter(base::WeakPtr<SpdyStream> stream,
Delegate* delegate,
NetLogWithSource net_log);
~WebSocketSpdyStreamAdapter() override;
void DetachDelegate();
int Read(IOBuffer* buf,
int buf_len,
CompletionOnceCallback callback) override;
int Write(IOBuffer* buf,
int buf_len,
CompletionOnceCallback callback,
const NetworkTrafficAnnotationTag& traffic_annotation) override;
void Disconnect() override;
bool is_initialized() const override;
void OnHeadersSent() override;
void OnEarlyHintsReceived(const quiche::HttpHeaderBlock& headers) override;
void OnHeadersReceived(
const quiche::HttpHeaderBlock& response_headers) override;
void OnDataReceived(std::unique_ptr<SpdyBuffer> buffer) override;
void OnDataSent() override;
void OnTrailers(const quiche::HttpHeaderBlock& trailers) override;
void OnClose(int status) override;
bool CanGreaseFrameType() const override;
NetLogSource source_dependency() const override;
private:
int CopySavedReadDataIntoBuffer();
void CallDelegateOnClose();
bool headers_sent_ = false;
base::WeakPtr<SpdyStream> stream_;
int stream_error_ = ERR_CONNECTION_CLOSED;
raw_ptr<Delegate> delegate_;
SpdyReadQueue read_data_;
raw_ptr<IOBuffer> read_buffer_ = nullptr;
size_t read_length_ = 0u;
CompletionOnceCallback read_callback_;
int write_length_ = 0;
CompletionOnceCallback write_callback_;
NetLogWithSource net_log_;
base::WeakPtrFactory<WebSocketSpdyStreamAdapter> weak_factory_{this};
};
class NET_EXPORT_PRIVATE WebSocketQuicStreamAdapter
: public WebSocketBasicStream::Adapter,
public WebSocketQuicSpdyStream::Delegate {
public:
class Delegate {
public:
virtual ~Delegate() = default;
virtual void OnHeadersSent() = 0;
virtual void OnHeadersReceived(
const quiche::HttpHeaderBlock& response_headers) = 0;
virtual void OnClose(int status) = 0;
};
explicit WebSocketQuicStreamAdapter(
WebSocketQuicSpdyStream* websocket_quic_spdy_stream,
Delegate* delegate);
WebSocketQuicStreamAdapter(const WebSocketQuicStreamAdapter&) = delete;
WebSocketQuicStreamAdapter& operator=(const WebSocketQuicStreamAdapter&) =
delete;
~WebSocketQuicStreamAdapter() override;
void clear_delegate() { delegate_ = nullptr; }
size_t WriteHeaders(quiche::HttpHeaderBlock header_block, bool fin);
int Read(IOBuffer* buf,
int buf_len,
CompletionOnceCallback callback) override;
int Write(IOBuffer* buf,
int buf_len,
CompletionOnceCallback callback,
const NetworkTrafficAnnotationTag& traffic_annotation) override;
void Disconnect() override;
bool is_initialized() const override;
void OnInitialHeadersComplete(
bool fin,
size_t frame_len,
const quic::QuicHeaderList& header_list) override;
void OnBodyAvailable() override;
void ClearStream() override;
private:
raw_ptr<WebSocketQuicSpdyStream> websocket_quic_spdy_stream_;
raw_ptr<Delegate> delegate_;
raw_ptr<IOBuffer> read_buffer_ = nullptr;
int read_length_ = 0u;
CompletionOnceCallback read_callback_;
};
}
#endif