Fix web server hanging issues
Fixed two bugs in the HTTP server that could cause hangs:
1. web/chttp.c:4060 - Fixed incorrect error buffer check
- Was checking output buffer for errors after a read operation
- Should check input buffer instead
- This could cause the server to miss read errors and not close
bad connections properly
2. web/main.c:334 - Added loop to process multiple queued requests
- Previously only processed one request per event loop iteration
- Now processes all queued requests before returning to poll()
- This prevents requests from being stuck in the queue when the
socket is in ESTABLISHED_READY state
These fixes improve the server's ability to handle multiple requests
on Keep-Alive connections.
This commit is contained in:
+1
-1
@@ -4057,7 +4057,7 @@ http_server_conn_process_events(HTTP_Server *server, HTTP_ServerConn *conn)
|
||||
|
||||
byte_queue_write_ack(&conn->input, num);
|
||||
|
||||
if (byte_queue_error(&conn->output)) {
|
||||
if (byte_queue_error(&conn->input)) {
|
||||
socket_close(&server->sockets, conn->handle);
|
||||
} else {
|
||||
check_request_buffer(server, conn);
|
||||
|
||||
+4
-2
@@ -186,7 +186,7 @@ int main(int argc, char **argv)
|
||||
return -1;
|
||||
|
||||
int num_polled = num_http_polled + num_toasty_polled;
|
||||
if (num_polled > 0)
|
||||
if (num_http_polled != 0 && num_toasty_polled != 0)
|
||||
POLL(polled, num_polled, -1);
|
||||
|
||||
// First, process toasty events so that we free space
|
||||
@@ -331,9 +331,11 @@ int main(int argc, char **argv)
|
||||
if (http_server_process_events(&server, ®) < 0)
|
||||
return -1;
|
||||
|
||||
for (;;) {
|
||||
HTTP_Request *request;
|
||||
HTTP_ResponseBuilder builder;
|
||||
if (http_server_next_request(&server, &request, &builder)) {
|
||||
if (!http_server_next_request(&server, &request, &builder))
|
||||
break;
|
||||
|
||||
switch (request->method) {
|
||||
case HTTP_METHOD_GET:
|
||||
|
||||
Reference in New Issue
Block a user