[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[libmicrohttpd] 07/08: Simplified function for determining needs for rep
From: |
gnunet |
Subject: |
[libmicrohttpd] 07/08: Simplified function for determining needs for reply body and headers |
Date: |
Sun, 13 Mar 2022 18:33:30 +0100 |
This is an automated email from the git hooks/post-receive script.
karlson2k pushed a commit to branch master
in repository libmicrohttpd.
commit 8105f71cc5239b41e5a17e0b7d41bb92a234ee00
Author: Evgeny Grin (Karlson2k) <k2k@narod.ru>
AuthorDate: Sun Mar 13 16:43:32 2022 +0300
Simplified function for determining needs for reply body and headers
---
src/microhttpd/connection.c | 122 ++++++++++++++++++++++++--------------------
1 file changed, 68 insertions(+), 54 deletions(-)
diff --git a/src/microhttpd/connection.c b/src/microhttpd/connection.c
index 0280bdab..af2036a0 100644
--- a/src/microhttpd/connection.c
+++ b/src/microhttpd/connection.c
@@ -1674,79 +1674,90 @@ connection_switch_from_recv_to_send (struct
MHD_Connection *connection)
/**
- * Check whether reply body-specific headers (namely Content-Length,
- * Transfer-Encoding) are needed.
+ * This enum type describes requirements for reply body and reply bode-specific
+ * headers (namely Content-Length, Transfer-Encoding).
+ */
+enum replyBodyUse
+{
+ /**
+ * No reply body allowed.
+ * Reply body headers 'Content-Length:' or 'Transfer-Encoding: chunked' are
+ * not allowed as well.
+ */
+ RP_BODY_NONE = 0,
+
+ /**
+ * Do not send reply body.
+ * Reply body headers 'Content-Length:' or 'Transfer-Encoding: chunked' are
+ * allowed, but optional.
+ */
+ RP_BODY_HEADERS_ONLY = 1,
+
+ /**
+ * Send reply body and
+ * reply body headers 'Content-Length:' or 'Transfer-Encoding: chunked'.
+ * Reply body headers are required.
+ */
+ RP_BODY_SEND = 2
+};
+
+
+/**
+ * Check whether reply body must be used.
*
- * If reply body-specific headers are not needed then body itself
- * is not allowed as well.
- * When reply body-specific headers are needed, the body itself
- * can be present or not, depending on other conditions.
+ * If reply body is needed, it could be zero-sized.
*
* @param connection the connection to check
- * @return true if reply body-specific headers are needed,
- * false otherwise.
- * @sa is_reply_body_needed()
+ * @param rcode the response code
+ * @return enum value indicating whether response body can be used and
+ * whether response body length headers are allowed or required.
+ * @sa is_reply_body_header_needed()
*/
-static bool
-is_reply_body_headers_needed (struct MHD_Connection *connection)
+static enum replyBodyUse
+is_reply_body_needed (struct MHD_Connection *connection,
+ unsigned int rcode)
{
struct MHD_Connection *const c = connection; /**< a short alias */
- unsigned rcode; /**< the response code */
- mhd_assert (100 <= c->responseCode);
- mhd_assert (999 >= c->responseCode);
-
- rcode = (unsigned) c->responseCode;
+ mhd_assert (100 <= rcode);
+ mhd_assert (999 >= rcode);
if (199 >= rcode)
- return false;
+ return RP_BODY_NONE;
if (MHD_HTTP_NO_CONTENT == rcode)
- return false;
+ return RP_BODY_NONE;
+#if 0
+ /* This check is not needed as upgrade handler is used only with code 101 */
#ifdef UPGRADE_SUPPORT
- if (NULL != c->response->upgrade_handler)
- return false;
+ if (NULL != response->upgrade_handler)
+ return RP_BODY_NONE;
#endif /* UPGRADE_SUPPORT */
+#endif
+#if 0
+ /* CONNECT is not supported by MHD */
+ /* Successful responses for connect requests are filtered by
+ * MHD_queue_response() */
if ( (MHD_HTTP_MTHD_CONNECT == c->http_mthd) &&
(2 == rcode / 100) )
return false; /* Actually pass-through CONNECT is not supported by MHD */
+#endif
- return true;
-}
-
-
-/**
- * Check whether reply body must be used.
- *
- * If reply body is needed, it could be zero-sized.
- *
- * @param connection the connection to check
- * @return true if reply body must be used,
- * false otherwise
- * @sa is_reply_body_header_needed()
- */
-static bool
-is_reply_body_needed (struct MHD_Connection *connection)
-{
- struct MHD_Connection *const c = connection; /**< a short alias */
- unsigned rcode; /**< the response code */
-
- mhd_assert (100 <= c->responseCode);
- mhd_assert (999 >= c->responseCode);
-
- if (! is_reply_body_headers_needed (c))
- return false;
+ /* Reply body headers could be used.
+ * Check whether reply body itself must be used. */
if (MHD_HTTP_MTHD_HEAD == c->http_mthd)
- return false;
+ return RP_BODY_HEADERS_ONLY;
- rcode = (unsigned) c->responseCode;
if (MHD_HTTP_NOT_MODIFIED == rcode)
- return false;
+ return RP_BODY_HEADERS_ONLY;
- return true;
+ /* Reply body must be sent. The body may have zero length, but body size
+ * must be indicated by headers ('Content-Length:' or
+ * 'Transfer-Encoding: chunked'). */
+ return RP_BODY_SEND;
}
@@ -1763,6 +1774,7 @@ setup_reply_properties (struct MHD_Connection *connection)
{
struct MHD_Connection *const c = connection; /**< a short alias */
struct MHD_Response *const r = c->response; /**< a short alias */
+ enum replyBodyUse use_rp_body;
bool use_chunked;
mhd_assert (NULL != r);
@@ -1770,11 +1782,13 @@ setup_reply_properties (struct MHD_Connection
*connection)
/* ** Adjust reply properties ** */
c->keepalive = keepalive_possible (c);
- c->rp_props.use_reply_body_headers = is_reply_body_headers_needed (c);
- if (c->rp_props.use_reply_body_headers)
- c->rp_props.send_reply_body = is_reply_body_needed (c);
- else
- c->rp_props.send_reply_body = false;
+ use_rp_body = is_reply_body_needed (c, c->responseCode);
+ c->rp_props.send_reply_body = (use_rp_body > RP_BODY_HEADERS_ONLY);
+ c->rp_props.use_reply_body_headers = (use_rp_body >= RP_BODY_HEADERS_ONLY);
+
+#ifdef UPGRADE_SUPPORT
+ mhd_assert ((NULL == r->upgrade_handler) || (RP_BODY_NONE == use_rp_body));
+#endif /* UPGRADE_SUPPORT */
if (c->rp_props.use_reply_body_headers)
{
--
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.
- [libmicrohttpd] branch master updated (1a46bfd6 -> f2565a62), gnunet, 2022/03/13
- [libmicrohttpd] 04/08: Disallowed successful responses for CONNECT requests, gnunet, 2022/03/13
- [libmicrohttpd] 03/08: Added warning in log if application-defined Content-Length is used, gnunet, 2022/03/13
- [libmicrohttpd] 02/08: Added separate internal "responseIcy" flag., gnunet, 2022/03/13
- [libmicrohttpd] 01/08: upgrade response: set response size to zero, gnunet, 2022/03/13
- [libmicrohttpd] 06/08: MHD_queue_response(): refuse 101 code when not supported, gnunet, 2022/03/13
- [libmicrohttpd] 05/08: MHD_queue_response(): clarified log message, gnunet, 2022/03/13
- [libmicrohttpd] 07/08: Simplified function for determining needs for reply body and headers,
gnunet <=
- [libmicrohttpd] 08/08: MHD_set_response_options(): check whether the new flags could be used, gnunet, 2022/03/13