Update http-parser

This commit is contained in:
Tatsuhiro Tsujikawa 2012-11-19 02:16:42 +09:00
parent 542fd6420b
commit bebea5e16a
6 changed files with 39 additions and 34 deletions

View File

@ -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>

View File

@ -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;
/* ... */ /* ... */

View File

@ -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 */

View File

@ -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' ]
} }
] ]
} }

View File

@ -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 */
}; };

View File

@ -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;