Read until EAGAIN
To prepare for EPOLLET
This commit is contained in:
+1
-1
@@ -153,7 +153,7 @@ void Connection::send_response(ProtocolHandle handle,
|
||||
}
|
||||
}
|
||||
|
||||
int Connection::readBytes(char *buf, size_t buffer_size) {
|
||||
int Connection::read_bytes(char *buf, size_t buffer_size) {
|
||||
int r;
|
||||
for (;;) {
|
||||
r = read(fd_, buf, buffer_size);
|
||||
|
||||
+1
-1
@@ -279,7 +279,7 @@ private:
|
||||
friend Ref<T> make_ref(Args &&...args);
|
||||
|
||||
// Networking interface - only accessible by Server
|
||||
int readBytes(char *buf, size_t buffer_size);
|
||||
int read_bytes(char *buf, size_t buffer_size);
|
||||
enum WriteBytesResult {
|
||||
Error = 1 << 0,
|
||||
Progress = 1 << 1,
|
||||
|
||||
+22
-13
@@ -409,21 +409,30 @@ void Server::process_connection_reads(Ref<Connection> &conn, int events) {
|
||||
auto buf_size = config_.server.read_buffer_size;
|
||||
g_read_buffer.resize(buf_size);
|
||||
char *buf = g_read_buffer.data();
|
||||
int r = conn->readBytes(buf, buf_size);
|
||||
|
||||
if (r < 0) {
|
||||
// Error or EOF - connection should be closed
|
||||
close_connection(conn);
|
||||
return;
|
||||
// Once we do EPOLLET we must drain the socket until read returns EAGAIN.
|
||||
for (;;) {
|
||||
int r = conn->read_bytes(buf, buf_size);
|
||||
|
||||
if (r < 0) {
|
||||
// Error or EOF - connection should be closed
|
||||
close_connection(conn);
|
||||
return;
|
||||
}
|
||||
|
||||
if (r == 0) {
|
||||
// No data available (EAGAIN) - read side drained
|
||||
return;
|
||||
}
|
||||
|
||||
// Call handler with connection reference - server retains ownership.
|
||||
handler_.on_data_arrived(std::string_view{buf, size_t(r)}, *conn);
|
||||
|
||||
// The connection may have been closed by the handler; stop reading.
|
||||
if (!conn) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (r == 0) {
|
||||
// No data available (EAGAIN) - skip read processing but continue
|
||||
return;
|
||||
}
|
||||
|
||||
// Call handler with connection reference - server retains ownership
|
||||
handler_.on_data_arrived(std::string_view{buf, size_t(r)}, *conn);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user