Fixed close connection bug
This commit is contained in:
@@ -1,10 +1,10 @@
|
||||
[Server]
|
||||
name=test.example.com
|
||||
admin=sam@xnet.tk
|
||||
listen=8080
|
||||
listen=8081
|
||||
|
||||
[Host]
|
||||
name=orion.local
|
||||
enabled=yes
|
||||
default=yes
|
||||
serve=public_html
|
||||
serve=public_html
|
||||
|
||||
@@ -146,14 +146,16 @@ http_response* server_process_request(config_server* config, http_request *reque
|
||||
free(filepath);
|
||||
|
||||
bool close_connection = false;
|
||||
bool close_requested = false;
|
||||
//Check to see if client requested the connection be closed
|
||||
http_header* request_connection = http_header_list_get(request->headers, HEADER_CONNECTION);
|
||||
if (request_connection != NULL && strcasecmp(request_connection->content, "close") == 0) {
|
||||
close_connection = true;
|
||||
close_requested = true;
|
||||
}
|
||||
//Close a http/1.0 unless the client requested keep-alive
|
||||
if (close_connection == false && request->req->version == HTTP10 && request_connection != NULL) {
|
||||
if (strcasecmp(request_connection->content, "Keep-Alive") != 0) {
|
||||
if (close_connection == false && request->req->version == HTTP10 && close_requested == false) {
|
||||
if (request_connection == NULL || strcasecmp(request_connection->content, "Keep-Alive") != 0) {
|
||||
close_connection = true;
|
||||
}
|
||||
}
|
||||
@@ -348,4 +350,4 @@ void server_file_result_delete(server_file_result *result) {
|
||||
free(result->error_text);
|
||||
free(result->path);
|
||||
free(result);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -81,14 +81,29 @@ void* server_loop_write(void* arg) {
|
||||
}
|
||||
}
|
||||
if (response != NULL && response->send_status == SEND_DONE) {
|
||||
|
||||
bool last = false;
|
||||
http_header *connection_header = http_header_list_get(response->headers, HEADER_CONNECTION);
|
||||
if (connection_header != NULL && strcasecmp(connection_header->content, "close") == 0) {
|
||||
skt_close(conn->skt);
|
||||
last = true;
|
||||
}
|
||||
|
||||
http_response_list_remove(conn->pending_responses, response);
|
||||
http_response_delete(response);
|
||||
response = http_response_list_next(conn->pending_responses);
|
||||
if (last == true) {
|
||||
response = NULL;
|
||||
goto FINSIHED;
|
||||
} else {
|
||||
response = http_response_list_next(conn->pending_responses);
|
||||
}
|
||||
}
|
||||
}
|
||||
} //response != null
|
||||
} //while response != null
|
||||
}//if no pending writes
|
||||
|
||||
FINSIHED:
|
||||
|
||||
CONN_UNLOCK(conn);
|
||||
queue_return_item(th->pool->queue, item, item->blocked == false);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user