Main Page | Modules | Data Structures | Directories | File List | Data Fields | Globals | Related Pages

apreq_parser.h File Reference

Request body parser API. More...

#include "apreq_param.h"

Go to the source code of this file.

Defines

#define APREQ_PARSER_ARGS
#define APREQ_HOOK_ARGS
#define APREQ_DECLARE_PARSER(f)
#define APREQ_DECLARE_HOOK(f)

Typedefs

typedef apreq_hook_t apreq_hook_t
typedef apreq_parser_t apreq_parser_t
typedef apr_status_t(* apreq_parser_function_t )(APREQ_PARSER_ARGS)
typedef apr_status_t(* apreq_hook_function_t )(APREQ_HOOK_ARGS)

Functions

static APR_INLINE apr_status_t apreq_parser_run (struct apreq_parser_t *psr, apr_table_t *t, apr_bucket_brigade *bb)
static APR_INLINE apr_status_t apreq_hook_run (struct apreq_hook_t *h, apreq_param_t *param, apr_bucket_brigade *bb)
 APREQ_DECLARE_PARSER (apreq_parse_headers)
 APREQ_DECLARE_PARSER (apreq_parse_urlencoded)
 APREQ_DECLARE_PARSER (apreq_parse_multipart)
 APREQ_DECLARE_PARSER (apreq_parse_generic)
 APREQ_DECLARE_HOOK (apreq_hook_apr_xml_parser)
apreq_parser_tapreq_parser_make (apr_pool_t *pool, apr_bucket_alloc_t *ba, const char *content_type, apreq_parser_function_t pfn, apr_size_t brigade_limit, const char *temp_dir, apreq_hook_t *hook, void *ctx)
apreq_hook_tapreq_hook_make (apr_pool_t *pool, apreq_hook_function_t hook, apreq_hook_t *next, void *ctx)
apr_status_t apreq_parser_add_hook (apreq_parser_t *p, apreq_hook_t *h)
apreq_parser_function_t apreq_parser (const char *enctype)
apr_status_t apreq_register_parser (const char *enctype, apreq_parser_function_t pfn)
 APREQ_DECLARE_HOOK (apreq_hook_disable_uploads)
 APREQ_DECLARE_HOOK (apreq_hook_discard_brigade)
 APREQ_DECLARE_HOOK (apreq_hook_find_param)


Detailed Description

Request body parser API.


Define Documentation

#define APREQ_DECLARE_HOOK  ) 
 

Value:

APREQ_DECLARE_NONSTD(apr_status_t) \
                                (f) (APREQ_HOOK_ARGS)
Declares an API hook.

#define APREQ_DECLARE_PARSER  ) 
 

Value:

Declares a API parser.

#define APREQ_HOOK_ARGS
 

Value:

Hook arguments

#define APREQ_PARSER_ARGS
 

Value:

Parser arguments.


Typedef Documentation

typedef apr_status_t(* apreq_hook_function_t)(APREQ_HOOK_ARGS)
 

The callback function of a hook. See apreq_hook_t.

typedef struct apreq_hook_t apreq_hook_t
 

A hook is called by the parser whenever data arrives in a file upload parameter of the request body. You may associate any number of hooks with a parser instance with apreq_parser_add_hook().

typedef apr_status_t(* apreq_parser_function_t)(APREQ_PARSER_ARGS)
 

The callback function implementing a request body parser.

typedef struct apreq_parser_t apreq_parser_t
 

A request body parser instance.


Function Documentation

APREQ_DECLARE_HOOK apreq_hook_find_param   ) 
 

Special purpose utility for locating a parameter during parsing. The hook's ctx shoud be initialized to a const char *, which is a pointer to the desired param name. The hook's ctx will be reassigned to the first param found.

Remarks:
When used, this should always be the first hook invoked, so add it manually as parser->hook instead of using apreq_parser_add_hook.

APREQ_DECLARE_HOOK apreq_hook_discard_brigade   ) 
 

Calls apr_brigade_cleanup on the incoming brigade after passing the brigade to any subsequent hooks.

APREQ_DECLARE_HOOK apreq_hook_disable_uploads   ) 
 

Returns APREQ_ERROR_GENERAL. Effectively disables mfd parser if a file-upload field is present.

APREQ_DECLARE_HOOK apreq_hook_apr_xml_parser   ) 
 

apr_xml_parser hook. It will parse until EOS appears. The parsed document isn't available until parsing has completed successfully. The hook's ctx pointer may be cast as (apr_xml_doc **) to retrieve the parsed document.

APREQ_DECLARE_PARSER apreq_parse_generic   ) 
 

Generic parser. No table entries will be added to the req->body table by this parser. The parser creates a dummy apreq_param_t to pass to any configured hooks. If no hooks are configured, the dummy param's bb slot will contain a copy of the request body. It can be retrieved by casting the parser's ctx pointer to (apreq_param_t **).

APREQ_DECLARE_PARSER apreq_parse_multipart   ) 
 

RFC 2388 multipart/form-data (and XForms 1.0 multipart/related) parser. It will reject any buckets representing preamble and postamble text (this is normal behavior, not an error condition). See apreq_parser_run() for more info on rejected data.

APREQ_DECLARE_PARSER apreq_parse_urlencoded   ) 
 

RFC 2396 application/x-www-form-urlencoded parser.

APREQ_DECLARE_PARSER apreq_parse_headers   ) 
 

RFC 822 Header parser. It will reject all data after the first CRLF CRLF sequence (an empty line). See apreq_parser_run() for more info on rejected data.

apreq_hook_t* apreq_hook_make apr_pool_t pool,
apreq_hook_function_t  hook,
apreq_hook_t next,
void *  ctx
 

Construct a hook.

Parameters:
pool used to allocate the hook.
hook The hook function.
next List of other hooks for this hook to call on.
ctx Hook's internal scratch pad.
Returns:
New hook.

static APR_INLINE apr_status_t apreq_hook_run struct apreq_hook_t h,
apreq_param_t param,
apr_bucket_brigade bb
[static]
 

Run the hook with the current parameter and the incoming bucket brigade. The hook may modify the brigade if necessary. Once all hooks have completed, the contents of the brigade will be added to the parameter's bb attribute.

Returns:
APR_SUCCESS on success. All other values represent errors.

apreq_parser_function_t apreq_parser const char *  enctype  ) 
 

Fetch the default parser function associated with the given MIME type.

Parameters:
enctype The desired enctype (can also be a full "Content-Type" header).
Returns:
The parser function, or NULL if the enctype is unrecognized.

apr_status_t apreq_parser_add_hook apreq_parser_t p,
apreq_hook_t h
 

Add a new hook to the end of the parser's hook list.

Parameters:
p Parser.
h Hook to append.

apreq_parser_t* apreq_parser_make apr_pool_t pool,
apr_bucket_alloc_t ba,
const char *  content_type,
apreq_parser_function_t  pfn,
apr_size_t  brigade_limit,
const char *  temp_dir,
apreq_hook_t hook,
void *  ctx
 

Construct a parser.

Parameters:
pool Pool used to allocate the parser.
ba bucket allocator used to create bucket brigades
content_type Content-type that this parser can deal with.
pfn The parser function.
brigade_limit the maximum in-memory bytes a brigade may use
temp_dir the directory used by the parser for temporary files
hook Hooks to associate this parser with.
ctx Parser's internal scratch pad.
Returns:
New parser.

static APR_INLINE apr_status_t apreq_parser_run struct apreq_parser_t psr,
apr_table_t t,
apr_bucket_brigade bb
[static]
 

Parse the incoming brigade into a table. Parsers normally consume all the buckets of the brigade during parsing. However parsers may leave "rejected" data in the brigade, even during a successful parse, so callers may need to clean up the brigade themselves (in particular, rejected buckets should not be passed back to the parser again).

Remarks:
bb == NULL is valid: the parser should return its public status: APR_INCOMPLETE, APR_SUCCESS, or an error code.

apr_status_t apreq_register_parser const char *  enctype,
apreq_parser_function_t  pfn
 

Register a new parsing function with a MIME enctype. Registered parsers are added to apreq_parser()'s internal lookup table.

Parameters:
enctype The MIME type.
pfn The function to use during parsing. Setting parser == NULL will remove an existing parser.
Returns:
APR_SUCCESS or error.