gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[libmicrohttpd] 03/05: Added new connection flag "stop_with_error".


From: gnunet
Subject: [libmicrohttpd] 03/05: Added new connection flag "stop_with_error".
Date: Sat, 21 Aug 2021 17:41:25 +0200

This is an automated email from the git hooks/post-receive script.

karlson2k pushed a commit to branch master
in repository libmicrohttpd.

commit 4fb57ae153ddd856c80885425eb2321cd95a2cf0
Author: Evgeny Grin (Karlson2k) <k2k@narod.ru>
AuthorDate: Sat Aug 21 16:39:35 2021 +0300

    Added new connection flag "stop_with_error".
    
    Stopped usage of "read_close" flag when read hasn't been closed.
---
 src/microhttpd/connection.c | 59 ++++++++++++++++++++++++---------------------
 src/microhttpd/internal.h   | 12 +++++++++
 2 files changed, 43 insertions(+), 28 deletions(-)

diff --git a/src/microhttpd/connection.c b/src/microhttpd/connection.c
index a01ca32e..7b61916f 100644
--- a/src/microhttpd/connection.c
+++ b/src/microhttpd/connection.c
@@ -829,6 +829,7 @@ connection_close_error (struct MHD_Connection *connection,
                         const char *emsg)
 {
 #ifdef HAVE_MESSAGES
+  connection->stop_with_error = true;
   if (NULL != emsg)
     MHD_DLOG (connection->daemon,
               "%s\n",
@@ -865,7 +866,8 @@ connection_close_error_check (struct MHD_Connection 
*connection,
 {
   if ( (NULL != connection->response) &&
        (400 <= connection->responseCode) &&
-       (connection->read_closed) &&
+       (NULL == connection->response->crc) && /* Static response only! */
+       (connection->stop_with_error) &&
        (MHD_CONNECTION_HEADERS_SENDING == connection->state) )
     return; /* An error response was already queued */
 
@@ -1188,9 +1190,7 @@ keepalive_possible (struct MHD_Connection *connection)
   }
 #endif /* UPGRADE_SUPPORT */
 
-  /* TODO: use additional flags, like "error_closure" or
-   * "! read_completed" */
-  if (c->read_closed)
+  if ((c->read_closed) || (c->stop_with_error))
     return MHD_CONN_MUST_CLOSE;
 
   if (0 != (r->flags & MHD_RF_HTTP_1_0_COMPATIBLE_STRICT))
@@ -2126,7 +2126,7 @@ transmit_error_response_len (struct MHD_Connection 
*connection,
   enum MHD_Result iret;
 
   connection->state = MHD_CONNECTION_FOOTERS_RECEIVED;
-  connection->read_closed = true;
+  connection->stop_with_error = true;
   if (0 != connection->read_buffer_size)
   {
     /* Read buffer is not needed anymore, discard it
@@ -2254,7 +2254,7 @@ MHD_connection_update_event_loop_info (struct 
MHD_Connection *connection)
                                           REQUEST_TOO_BIG);
         continue;
       }
-      if (! connection->read_closed)
+      if (! connection->stop_with_error)
         connection->event_loop_info = MHD_EVENT_LOOP_INFO_READ;
       else
         connection->event_loop_info = MHD_EVENT_LOOP_INFO_BLOCK;
@@ -2294,7 +2294,7 @@ MHD_connection_update_event_loop_info (struct 
MHD_Connection *connection)
         }
       }
       if ( (connection->read_buffer_offset < connection->read_buffer_size) &&
-           (! connection->read_closed) )
+           (! connection->stop_with_error) )
         connection->event_loop_info = MHD_EVENT_LOOP_INFO_READ;
       else
         connection->event_loop_info = MHD_EVENT_LOOP_INFO_BLOCK;
@@ -2303,7 +2303,7 @@ MHD_connection_update_event_loop_info (struct 
MHD_Connection *connection)
     case MHD_CONNECTION_FOOTER_PART_RECEIVED:
       /* while reading footers, we always grow the
          read buffer if needed, no size-check required */
-      if (connection->read_closed)
+      if (connection->stop_with_error)
       {
         CONNECTION_CLOSE_ERROR (connection,
                                 NULL);
@@ -2930,8 +2930,9 @@ process_request_body (struct MHD_Connection *connection)
         {
           /* malformed encoding */
           CONNECTION_CLOSE_ERROR (connection,
-                                  _ (
-                                    "Received malformed HTTP request (bad 
chunked encoding). Closing connection."));
+                                  _ ("Received malformed HTTP request " \
+                                     "(bad chunked encoding). " \
+                                     "Closing connection."));
           return;
         }
         available -= i;
@@ -3009,8 +3010,9 @@ process_request_body (struct MHD_Connection *connection)
         {
           /* malformed encoding */
           CONNECTION_CLOSE_ERROR (connection,
-                                  _ (
-                                    "Received malformed HTTP request (bad 
chunked encoding). Closing connection."));
+                                  _ ("Received malformed HTTP request " \
+                                     "(bad chunked encoding). " \
+                                     "Closing connection."));
           return;
         }
         /* skip 2nd part of line feed */
@@ -3065,8 +3067,8 @@ process_request_body (struct MHD_Connection *connection)
     {
       /* serious internal error, close connection */
       CONNECTION_CLOSE_ERROR (connection,
-                              _ (
-                                "Application reported internal error, closing 
connection."));
+                              _ ("Application reported internal error, " \
+                                 "closing connection."));
       return;
     }
     if (left_unprocessed > to_be_processed)
@@ -3089,8 +3091,8 @@ process_request_body (struct MHD_Connection *connection)
       if ( (0 != (daemon->options & MHD_USE_INTERNAL_POLLING_THREAD)) &&
            (! connection->suspended) )
         MHD_DLOG (daemon,
-                  _ (
-                    "WARNING: incomplete upload processing and connection not 
suspended may result in hung connection.\n"));
+                  _ ("WARNING: incomplete upload processing and connection " \
+                     "not suspended may result in hung connection.\n"));
 #endif
     }
     processed_size = to_be_processed - left_unprocessed;
@@ -3326,7 +3328,7 @@ parse_connection_headers (struct MHD_Connection 
*connection)
 
     /* die, http 1.1 request without host and we are pedantic */
     connection->state = MHD_CONNECTION_FOOTERS_RECEIVED;
-    connection->read_closed = true;
+    connection->stop_with_error = true;
 #ifdef HAVE_MESSAGES
     MHD_DLOG (connection->daemon,
               _ ("Received HTTP 1.1 request without `Host' header.\n"));
@@ -3535,7 +3537,7 @@ MHD_connection_handle_read (struct MHD_Connection 
*connection)
   case MHD_CONNECTION_BODY_RECEIVED:
   case MHD_CONNECTION_FOOTER_PART_RECEIVED:
     /* nothing to do but default action */
-    if (connection->read_closed)
+    if ((connection->read_closed) || (connection->stop_with_error))
     {
       MHD_connection_close_ (connection,
                              MHD_REQUEST_TERMINATED_READ_ERROR);
@@ -4111,7 +4113,7 @@ MHD_connection_handle_idle (struct MHD_Connection 
*connection)
       {
         if (MHD_CONNECTION_INIT != connection->state)
           continue;
-        if (connection->read_closed)
+        if (connection->stop_with_error)
         {
           CONNECTION_CLOSE_ERROR (connection,
                                   NULL);
@@ -4137,7 +4139,7 @@ MHD_connection_handle_idle (struct MHD_Connection 
*connection)
       {
         if (MHD_CONNECTION_URL_RECEIVED != connection->state)
           continue;
-        if (connection->read_closed)
+        if (connection->stop_with_error)
         {
           CONNECTION_CLOSE_ERROR (connection,
                                   NULL);
@@ -4169,7 +4171,7 @@ MHD_connection_handle_idle (struct MHD_Connection 
*connection)
       {
         if (connection->state != MHD_CONNECTION_HEADER_PART_RECEIVED)
           continue;
-        if (connection->read_closed)
+        if (connection->stop_with_error)
         {
           CONNECTION_CLOSE_ERROR (connection,
                                   NULL);
@@ -4216,7 +4218,7 @@ MHD_connection_handle_idle (struct MHD_Connection 
*connection)
         /* we refused (no upload allowed!) */
         connection->remaining_upload_size = 0;
         /* force close, in case client still tries to upload... */
-        connection->read_closed = true;
+        connection->stop_with_error = true;
       }
       connection->state = (0 == connection->remaining_upload_size)
                           ? MHD_CONNECTION_FOOTERS_RECEIVED
@@ -4242,10 +4244,10 @@ MHD_connection_handle_idle (struct MHD_Connection 
*connection)
       if ( (0 == connection->remaining_upload_size) ||
            ( (MHD_SIZE_UNKNOWN == connection->remaining_upload_size) &&
              (0 == connection->read_buffer_offset) &&
-             (connection->read_closed) ) )
+             (connection->stop_with_error) ) )
       {
         if ( (connection->have_chunked_upload) &&
-             (! connection->read_closed) )
+             (! connection->stop_with_error) )
           connection->state = MHD_CONNECTION_BODY_RECEIVED;
         else
           connection->state = MHD_CONNECTION_FOOTERS_RECEIVED;
@@ -4261,7 +4263,7 @@ MHD_connection_handle_idle (struct MHD_Connection 
*connection)
       {
         if (connection->state != MHD_CONNECTION_BODY_RECEIVED)
           continue;
-        if (connection->read_closed)
+        if (connection->stop_with_error)
         {
           CONNECTION_CLOSE_ERROR (connection,
                                   NULL);
@@ -4293,7 +4295,7 @@ MHD_connection_handle_idle (struct MHD_Connection 
*connection)
       {
         if (connection->state != MHD_CONNECTION_FOOTER_PART_RECEIVED)
           continue;
-        if (connection->read_closed)
+        if (connection->stop_with_error)
         {
           CONNECTION_CLOSE_ERROR (connection,
                                   NULL);
@@ -4471,7 +4473,8 @@ MHD_connection_handle_idle (struct MHD_Connection 
*connection)
       /* Reset connection after complete reply */
       connection_reset (connection,
                         MHD_CONN_USE_KEEPALIVE == connection->keepalive &&
-                        ! connection->read_closed);
+                        ! connection->read_closed &&
+                        ! connection->stop_with_error);
       continue;
     case MHD_CONNECTION_CLOSED:
       cleanup_connection (connection);
@@ -4881,7 +4884,7 @@ MHD_queue_response (struct MHD_Connection *connection,
   {
     /* response was queued "early", refuse to read body / footers or
        further requests! */
-    connection->read_closed = true;
+    connection->stop_with_error = true;
     connection->state = MHD_CONNECTION_FOOTERS_RECEIVED;
     connection->remaining_upload_size = 0;
   }
diff --git a/src/microhttpd/internal.h b/src/microhttpd/internal.h
index 60d1862d..a2a454f1 100644
--- a/src/microhttpd/internal.h
+++ b/src/microhttpd/internal.h
@@ -1186,6 +1186,18 @@ struct MHD_Connection
    */
   bool read_closed;
 
+  /**
+   * Some error happens during processing the connection therefore this
+   * connection must be closed.
+   * The error may come from the client side (like wrong request format),
+   * from the application side (like data callback returned error), or from
+   * the OS side (like out-of-memory).
+   * The connection cannot be reused for additional requests as the current
+   * request may be incompletely read and it is unclear where is the initial
+   * byte of the next request.
+   */
+  bool stop_with_error;
+
 #if defined(MHD_USE_POSIX_THREADS) || defined(MHD_USE_W32_THREADS)
   /**
    * Set to `true` if the thread has been joined.

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]