diff options
author | Christian Grothoff <christian@grothoff.org> | 2023-05-06 19:43:17 +0200 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2023-05-06 19:43:17 +0200 |
commit | 1f9427e1d9672b93577aea4c9d5a63575ee0b525 (patch) | |
tree | e2a2ce5bfa9b18a89e6d14f35e06955d9f403d1d /src/mhd | |
parent | 737b3338ed460b56096b9b016b727a0d34b30d23 (diff) |
add convenience function for content-length limiation
Diffstat (limited to 'src/mhd')
-rw-r--r-- | src/mhd/mhd_parsing.c | 42 |
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 */ |