60 lines
1.9 KiB
C++
60 lines
1.9 KiB
C++
/* ************************************************************************** */
|
|
/* */
|
|
/* ::: :::::::: */
|
|
/* Connection.hpp :+: :+: :+: */
|
|
/* +:+ +:+ +:+ */
|
|
/* By: acossari <acossari@student.codam.nl> +#+ +:+ +#+ */
|
|
/* +#+#+#+#+#+ +#+ */
|
|
/* Created: 2026/08/28 09:21:04 by acossari #+# #+# */
|
|
/* Updated: 2026/08/29 18:07:36 by acossari ### ########.fr */
|
|
/* */
|
|
/* ************************************************************************** */
|
|
|
|
#pragma once
|
|
|
|
#include <cstddef>
|
|
#include <cstdint>
|
|
|
|
#include "net/ByteBuffer.hpp"
|
|
#include "net/FileDescriptor.hpp"
|
|
|
|
namespace webserv {
|
|
|
|
class Connection final {
|
|
public:
|
|
enum class Lifecycle { Alive, Done, Fatal };
|
|
|
|
struct Outcome {
|
|
Lifecycle lifecycle;
|
|
std::uint32_t desiredEvents;
|
|
};
|
|
|
|
static constexpr std::size_t LOW_WATERMARK = 16uz * 1024;
|
|
|
|
explicit Connection(FileDescriptor socket);
|
|
Connection(const Connection&) = delete;
|
|
Connection& operator=(const Connection&) = delete;
|
|
Connection(Connection&&) = delete;
|
|
Connection& operator=(Connection&&) = delete;
|
|
|
|
int fd() const noexcept { return socket_.get(); }
|
|
|
|
Outcome onClientEvent(std::uint32_t events);
|
|
|
|
std::uint32_t desiredEvents() noexcept;
|
|
|
|
void close() noexcept { socket_.reset(); }
|
|
|
|
private:
|
|
bool receive();
|
|
bool transmit();
|
|
void forwardReceivedBytes();
|
|
|
|
FileDescriptor socket_;
|
|
ByteBuffer receiveBuffer_;
|
|
ByteBuffer sendBuffer_;
|
|
bool readClosed_ = false;
|
|
};
|
|
|
|
} // namespace webserv
|