#ifndef NET_SERVER_HTTP_CONNECTION_H_
#define NET_SERVER_HTTP_CONNECTION_H_
#include <memory>
#include <string>
#include "base/containers/queue.h"
#include "base/memory/scoped_refptr.h"
#include "net/base/io_buffer.h"
#include "net/base/net_export.h"
namespace net {
class StreamSocket;
class WebSocket;
class NET_EXPORT HttpConnection {
public:
class NET_EXPORT ReadIOBuffer : public IOBuffer {
public:
static const int kInitialBufSize = 1024;
static const int kMinimumBufSize = 128;
static const int kCapacityIncreaseFactor = 2;
static const int kDefaultMaxBufferSize = 1 * 1024 * 1024;
ReadIOBuffer();
ReadIOBuffer(const ReadIOBuffer&) = delete;
ReadIOBuffer& operator=(const ReadIOBuffer&) = delete;
int GetCapacity() const;
void SetCapacity(int capacity);
bool IncreaseCapacity();
base::span<const uint8_t> readable_bytes() const;
void DidRead(int bytes);
int RemainingCapacity() const;
void DidConsume(int bytes);
int max_buffer_size() const { return max_buffer_size_; }
void set_max_buffer_size(int max_buffer_size) {
max_buffer_size_ = max_buffer_size;
}
private:
~ReadIOBuffer() override;
scoped_refptr<GrowableIOBuffer> base_;
int max_buffer_size_ = kDefaultMaxBufferSize;
};
class NET_EXPORT QueuedWriteIOBuffer : public IOBuffer {
public:
static const int kDefaultMaxBufferSize = 1 * 1024 * 1024;
QueuedWriteIOBuffer();
QueuedWriteIOBuffer(const QueuedWriteIOBuffer&) = delete;
QueuedWriteIOBuffer& operator=(const QueuedWriteIOBuffer&) = delete;
bool IsEmpty() const;
bool Append(const std::string& data);
void DidConsume(int size);
int GetSizeToWrite() const;
int total_size() const { return total_size_; }
int max_buffer_size() const { return max_buffer_size_; }
void set_max_buffer_size(int max_buffer_size) {
max_buffer_size_ = max_buffer_size;
}
private:
~QueuedWriteIOBuffer() override;
base::queue<std::unique_ptr<std::string>> pending_data_;
int total_size_ = 0;
int max_buffer_size_ = kDefaultMaxBufferSize;
};
HttpConnection(int id, std::unique_ptr<StreamSocket> socket);
HttpConnection(const HttpConnection&) = delete;
HttpConnection& operator=(const HttpConnection&) = delete;
~HttpConnection();
int id() const { return id_; }
StreamSocket* socket() const { return socket_.get(); }
ReadIOBuffer* read_buf() const { return read_buf_.get(); }
QueuedWriteIOBuffer* write_buf() const { return write_buf_.get(); }
WebSocket* web_socket() const { return web_socket_.get(); }
void SetWebSocket(std::unique_ptr<WebSocket> web_socket);
private:
const int id_;
const std::unique_ptr<StreamSocket> socket_;
const scoped_refptr<ReadIOBuffer> read_buf_;
const scoped_refptr<QueuedWriteIOBuffer> write_buf_;
std::unique_ptr<WebSocket> web_socket_;
};
}
#endif