Fixed close connection bug

This commit is contained in:
Sam Stevens
2014-10-02 23:14:10 +01:00
parent c74127b2af
commit d50bc676ce
3 changed files with 24 additions and 7 deletions

View File

@@ -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

View File

@@ -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);
}
}

View File

@@ -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);
}