[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[libmicrohttpd] 02/03: Moved reset of connection to dedicated function
From: |
gnunet |
Subject: |
[libmicrohttpd] 02/03: Moved reset of connection to dedicated function |
Date: |
Thu, 29 Jul 2021 20:44:50 +0200 |
This is an automated email from the git hooks/post-receive script.
karlson2k pushed a commit to branch master
in repository libmicrohttpd.
commit f7db31373e5805ed6541ff585a1d58e4a2835d04
Author: Evgeny Grin (Karlson2k) <k2k@narod.ru>
AuthorDate: Thu Jul 29 21:10:36 2021 +0300
Moved reset of connection to dedicated function
---
src/microhttpd/connection.c | 152 +++++++++++++++++++++++++-------------------
1 file changed, 86 insertions(+), 66 deletions(-)
diff --git a/src/microhttpd/connection.c b/src/microhttpd/connection.c
index ba9cb498..3e9b676c 100644
--- a/src/microhttpd/connection.c
+++ b/src/microhttpd/connection.c
@@ -3726,6 +3726,88 @@ cleanup_connection (struct MHD_Connection *connection)
}
+/**
+ * Reset connection after request-reply cycle.
+ * @param connection the connection to process
+ * @param reuse the flag to choose whether to close connection or
+ * prepare connection for the next request processing
+ */
+static void
+connection_reset (struct MHD_Connection *connection,
+ bool reuse)
+{
+ struct MHD_Connection *const c = connection; /**< a short alias */
+ struct MHD_Daemon *const d = connection->daemon;
+
+ if (! reuse)
+ {
+ /* Next function will destroy response, notify client,
+ * and set state "CLOSED" */
+ MHD_connection_close_ (connection,
+ MHD_REQUEST_TERMINATED_COMPLETED_OK);
+ MHD_pool_destroy (connection->pool);
+ c->pool = NULL;
+ c->read_buffer = NULL;
+ c->read_buffer_size = 0;
+ c->read_buffer_offset = 0;
+ }
+ else
+ {
+ /* Reset connection to process the next request */
+ size_t new_read_buf_size;
+
+ if ( (NULL != d->notify_completed) &&
+ (c->client_aware) )
+ d->notify_completed (d->notify_completed_cls,
+ c,
+ &c->client_context,
+ MHD_REQUEST_TERMINATED_COMPLETED_OK);
+ c->client_aware = false;
+
+ if (NULL != c->response)
+ MHD_destroy_response (c->response);
+ c->response = NULL;
+ c->version = NULL;
+ c->http_ver = MHD_HTTP_VER_UNKNOWN;
+ c->last = NULL;
+ c->colon = NULL;
+ c->header_size = 0;
+ c->keepalive = MHD_CONN_KEEPALIVE_UNKOWN;
+ /* Reset the read buffer to the starting size,
+ preserving the bytes we have already read. */
+ new_read_buf_size = c->daemon->pool_size / 2;
+ if (c->read_buffer_offset > new_read_buf_size)
+ new_read_buf_size = c->read_buffer_offset;
+
+ connection->read_buffer
+ = MHD_pool_reset (c->pool,
+ c->read_buffer,
+ c->read_buffer_offset,
+ new_read_buf_size);
+ c->read_buffer_size = new_read_buf_size;
+ c->continue_message_write_offset = 0;
+ c->responseCode = 0;
+ c->headers_received = NULL;
+ c->headers_received_tail = NULL;
+ c->response_write_position = 0;
+ c->have_chunked_upload = false;
+ c->current_chunk_size = 0;
+ c->current_chunk_offset = 0;
+ c->method = NULL;
+ c->http_mthd = MHD_HTTP_MTHD_NO_METHOD;
+ c->url = NULL;
+ c->write_buffer = NULL;
+ c->write_buffer_size = 0;
+ c->write_buffer_send_offset = 0;
+ c->write_buffer_append_offset = 0;
+ /* iov (if any) was deallocated by MHD_pool_reset */
+ memset (&connection->resp_iov, 0, sizeof(connection->resp_iov));
+ c->state = MHD_CONNECTION_INIT;
+ }
+ connection->client_context = NULL;
+}
+
+
/**
* This function was created to handle per-connection processing that
* has to happen even if the socket cannot be read or written to.
@@ -4134,72 +4216,10 @@ MHD_connection_handle_idle (struct MHD_Connection
*connection)
/* FIXME: maybe partially reset memory pool? */
continue;
}
- MHD_destroy_response (connection->response);
- connection->response = NULL;
- if ( (NULL != daemon->notify_completed) &&
- (connection->client_aware) )
- {
- daemon->notify_completed (daemon->notify_completed_cls,
- connection,
- &connection->client_context,
- MHD_REQUEST_TERMINATED_COMPLETED_OK);
- }
- connection->client_aware = false;
- if ( (MHD_CONN_USE_KEEPALIVE != connection->keepalive) ||
- (connection->read_closed) )
- {
- /* have to close for some reason */
- MHD_connection_close_ (connection,
- MHD_REQUEST_TERMINATED_COMPLETED_OK);
- MHD_pool_destroy (connection->pool);
- connection->pool = NULL;
- connection->read_buffer = NULL;
- connection->read_buffer_size = 0;
- connection->read_buffer_offset = 0;
- }
- else
- {
- /* can try to keep-alive */
- size_t new_read_buf_size;
-
- connection->version = NULL;
- connection->http_ver = MHD_HTTP_VER_UNKNOWN;
- connection->state = MHD_CONNECTION_INIT;
- connection->last = NULL;
- connection->colon = NULL;
- connection->header_size = 0;
- connection->keepalive = MHD_CONN_KEEPALIVE_UNKOWN;
- /* Reset the read buffer to the starting size,
- preserving the bytes we have already read. */
- if (connection->read_buffer_offset > connection->daemon->pool_size / 2)
- new_read_buf_size = connection->read_buffer_offset;
- else
- new_read_buf_size = connection->daemon->pool_size / 2;
- connection->read_buffer
- = MHD_pool_reset (connection->pool,
- connection->read_buffer,
- connection->read_buffer_offset,
- new_read_buf_size);
- connection->read_buffer_size = new_read_buf_size;
- }
- connection->client_context = NULL;
- connection->continue_message_write_offset = 0;
- connection->responseCode = 0;
- connection->headers_received = NULL;
- connection->headers_received_tail = NULL;
- connection->response_write_position = 0;
- connection->have_chunked_upload = false;
- connection->current_chunk_size = 0;
- connection->current_chunk_offset = 0;
- connection->method = NULL;
- connection->http_mthd = MHD_HTTP_MTHD_NO_METHOD;
- connection->url = NULL;
- connection->write_buffer = NULL;
- connection->write_buffer_size = 0;
- connection->write_buffer_send_offset = 0;
- connection->write_buffer_append_offset = 0;
- /* iov (if any) was deallocated by MHD_pool_reset */
- memset (&connection->resp_iov, 0, sizeof(connection->resp_iov));
+ /* Reset connection after complete reply */
+ connection_reset (connection,
+ MHD_CONN_USE_KEEPALIVE == connection->keepalive &&
+ ! connection->read_closed);
continue;
case MHD_CONNECTION_CLOSED:
cleanup_connection (connection);
--
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.