Update http-parser
This commit is contained in:
parent
542fd6420b
commit
bebea5e16a
|
@ -35,3 +35,4 @@ Simon Zimmermann <simonz05@gmail.com>
|
||||||
Erik Dubbelboer <erik@dubbelboer.com>
|
Erik Dubbelboer <erik@dubbelboer.com>
|
||||||
Martell Malone <martellmalone@gmail.com>
|
Martell Malone <martellmalone@gmail.com>
|
||||||
Bertrand Paquet <bpaquet@octo.com>
|
Bertrand Paquet <bpaquet@octo.com>
|
||||||
|
BogDan Vatra <bogdan@kde.org>
|
||||||
|
|
|
@ -36,7 +36,7 @@ using `http_parser_init()` and set the callbacks. That might look something
|
||||||
like this for a request parser:
|
like this for a request parser:
|
||||||
|
|
||||||
http_parser_settings settings;
|
http_parser_settings settings;
|
||||||
settings.on_path = my_path_callback;
|
settings.on_url = my_url_callback;
|
||||||
settings.on_header_field = my_header_field_callback;
|
settings.on_header_field = my_header_field_callback;
|
||||||
/* ... */
|
/* ... */
|
||||||
|
|
||||||
|
|
|
@ -51,18 +51,10 @@
|
||||||
# define ELEM_AT(a, i, v) ((unsigned int) (i) < ARRAY_SIZE(a) ? (a)[(i)] : (v))
|
# define ELEM_AT(a, i, v) ((unsigned int) (i) < ARRAY_SIZE(a) ? (a)[(i)] : (v))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if HTTP_PARSER_DEBUG
|
|
||||||
#define SET_ERRNO(e) \
|
|
||||||
do { \
|
|
||||||
parser->http_errno = (e); \
|
|
||||||
parser->error_lineno = __LINE__; \
|
|
||||||
} while (0)
|
|
||||||
#else
|
|
||||||
#define SET_ERRNO(e) \
|
#define SET_ERRNO(e) \
|
||||||
do { \
|
do { \
|
||||||
parser->http_errno = (e); \
|
parser->http_errno = (e); \
|
||||||
} while(0)
|
} while(0)
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* Run the notify callback FOR, returning ER if it fails */
|
/* Run the notify callback FOR, returning ER if it fails */
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
# RuntimeLibrary MUST MATCH across the entire project
|
# RuntimeLibrary MUST MATCH across the entire project
|
||||||
'Debug': {
|
'Debug': {
|
||||||
'defines': [ 'DEBUG', '_DEBUG' ],
|
'defines': [ 'DEBUG', '_DEBUG' ],
|
||||||
|
'cflags': [ '-Wall', '-Wextra', '-O0', '-g', '-ftrapv' ],
|
||||||
'msvs_settings': {
|
'msvs_settings': {
|
||||||
'VCCLCompilerTool': {
|
'VCCLCompilerTool': {
|
||||||
'RuntimeLibrary': 1, # static debug
|
'RuntimeLibrary': 1, # static debug
|
||||||
|
@ -20,6 +21,7 @@
|
||||||
},
|
},
|
||||||
'Release': {
|
'Release': {
|
||||||
'defines': [ 'NDEBUG' ],
|
'defines': [ 'NDEBUG' ],
|
||||||
|
'cflags': [ '-Wall', '-Wextra', '-O3' ],
|
||||||
'msvs_settings': {
|
'msvs_settings': {
|
||||||
'VCCLCompilerTool': {
|
'VCCLCompilerTool': {
|
||||||
'RuntimeLibrary': 0, # static release
|
'RuntimeLibrary': 0, # static release
|
||||||
|
@ -51,6 +53,7 @@
|
||||||
'type': 'static_library',
|
'type': 'static_library',
|
||||||
'include_dirs': [ '.' ],
|
'include_dirs': [ '.' ],
|
||||||
'direct_dependent_settings': {
|
'direct_dependent_settings': {
|
||||||
|
'defines': [ 'HTTP_PARSER_STRICT=0' ],
|
||||||
'include_dirs': [ '.' ],
|
'include_dirs': [ '.' ],
|
||||||
},
|
},
|
||||||
'defines': [ 'HTTP_PARSER_STRICT=0' ],
|
'defines': [ 'HTTP_PARSER_STRICT=0' ],
|
||||||
|
@ -69,11 +72,40 @@
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
'target_name': 'test',
|
'target_name': 'http_parser_strict',
|
||||||
|
'type': 'static_library',
|
||||||
|
'include_dirs': [ '.' ],
|
||||||
|
'direct_dependent_settings': {
|
||||||
|
'defines': [ 'HTTP_PARSER_STRICT=1' ],
|
||||||
|
'include_dirs': [ '.' ],
|
||||||
|
},
|
||||||
|
'defines': [ 'HTTP_PARSER_STRICT=1' ],
|
||||||
|
'sources': [ './http_parser.c', ],
|
||||||
|
'conditions': [
|
||||||
|
['OS=="win"', {
|
||||||
|
'msvs_settings': {
|
||||||
|
'VCCLCompilerTool': {
|
||||||
|
# Compile as C++. http_parser.c is actually C99, but C++ is
|
||||||
|
# close enough in this case.
|
||||||
|
'CompileAs': 2,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}]
|
||||||
|
],
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
'target_name': 'test-nonstrict',
|
||||||
'type': 'executable',
|
'type': 'executable',
|
||||||
'dependencies': [ 'http_parser' ],
|
'dependencies': [ 'http_parser' ],
|
||||||
'sources': [ 'test.c' ]
|
'sources': [ 'test.c' ]
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
'target_name': 'test-strict',
|
||||||
|
'type': 'executable',
|
||||||
|
'dependencies': [ 'http_parser_strict' ],
|
||||||
|
'sources': [ 'test.c' ]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define HTTP_PARSER_VERSION_MAJOR 1
|
#define HTTP_PARSER_VERSION_MAJOR 2
|
||||||
#define HTTP_PARSER_VERSION_MINOR 0
|
#define HTTP_PARSER_VERSION_MINOR 0
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
@ -51,14 +51,6 @@ typedef SSIZE_T ssize_t;
|
||||||
# define HTTP_PARSER_STRICT 1
|
# define HTTP_PARSER_STRICT 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Compile with -DHTTP_PARSER_DEBUG=1 to add extra debugging information to
|
|
||||||
* the error reporting facility.
|
|
||||||
*/
|
|
||||||
#ifndef HTTP_PARSER_DEBUG
|
|
||||||
# define HTTP_PARSER_DEBUG 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* Maximium header size allowed */
|
/* Maximium header size allowed */
|
||||||
#define HTTP_MAX_HEADER_SIZE (80*1024)
|
#define HTTP_MAX_HEADER_SIZE (80*1024)
|
||||||
|
|
||||||
|
@ -77,7 +69,7 @@ typedef struct http_parser_settings http_parser_settings;
|
||||||
* chunked' headers that indicate the presence of a body.
|
* chunked' headers that indicate the presence of a body.
|
||||||
*
|
*
|
||||||
* http_data_cb does not return data chunks. It will be call arbitrarally
|
* http_data_cb does not return data chunks. It will be call arbitrarally
|
||||||
* many times for each string. E.G. you might get 10 callbacks for "on_path"
|
* many times for each string. E.G. you might get 10 callbacks for "on_url"
|
||||||
* each providing just a few characters more data.
|
* each providing just a few characters more data.
|
||||||
*/
|
*/
|
||||||
typedef int (*http_data_cb) (http_parser*, const char *at, size_t length);
|
typedef int (*http_data_cb) (http_parser*, const char *at, size_t length);
|
||||||
|
@ -196,13 +188,6 @@ enum http_errno {
|
||||||
/* Get an http_errno value from an http_parser */
|
/* Get an http_errno value from an http_parser */
|
||||||
#define HTTP_PARSER_ERRNO(p) ((enum http_errno) (p)->http_errno)
|
#define HTTP_PARSER_ERRNO(p) ((enum http_errno) (p)->http_errno)
|
||||||
|
|
||||||
/* Get the line number that generated the current error */
|
|
||||||
#if HTTP_PARSER_DEBUG
|
|
||||||
#define HTTP_PARSER_ERRNO_LINE(p) ((p)->error_lineno)
|
|
||||||
#else
|
|
||||||
#define HTTP_PARSER_ERRNO_LINE(p) 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
struct http_parser {
|
struct http_parser {
|
||||||
/** PRIVATE **/
|
/** PRIVATE **/
|
||||||
|
@ -229,10 +214,6 @@ struct http_parser {
|
||||||
*/
|
*/
|
||||||
unsigned char upgrade : 1;
|
unsigned char upgrade : 1;
|
||||||
|
|
||||||
#if HTTP_PARSER_DEBUG
|
|
||||||
uint32_t error_lineno;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** PUBLIC **/
|
/** PUBLIC **/
|
||||||
void *data; /* A pointer to get hook to the "connection" or "socket" object */
|
void *data; /* A pointer to get hook to the "connection" or "socket" object */
|
||||||
};
|
};
|
||||||
|
|
|
@ -1954,8 +1954,7 @@ upgrade_message_fix(char *body, const size_t nread, const size_t nmsgs, ...) {
|
||||||
static void
|
static void
|
||||||
print_error (const char *raw, size_t error_location)
|
print_error (const char *raw, size_t error_location)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "\n*** %s:%d -- %s ***\n\n",
|
fprintf(stderr, "\n*** %s ***\n\n",
|
||||||
"http_parser.c", HTTP_PARSER_ERRNO_LINE(parser),
|
|
||||||
http_errno_description(HTTP_PARSER_ERRNO(parser)));
|
http_errno_description(HTTP_PARSER_ERRNO(parser)));
|
||||||
|
|
||||||
int this_line = 0, char_len = 0;
|
int this_line = 0, char_len = 0;
|
||||||
|
|
Loading…
Reference in New Issue