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);
|
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);
|
socket_close(&server->sockets, conn->handle);
|
||||||
} else {
|
} else {
|
||||||
check_request_buffer(server, conn);
|
check_request_buffer(server, conn);
|
||||||
|
|||||||
+4
-2
@@ -186,7 +186,7 @@ int main(int argc, char **argv)
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
int num_polled = num_http_polled + num_toasty_polled;
|
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);
|
POLL(polled, num_polled, -1);
|
||||||
|
|
||||||
// First, process toasty events so that we free space
|
// 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)
|
if (http_server_process_events(&server, ®) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
HTTP_Request *request;
|
HTTP_Request *request;
|
||||||
HTTP_ResponseBuilder builder;
|
HTTP_ResponseBuilder builder;
|
||||||
if (http_server_next_request(&server, &request, &builder)) {
|
if (!http_server_next_request(&server, &request, &builder))
|
||||||
|
break;
|
||||||
|
|
||||||
switch (request->method) {
|
switch (request->method) {
|
||||||
case HTTP_METHOD_GET:
|
case HTTP_METHOD_GET:
|
||||||
|
|||||||
Reference in New Issue
Block a user