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