libmicrohttpd

HTTP/1.x server C library (MHD 1.x, stable)
Log | Files | Refs | Submodules | README | LICENSE

commit 003c29eb4b8171776006bc42e6e1c4a4fcbfff6c
parent 6884fa83cfcfe12f04b1121268894c2a57d9c954
Author: Evgeny Grin (Karlson2k) <k2k@narod.ru>
Date:   Mon, 13 Jun 2022 18:26:53 +0300

postprocessor.h: added new internal header

Diffstat:
Msrc/microhttpd/Makefile.am | 2+-
Msrc/microhttpd/postprocessor.c | 216+------------------------------------------------------------------------------
Asrc/microhttpd/postprocessor.h | 246+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mw32/common/libmicrohttpd-files.vcxproj | 1+
Mw32/common/libmicrohttpd-filters.vcxproj | 3+++
5 files changed, 252 insertions(+), 216 deletions(-)

diff --git a/src/microhttpd/Makefile.am b/src/microhttpd/Makefile.am @@ -158,7 +158,7 @@ endif if HAVE_POSTPROCESSOR libmicrohttpd_la_SOURCES += \ - postprocessor.c + postprocessor.c postprocessor.h endif if HAVE_ANYAUTH diff --git a/src/microhttpd/postprocessor.c b/src/microhttpd/postprocessor.c @@ -24,6 +24,7 @@ * @author Karlson2k (Evgeny Grin) */ +#include "postprocessor.h" #include "internal.h" #include "mhd_str.h" #include "mhd_compat.h" @@ -36,221 +37,6 @@ */ #define XBUF_SIZE 512 -/** - * States in the PP parser's state machine. - */ -enum PP_State -{ - /* general states */ - PP_Error, - PP_Done, - PP_Init, - PP_NextBoundary, - - /* url encoding-states */ - PP_ProcessKey, - PP_ProcessValue, - PP_Callback, - - /* post encoding-states */ - PP_ProcessEntryHeaders, - PP_PerformCheckMultipart, - PP_ProcessValueToBoundary, - PP_PerformCleanup, - - /* nested post-encoding states */ - PP_Nested_Init, - PP_Nested_PerformMarking, - PP_Nested_ProcessEntryHeaders, - PP_Nested_ProcessValueToBoundary, - PP_Nested_PerformCleanup - -}; - - -enum RN_State -{ - /** - * No RN-preprocessing in this state. - */ - RN_Inactive = 0, - - /** - * If the next character is CR, skip it. Otherwise, - * just go inactive. - */ - RN_OptN = 1, - - /** - * Expect LFCR (and only LFCR). As always, we also - * expect only LF or only CR. - */ - RN_Full = 2, - - /** - * Expect either LFCR or '--'LFCR. If '--'LFCR, transition into dash-state - * for the main state machine - */ - RN_Dash = 3, - - /** - * Got a single dash, expect second dash. - */ - RN_Dash2 = 4 -}; - - -/** - * Bits for the globally known fields that - * should not be deleted when we exit the - * nested state. - */ -enum NE_State -{ - NE_none = 0, - NE_content_name = 1, - NE_content_type = 2, - NE_content_filename = 4, - NE_content_transfer_encoding = 8 -}; - - -/** - * Internal state of the post-processor. Note that the fields - * are sorted by type to enable optimal packing by the compiler. - */ -struct MHD_PostProcessor -{ - - /** - * The connection for which we are doing - * POST processing. - */ - struct MHD_Connection *connection; - - /** - * Function to call with POST data. - */ - MHD_PostDataIterator ikvi; - - /** - * Extra argument to ikvi. - */ - void *cls; - - /** - * Encoding as given by the headers of the connection. - */ - const char *encoding; - - /** - * Primary boundary (points into encoding string) - */ - const char *boundary; - - /** - * Nested boundary (if we have multipart/mixed encoding). - */ - char *nested_boundary; - - /** - * Pointer to the name given in disposition. - */ - char *content_name; - - /** - * Pointer to the (current) content type. - */ - char *content_type; - - /** - * Pointer to the (current) filename. - */ - char *content_filename; - - /** - * Pointer to the (current) encoding. - */ - char *content_transfer_encoding; - - /** - * Value data left over from previous iteration. - */ - char xbuf[2]; - - /** - * Size of our buffer for the key. - */ - size_t buffer_size; - - /** - * Current position in the key buffer. - */ - size_t buffer_pos; - - /** - * Current position in @e xbuf. - */ - size_t xbuf_pos; - - /** - * Current offset in the value being processed. - */ - uint64_t value_offset; - - /** - * strlen(boundary) -- if boundary != NULL. - */ - size_t blen; - - /** - * strlen(nested_boundary) -- if nested_boundary != NULL. - */ - size_t nlen; - - /** - * Do we have to call the 'ikvi' callback when processing the - * multipart post body even if the size of the payload is zero? - * Set to #MHD_YES whenever we parse a new multiparty entry header, - * and to #MHD_NO the first time we call the 'ikvi' callback. - * Used to ensure that we do always call 'ikvi' even if the - * payload is empty (but not more than once). - */ - bool must_ikvi; - - /** - * Set if we still need to run the unescape logic - * on the key allocated at the end of this struct. - */ - bool must_unescape_key; - - /** - * State of the parser. - */ - enum PP_State state; - - /** - * Side-state-machine: skip LRCR (or just LF). - * Set to 0 if we are not in skip mode. Set to 2 - * if a LFCR is expected, set to 1 if a CR should - * be skipped if it is the next character. - */ - enum RN_State skip_rn; - - /** - * If we are in skip_rn with "dash" mode and - * do find 2 dashes, what state do we go into? - */ - enum PP_State dash_state; - - /** - * Which headers are global? (used to tell which - * headers were only valid for the nested multipart). - */ - enum NE_State have; - -}; - _MHD_EXTERN struct MHD_PostProcessor * MHD_create_post_processor (struct MHD_Connection *connection, diff --git a/src/microhttpd/postprocessor.h b/src/microhttpd/postprocessor.h @@ -0,0 +1,246 @@ +/* + This file is part of libmicrohttpd + Copyright (C) 2007-2022 Daniel Pittman, Christian Grothoff, and Evgeny Grin + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +/** + * @file postprocessor.h + * @brief Declarations for parsing POST data + * @author Christian Grothoff + * @author Karlson2k (Evgeny Grin) + */ + +#ifndef MHD_POSTPROCESSOR_H +#define MHD_POSTPROCESSOR_H 1 +#include "internal.h" + +/** + * States in the PP parser's state machine. + */ +enum PP_State +{ + /* general states */ + PP_Error, + PP_Done, + PP_Init, + PP_NextBoundary, + + /* url encoding-states */ + PP_ProcessKey, + PP_ProcessValue, + PP_Callback, + + /* post encoding-states */ + PP_ProcessEntryHeaders, + PP_PerformCheckMultipart, + PP_ProcessValueToBoundary, + PP_PerformCleanup, + + /* nested post-encoding states */ + PP_Nested_Init, + PP_Nested_PerformMarking, + PP_Nested_ProcessEntryHeaders, + PP_Nested_ProcessValueToBoundary, + PP_Nested_PerformCleanup + +}; + + +enum RN_State +{ + /** + * No RN-preprocessing in this state. + */ + RN_Inactive = 0, + + /** + * If the next character is CR, skip it. Otherwise, + * just go inactive. + */ + RN_OptN = 1, + + /** + * Expect LFCR (and only LFCR). As always, we also + * expect only LF or only CR. + */ + RN_Full = 2, + + /** + * Expect either LFCR or '--'LFCR. If '--'LFCR, transition into dash-state + * for the main state machine + */ + RN_Dash = 3, + + /** + * Got a single dash, expect second dash. + */ + RN_Dash2 = 4 +}; + + +/** + * Bits for the globally known fields that + * should not be deleted when we exit the + * nested state. + */ +enum NE_State +{ + NE_none = 0, + NE_content_name = 1, + NE_content_type = 2, + NE_content_filename = 4, + NE_content_transfer_encoding = 8 +}; + + +/** + * Internal state of the post-processor. Note that the fields + * are sorted by type to enable optimal packing by the compiler. + */ +struct MHD_PostProcessor +{ + + /** + * The connection for which we are doing + * POST processing. + */ + struct MHD_Connection *connection; + + /** + * Function to call with POST data. + */ + MHD_PostDataIterator ikvi; + + /** + * Extra argument to ikvi. + */ + void *cls; + + /** + * Encoding as given by the headers of the connection. + */ + const char *encoding; + + /** + * Primary boundary (points into encoding string) + */ + const char *boundary; + + /** + * Nested boundary (if we have multipart/mixed encoding). + */ + char *nested_boundary; + + /** + * Pointer to the name given in disposition. + */ + char *content_name; + + /** + * Pointer to the (current) content type. + */ + char *content_type; + + /** + * Pointer to the (current) filename. + */ + char *content_filename; + + /** + * Pointer to the (current) encoding. + */ + char *content_transfer_encoding; + + /** + * Value data left over from previous iteration. + */ + char xbuf[2]; + + /** + * Size of our buffer for the key. + */ + size_t buffer_size; + + /** + * Current position in the key buffer. + */ + size_t buffer_pos; + + /** + * Current position in @e xbuf. + */ + size_t xbuf_pos; + + /** + * Current offset in the value being processed. + */ + uint64_t value_offset; + + /** + * strlen(boundary) -- if boundary != NULL. + */ + size_t blen; + + /** + * strlen(nested_boundary) -- if nested_boundary != NULL. + */ + size_t nlen; + + /** + * Do we have to call the 'ikvi' callback when processing the + * multipart post body even if the size of the payload is zero? + * Set to #MHD_YES whenever we parse a new multiparty entry header, + * and to #MHD_NO the first time we call the 'ikvi' callback. + * Used to ensure that we do always call 'ikvi' even if the + * payload is empty (but not more than once). + */ + bool must_ikvi; + + /** + * Set if we still need to run the unescape logic + * on the key allocated at the end of this struct. + */ + bool must_unescape_key; + + /** + * State of the parser. + */ + enum PP_State state; + + /** + * Side-state-machine: skip LRCR (or just LF). + * Set to 0 if we are not in skip mode. Set to 2 + * if a LFCR is expected, set to 1 if a CR should + * be skipped if it is the next character. + */ + enum RN_State skip_rn; + + /** + * If we are in skip_rn with "dash" mode and + * do find 2 dashes, what state do we go into? + */ + enum PP_State dash_state; + + /** + * Which headers are global? (used to tell which + * headers were only valid for the nested multipart). + */ + enum NE_State have; + +}; + +#endif /* ! MHD_POSTPROCESSOR_H */ diff --git a/w32/common/libmicrohttpd-files.vcxproj b/w32/common/libmicrohttpd-files.vcxproj @@ -48,6 +48,7 @@ <ClInclude Include="$(MhdSrc)microhttpd\mhd_limits.h" /> <ClInclude Include="$(MhdSrc)microhttpd\mhd_mono_clock.h" /> <ClInclude Include="$(MhdSrc)microhttpd\response.h" /> + <ClInclude Include="$(MhdSrc)microhttpd\postprocessor.h" /> <ClInclude Include="$(MhdSrc)microhttpd\tsearch.h" /> <ClInclude Include="$(MhdSrc)microhttpd\sysfdsetsize.h" /> <ClInclude Include="$(MhdSrc)microhttpd\mhd_str.h" /> diff --git a/w32/common/libmicrohttpd-filters.vcxproj b/w32/common/libmicrohttpd-filters.vcxproj @@ -67,6 +67,9 @@ <ClInclude Include="$(MhdSrc)microhttpd\memorypool.h"> <Filter>Internal Headers</Filter> </ClInclude> + <ClInclude Include="$(MhdSrc)microhttpd\postprocessor.h"> + <Filter>Internal Headers</Filter> + </ClInclude> <ClInclude Include="$(MhdSrc)microhttpd\response.h"> <Filter>Internal Headers</Filter> </ClInclude>