summaryrefslogtreecommitdiff
path: root/src/mhd
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2023-05-06 19:43:17 +0200
committerChristian Grothoff <christian@grothoff.org>2023-05-06 19:43:17 +0200
commit1f9427e1d9672b93577aea4c9d5a63575ee0b525 (patch)
treee2a2ce5bfa9b18a89e6d14f35e06955d9f403d1d /src/mhd
parent737b3338ed460b56096b9b016b727a0d34b30d23 (diff)
downloadexchange-1f9427e1d9672b93577aea4c9d5a63575ee0b525.tar.gz
exchange-1f9427e1d9672b93577aea4c9d5a63575ee0b525.tar.bz2
exchange-1f9427e1d9672b93577aea4c9d5a63575ee0b525.zip
add convenience function for content-length limiation
Diffstat (limited to 'src/mhd')
-rw-r--r--src/mhd/mhd_parsing.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/src/mhd/mhd_parsing.c b/src/mhd/mhd_parsing.c
index e76450831..b047df7d3 100644
--- a/src/mhd/mhd_parsing.c
+++ b/src/mhd/mhd_parsing.c
@@ -350,4 +350,46 @@ TALER_MHD_parse_json_array (struct MHD_Connection *connection,
}
+enum GNUNET_GenericReturnValue
+TALER_MHD_check_content_length_ (struct MHD_Connection *connection,
+ unsigned long long max_len)
+{
+ const char *cl;
+ unsigned long long cv;
+ char dummy;
+
+ /* Maybe check for maximum upload size
+ and refuse requests if they are just too big. */
+ cl = MHD_lookup_connection_value (connection,
+ MHD_HEADER_KIND,
+ MHD_HTTP_HEADER_CONTENT_LENGTH);
+ if (NULL == cl)
+ return GNUNET_OK;
+ if (1 != sscanf (cl,
+ "%llu%c",
+ &cv,
+ &dummy))
+ {
+ /* Not valid HTTP request, just close connection. */
+ GNUNET_break_op (0);
+ return (MHD_YES ==
+ TALER_MHD_reply_with_error (connection,
+ MHD_HTTP_BAD_REQUEST,
+ TALER_EC_GENERIC_PARAMETER_MALFORMED,
+ MHD_HTTP_HEADER_CONTENT_LENGTH))
+ ? GNUNET_NO
+ : GNUNET_SYSERR;
+ }
+ if (cv > TALER_MHD_REQUEST_BUFFER_MAX)
+ {
+ GNUNET_break_op (0);
+ return (MHD_YES ==
+ TALER_MHD_reply_request_too_large (connection))
+ ? GNUNET_NO
+ : GNUNET_SYSERR;
+ }
+ return GNUNET_OK;
+}
+
+
/* end of mhd_parsing.c */