#include "internal.h"
Include dependency graph for postprocessor.c:
Go to the source code of this file.
Defines | |
#define | XBUF_SIZE 512 |
Enumerations | |
enum | PP_State { PP_Error, PP_Done, PP_Init, PP_NextBoundary, PP_ProcessValue, PP_ExpectNewLine, PP_ProcessEntryHeaders, PP_PerformCheckMultipart, PP_ProcessValueToBoundary, PP_PerformCleanup, PP_Nested_Init, PP_Nested_PerformMarking, PP_Nested_ProcessEntryHeaders, PP_Nested_ProcessValueToBoundary, PP_Nested_PerformCleanup } |
enum | RN_State { RN_Inactive = 0, RN_OptN = 1, RN_Full = 2, RN_Dash = 3, RN_Dash2 = 4 } |
enum | NE_State { NE_none = 0, NE_content_name = 1, NE_content_type = 2, NE_content_filename = 4, NE_content_transfer_encoding = 8 } |
Functions | |
MHD_PostProcessor * | MHD_create_post_processor (struct MHD_Connection *connection, size_t buffer_size, MHD_PostDataIterator ikvi, void *cls) |
static int | post_process_urlencoded (struct MHD_PostProcessor *pp, const char *post_data, size_t post_data_len) |
static int | try_match_header (const char *prefix, char *line, char **suffix) |
static int | find_boundary (struct MHD_PostProcessor *pp, const char *boundary, size_t blen, size_t *ioffptr, enum PP_State next_state, enum PP_State next_dash_state) |
static void | try_get_value (const char *buf, const char *key, char **destination) |
static int | process_multipart_headers (struct MHD_PostProcessor *pp, size_t *ioffptr, enum PP_State next_state) |
static int | process_value_to_boundary (struct MHD_PostProcessor *pp, size_t *ioffptr, const char *boundary, size_t blen, enum PP_State next_state, enum PP_State next_dash_state) |
static void | free_unmarked (struct MHD_PostProcessor *pp) |
static int | post_process_multipart (struct MHD_PostProcessor *pp, const char *post_data, size_t post_data_len) |
int | MHD_post_process (struct MHD_PostProcessor *pp, const char *post_data, size_t post_data_len) |
int | MHD_destroy_post_processor (struct MHD_PostProcessor *pp) |
Definition in file postprocessor.c.
#define XBUF_SIZE 512 |
Size of on-stack buffer that we use for un-escaping of the value. We use a pretty small value to be nice to the stack on embedded systems.
Definition at line 33 of file postprocessor.c.
Referenced by post_process_urlencoded().
enum NE_State |
Bits for the globally known fields that should not be deleted when we exit the nested state.
NE_none | |
NE_content_name | |
NE_content_type | |
NE_content_filename | |
NE_content_transfer_encoding |
Definition at line 101 of file postprocessor.c.
enum PP_State |
States in the PP parser's state machine.
Definition at line 38 of file postprocessor.c.
enum RN_State |
Definition at line 65 of file postprocessor.c.
static int find_boundary | ( | struct MHD_PostProcessor * | pp, | |
const char * | boundary, | |||
size_t | blen, | |||
size_t * | ioffptr, | |||
enum PP_State | next_state, | |||
enum PP_State | next_dash_state | |||
) | [static] |
Definition at line 482 of file postprocessor.c.
References MHD_NO, MHD_YES, PP_Error, PP_Init, and RN_Dash.
Referenced by post_process_multipart().
Here is the caller graph for this function:
static void free_unmarked | ( | struct MHD_PostProcessor * | pp | ) | [static] |
Definition at line 700 of file postprocessor.c.
References NE_content_filename, NE_content_name, NE_content_transfer_encoding, NE_content_type, and NULL.
Referenced by MHD_destroy_post_processor(), and post_process_multipart().
Here is the caller graph for this function:
struct MHD_PostProcessor* MHD_create_post_processor | ( | struct MHD_Connection * | connection, | |
size_t | buffer_size, | |||
MHD_PostDataIterator | ikvi, | |||
void * | cls | |||
) |
Create a PostProcessor.
A PostProcessor can be used to (incrementally) parse the data portion of a POST request.
connection | the connection on which the POST is happening (used to determine the POST format) | |
buffer_size | maximum number of bytes to use for internal buffering (used only for the parsing, specifically the parsing of the keys). A tiny value (256-1024) should be sufficient. Do NOT use 0. | |
ikvi | iterator to be called with the parsed data | |
cls | first argument to ikvi |
Definition at line 252 of file postprocessor.c.
References MHD_HEADER_KIND, MHD_HTTP_HEADER_CONTENT_TYPE, MHD_HTTP_POST_ENCODING_FORM_URLENCODED, MHD_HTTP_POST_ENCODING_MULTIPART_FORMDATA, MHD_lookup_connection_value(), mhd_panic, mhd_panic_cls, NULL, PP_Init, and RN_Inactive.
Referenced by test_simple_large().
Here is the call graph for this function:
Here is the caller graph for this function:
int MHD_destroy_post_processor | ( | struct MHD_PostProcessor * | pp | ) |
Release PostProcessor resources.
Definition at line 1056 of file postprocessor.c.
References free_unmarked(), MHD_NO, MHD_YES, NE_none, NULL, and PP_Done.
Referenced by test_simple_large().
Here is the call graph for this function:
Here is the caller graph for this function:
int MHD_post_process | ( | struct MHD_PostProcessor * | pp, | |
const char * | post_data, | |||
size_t | post_data_len | |||
) |
Parse and process POST data. Call this function when POST data is available (usually during an MHD_AccessHandlerCallback) with the upload_data and upload_data_size. Whenever possible, this will then cause calls to the MHD_IncrementalKeyValueIterator.
pp | the post processor | |
post_data | post_data_len bytes of POST data | |
post_data_len | length of post_data |
Definition at line 1034 of file postprocessor.c.
References MHD_HTTP_POST_ENCODING_FORM_URLENCODED, MHD_HTTP_POST_ENCODING_MULTIPART_FORMDATA, MHD_NO, MHD_YES, NULL, post_process_multipart(), and post_process_urlencoded().
Referenced by test_simple_large().
Here is the call graph for this function:
Here is the caller graph for this function:
static int post_process_multipart | ( | struct MHD_PostProcessor * | pp, | |
const char * | post_data, | |||
size_t | post_data_len | |||
) | [static] |
Decode multipart POST data.
Per RFC2046 5.1.1 NOTE TO IMPLEMENTORS, consume anything prior to the first multipart boundary:
> There appears to be room for additional information prior > to the first boundary delimiter line and following the > final boundary delimiter line. These areas should > generally be left blank, and implementations must ignore > anything that appears before the first boundary delimiter > line or after the last one.
Definition at line 730 of file postprocessor.c.
References find_boundary(), free_unmarked(), MHD_NO, mhd_panic, mhd_panic_cls, MHD_YES, NE_content_filename, NE_content_name, NE_content_transfer_encoding, NE_content_type, NE_none, NULL, PP_Done, PP_Error, PP_Init, PP_Nested_Init, PP_Nested_PerformCleanup, PP_Nested_PerformMarking, PP_Nested_ProcessEntryHeaders, PP_Nested_ProcessValueToBoundary, PP_NextBoundary, PP_PerformCheckMultipart, PP_PerformCleanup, PP_ProcessEntryHeaders, PP_ProcessValueToBoundary, process_multipart_headers(), process_value_to_boundary(), RN_Dash, RN_Dash2, RN_Full, RN_Inactive, and RN_OptN.
Referenced by MHD_post_process().
Here is the call graph for this function:
Here is the caller graph for this function:
static int post_process_urlencoded | ( | struct MHD_PostProcessor * | pp, | |
const char * | post_data, | |||
size_t | post_data_len | |||
) | [static] |
Process url-encoded POST data.
Definition at line 315 of file postprocessor.c.
References MHD_http_unescape(), MHD_NO, mhd_panic, mhd_panic_cls, MHD_POSTDATA_KIND, MHD_YES, NULL, PP_Done, PP_Error, PP_ExpectNewLine, PP_Init, PP_ProcessValue, and XBUF_SIZE.
Referenced by MHD_post_process().
Here is the call graph for this function:
Here is the caller graph for this function:
static int process_multipart_headers | ( | struct MHD_PostProcessor * | pp, | |
size_t * | ioffptr, | |||
enum PP_State | next_state | |||
) | [static] |
Go over the headers of the part and update the fields in "pp" according to what we find. If we are at the end of the headers (as indicated by an empty line), transition into next_state.
ioffptr | set to how many bytes have been processed |
Definition at line 567 of file postprocessor.c.
References MHD_NO, MHD_YES, PP_Error, RN_Full, RN_OptN, try_get_value(), and try_match_header().
Referenced by post_process_multipart().
Here is the call graph for this function:
Here is the caller graph for this function:
static int process_value_to_boundary | ( | struct MHD_PostProcessor * | pp, | |
size_t * | ioffptr, | |||
const char * | boundary, | |||
size_t | blen, | |||
enum PP_State | next_state, | |||
enum PP_State | next_dash_state | |||
) | [static] |
We have the value until we hit the given boundary; process accordingly.
boundary | the boundary to look for | |
blen | strlen(boundary) | |
next_state | what state to go into after the boundary was found | |
next_dash_state | state to go into if the next boundary ends with "--" |
Definition at line 628 of file postprocessor.c.
References MHD_NO, MHD_POSTDATA_KIND, MHD_YES, PP_Error, and RN_Dash.
Referenced by post_process_multipart().
Here is the caller graph for this function:
static void try_get_value | ( | const char * | buf, | |
const char * | key, | |||
char ** | destination | |||
) | [static] |
In buf, there maybe an expression '$key="$value"'. If that is the case, copy a copy of $value to destination.
If destination is already non-NULL, do nothing.
Definition at line 520 of file postprocessor.c.
References NULL.
Referenced by process_multipart_headers().
Here is the caller graph for this function:
static int try_match_header | ( | const char * | prefix, | |
char * | line, | |||
char ** | suffix | |||
) | [static] |
If the given line matches the prefix, strdup the rest of the line into the suffix ptr.
Definition at line 465 of file postprocessor.c.
References MHD_NO, MHD_YES, and NULL.
Referenced by process_multipart_headers().
Here is the caller graph for this function: