GNU libmicrohttpd  0.9.29
postprocessor.c File Reference

Methods for parsing POST data. More...

#include "internal.h"
#include "mhd_str.h"
#include "mhd_compat.h"
Include dependency graph for postprocessor.c:

Go to the source code of this file.

Macros

#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

struct MHD_PostProcessor * MHD_create_post_processor (struct MHD_Connection *connection, size_t buffer_size, MHD_PostDataIterator iter, void *iter_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)
 

Detailed Description

Methods for parsing POST data.

Author
Christian Grothoff

Definition in file postprocessor.c.

Macro Definition Documentation

◆ XBUF_SIZE

#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 35 of file postprocessor.c.

Referenced by post_process_urlencoded().

Enumeration Type Documentation

◆ NE_State

enum NE_State

Bits for the globally known fields that should not be deleted when we exit the nested state.

Enumerator
NE_none 
NE_content_name 
NE_content_type 
NE_content_filename 
NE_content_transfer_encoding 

Definition at line 105 of file postprocessor.c.

◆ PP_State

enum PP_State

States in the PP parser's state machine.

Enumerator
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 

Definition at line 40 of file postprocessor.c.

◆ RN_State

enum RN_State
Enumerator
RN_Inactive 

No RN-preprocessing in this state.

RN_OptN 

If the next character is CR, skip it. Otherwise, just go inactive.

RN_Full 

Expect LFCR (and only LFCR). As always, we also expect only LF or only CR.

RN_Dash 

Expect either LFCR or '–'LFCR. If '–'LFCR, transition into dash-state for the main state machine

RN_Dash2 

Got a single dash, expect second dash.

Definition at line 68 of file postprocessor.c.

Function Documentation

◆ find_boundary()

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
Parameters
pppost processor context
boundaryboundary to look for
blennumber of bytes in boundary
ioffptrset to the end of the boundary if found, otherwise incremented by one (FIXME: quirky API!)
next_statestate to which we should advance the post processor if the boundary is found
next_dash_statedash_state to which we should advance the post processor if the boundary is found
Returns
MHD_NO if the boundary is not found, MHD_YES if we did find it

Definition at line 561 of file postprocessor.c.

References MHD_NO, MHD_YES, NULL, PP_Error, PP_Init, and RN_Dash.

Referenced by post_process_multipart().

Here is the caller graph for this function:

◆ free_unmarked()

static void free_unmarked ( struct MHD_PostProcessor *  pp)
static
Parameters
pppost processor context

Definition at line 853 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:

◆ post_process_multipart()

static int post_process_multipart ( struct MHD_PostProcessor *  pp,
const char *  post_data,
size_t  post_data_len 
)
static

Decode multipart POST data.

Parameters
pppost processor context
post_datadata to decode
post_data_lennumber of bytes in post_data
Returns
MHD_NO on error,

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 891 of file postprocessor.c.

References find_boundary(), free_unmarked(), MHD_NO, mhd_panic, mhd_panic_cls, MHD_STATICSTR_LEN_, MHD_str_equal_caseless_n_(), 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:

◆ post_process_urlencoded()

static int post_process_urlencoded ( struct MHD_PostProcessor *  pp,
const char *  post_data,
size_t  post_data_len 
)
static

Process url-encoded POST data.

Parameters
pppost processor context
post_dataupload data
post_data_lennumber of bytes in post_data
Returns
MHD_YES on success, MHD_NO if there was an error processing the data

Definition at line 353 of file postprocessor.c.

References MHD_http_unescape(), MHD_NO, mhd_panic, mhd_panic_cls, MHD_POSTDATA_KIND, MHD_unescape_plus(), MHD_YES, NULL, PP_Done, PP_Error, PP_ExpectNewLine, PP_Init, PP_ProcessValue, and XBUF_SIZE.

Referenced by MHD_destroy_post_processor(), and MHD_post_process().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ process_multipart_headers()

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.

Parameters
pppost processor context
ioffptrset to how many bytes have been processed
next_statestate to which the post processor should be advanced if we find the end of the headers
Returns
MHD_YES if we can continue processing, MHD_NO on error or if we do not have enough data yet

Definition at line 681 of file postprocessor.c.

References MHD_NO, MHD_STATICSTR_LEN_, MHD_str_equal_caseless_n_(), 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:

◆ process_value_to_boundary()

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.

Parameters
pppost processor context
ioffptrincremented based on the number of bytes processed
boundarythe boundary to look for
blenstrlen(boundary)
next_statewhat state to go into after the boundary was found
next_dash_statestate to go into if the next boundary ends with "--"
Returns
MHD_YES if we can continue processing, MHD_NO on error or if we do not have enough data yet

Definition at line 753 of file postprocessor.c.

References MHD_NO, MHD_POSTDATA_KIND, MHD_YES, NULL, PP_Error, and RN_Dash.

Referenced by post_process_multipart().

Here is the caller graph for this function:

◆ try_get_value()

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 623 of file postprocessor.c.

References NULL.

Referenced by process_multipart_headers().

Here is the caller graph for this function:

◆ try_match_header()

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.

Parameters
prefixprefix to match
lineline to match prefix in
suffixset to a copy of the rest of the line, starting at the end of the match
Returns
MHD_YES if there was a match, MHD_NO if not

Definition at line 526 of file postprocessor.c.

References MHD_NO, MHD_str_equal_caseless_n_(), MHD_YES, and NULL.

Referenced by process_multipart_headers().

Here is the call graph for this function:
Here is the caller graph for this function: