Webserv
Loading...
Searching...
No Matches
ClientHandler.hpp
Go to the documentation of this file.
1#pragma once
2
3#include "IEventHandler.hpp"
4#include "http/Headers.hpp"
5#include "http/HttpStatus.hpp"
7#include "http/Response.hpp"
8#include "http/Router.hpp"
9#include <ctime>
10
11namespace network {
12
22public:
23 // =========================================================================
24 // Lifecycle & Interface
25 // =========================================================================
26public:
27 ClientHandler(int clientFd, int port, std::string const &clientAddr, http::Router const &);
28 virtual ~ClientHandler();
29
30 // IEventHandler implementation
31 virtual void handleEvent(uint32_t events);
32 virtual int getFd() const;
33
34 // =========================================================================
35 // CGI / Buffer Interaction (Called by external helpers)
36 // =========================================================================
37public:
42 void pushToSendBuffer(const char *data, size_t length);
43
48 bool isSendBufferFull() const;
49
53 void onCgiComplete();
54
59
64
65 // =========================================================================
66 // Internal Helper Structures
67 // =========================================================================
68private:
69 // Helper to manage the output buffer logic
70 struct SendBuffer {
71 std::vector<char> buffer;
72 size_t sent;
73
74 explicit SendBuffer(size_t initialCapacity);
75 void reset();
76 bool isFullySent() const;
77
79 SendStatus send(int clientFd);
80 };
81
82 // Helper to group CGI/Event Source state
83 struct CgiState {
84 IEventHandler *handler; // The worker handling the CGI script
85 bool isDone;
86
87 CgiState();
88 void clear();
89 void remove();
90 };
91
92private:
93 // Core Socket State
95 int port_;
96 std::string clientAddr_;
98
99 // HTTP State
104
105 // Response State
108 std::time_t drainStartTime_;
111
112 static const size_t IO_BUFFER_SIZE = 8192;
113
114private:
116 void handleRead();
117 void handleDraining();
121
122 // Logic Steps
124 void generateResponse();
127 void setupStaticResponse();
128
129 // Connection Lifecycle
131 void resetForNewRequest();
133 void closeConnection();
134 void initiateDraining();
135 void finalizeConnection();
136
139
140 std::string getLogSignature() const;
141};
142
143} // namespace network
Manages a collection of HTTP headers.
Definition Headers.hpp:17
An abstract interface for all HTTP response body sources.
Definition ResponseBody.hpp:16
Definition RequestParser.hpp:12
State
Definition RequestParser.hpp:14
Definition Request.hpp:66
A data container for an HTTP response, managed via a fluent API.
Definition Response.hpp:33
The central request dispatcher (Facade).
Definition Router.hpp:20
void handleCgiResponseWrite()
Definition ClientHandler.cpp:343
int port_
Definition ClientHandler.hpp:95
http::Response response_
Definition ClientHandler.hpp:102
ClientHandler(int clientFd, int port, std::string const &clientAddr, http::Router const &)
Definition ClientHandler.cpp:77
virtual int getFd() const
Definition ClientHandler.cpp:103
bool headersSent_
Definition ClientHandler.hpp:97
void onCgiComplete()
Called by CGIHandler when the CGI script finishes (EOF).
Definition ClientHandler.cpp:304
void resetForNewRequest()
Resets the ClientHandler state for a new request (keep-alive).
Definition ClientHandler.cpp:426
CgiState cgiState_
Definition ClientHandler.hpp:110
std::string clientAddr_
Definition ClientHandler.hpp:96
void initiateDraining()
Definition ClientHandler.cpp:409
http::RequestParser reqParser_
Definition ClientHandler.hpp:103
virtual void handleEvent(uint32_t events)
Definition ClientHandler.cpp:105
ClientHandler(const ClientHandler &)
void handleRequestParsingState(http::RequestParser::State state)
Definition ClientHandler.cpp:160
std::time_t drainStartTime_
Definition ClientHandler.hpp:108
SendBuffer rspBuffer_
Definition ClientHandler.hpp:109
http::Router const & router_
Definition ClientHandler.hpp:100
bool isKeepAlive_
Definition ClientHandler.hpp:106
void handleRead()
Handles incoming data on the socket.
Definition ClientHandler.cpp:129
http::Request request_
Definition ClientHandler.hpp:101
void handleStaticResponseWrite()
Handles outgoing data on the socket.
Definition ClientHandler.cpp:261
void handleDraining()
Definition ClientHandler.cpp:144
void finalizeConnection()
Definition ClientHandler.cpp:393
void closeConnection()
Closes the connection and removes it from the dispatcher.
Definition ClientHandler.cpp:420
bool isDraining_
Definition ClientHandler.hpp:107
void setupStaticResponse()
Definition ClientHandler.cpp:238
void generateResponse()
Processes a fully parsed request to generate a response.
Definition ClientHandler.cpp:197
int clientFd_
Definition ClientHandler.hpp:94
static const size_t IO_BUFFER_SIZE
Definition ClientHandler.hpp:112
void handleError(http::HttpStatus)
Triggers an error response (e.g., 404, 500).
Definition ClientHandler.cpp:366
void pushToSendBuffer(const char *data, size_t length)
Pushes data into the client's send buffer. This is called by the CGIHandler when it reads from the pi...
Definition ClientHandler.cpp:291
bool setupCgiHandler(http::IResponseBody *body)
Definition ClientHandler.cpp:220
void onCgiHeadersParsed(http::Headers const &)
Notification that CGI headers have been fully parsed.
Definition ClientHandler.cpp:319
bool isSendBufferFull() const
Checks if the send buffer is over its high-water mark. This is the backpressure mechanism.
Definition ClientHandler.cpp:302
virtual ~ClientHandler()
Definition ClientHandler.cpp:94
ClientHandler & operator=(const ClientHandler &)
std::string getLogSignature() const
Definition ClientHandler.cpp:438
IEventHandler()
Definition IEventHandler.cpp:5
HttpStatus
Definition HttpStatus.hpp:11
Definition Request.hpp:13
Definition ClientHandler.hpp:83
bool isDone
Definition ClientHandler.hpp:85
void remove()
Definition ClientHandler.cpp:64
IEventHandler * handler
Definition ClientHandler.hpp:84
CgiState()
Definition ClientHandler.cpp:58
void clear()
Definition ClientHandler.cpp:60
Definition ClientHandler.hpp:70
SendStatus
Definition ClientHandler.hpp:78
@ SEND_ERROR
Definition ClientHandler.hpp:78
@ SEND_AGAIN
Definition ClientHandler.hpp:78
@ SEND_DONE
Definition ClientHandler.hpp:78
std::vector< char > buffer
Definition ClientHandler.hpp:71
SendStatus send(int clientFd)
Definition ClientHandler.cpp:36
size_t sent
Definition ClientHandler.hpp:72
bool isFullySent() const
Definition ClientHandler.cpp:32
SendBuffer(size_t initialCapacity)
Definition ClientHandler.cpp:23
void reset()
Definition ClientHandler.cpp:27