Electroneum
Classes | Macros | Typedefs | Enumerations | Functions
http_parser_merged.h File Reference
#include <sys/types.h>
#include <stdint.h>
#include <assert.h>
#include <stddef.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
Include dependency graph for http_parser_merged.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  http_parser
 
struct  http_parser_settings
 
struct  http_parser_url
 

Macros

#define CROW_HTTP_PARSER_VERSION_MAJOR   2
 
#define CROW_HTTP_PARSER_VERSION_MINOR   3
 
#define CROW_HTTP_PARSER_VERSION_PATCH   0
 
#define CROW_HTTP_PARSER_STRICT   1
 
#define CROW_HTTP_MAX_HEADER_SIZE   (80*1024)
 
#define CROW_HTTP_METHOD_MAP(CROW_XX)
 
#define CROW_XX(num, name, string)   HTTP_##name = num,
 
#define CROW_HTTP_ERRNO_MAP(CROW_XX)
 
#define CROW_HTTP_ERRNO_GEN(n, s)   HPE_##n,
 
#define CROW_HTTP_PARSER_ERRNO(p)   ((enum http_errno) (p)->http_errno)
 
#define CROW_ULLONG_MAX   ((uint64_t) -1) /* 2^64-1 */
 
#define CROW_MIN(a, b)   ((a) < (b) ? (a) : (b))
 
#define CROW_ARRAY_SIZE(a)   (sizeof(a) / sizeof((a)[0]))
 
#define CROW_BIT_AT(a, i)
 
#define CROW_ELEM_AT(a, i, v)   ((unsigned int) (i) < CROW_ARRAY_SIZE(a) ? (a)[(i)] : (v))
 
#define CROW_SET_ERRNO(e)
 
#define CROW_CALLBACK_NOTIFY_(FOR, ER)
 
#define CROW_CALLBACK_NOTIFY(FOR)   CROW_CALLBACK_NOTIFY_(FOR, p - data + 1)
 
#define CROW_CALLBACK_NOTIFY_NOADVANCE(FOR)   CROW_CALLBACK_NOTIFY_(FOR, p - data)
 
#define CROW_CALLBACK_DATA_(FOR, LEN, ER)
 
#define CROW_CALLBACK_DATA(FOR)   CROW_CALLBACK_DATA_(FOR, p - FOR##_mark, p - data + 1)
 
#define CROW_CALLBACK_DATA_NOADVANCE(FOR)   CROW_CALLBACK_DATA_(FOR, p - FOR##_mark, p - data)
 
#define CROW_MARK(FOR)
 
#define CROW_PROXY_CONNECTION   "proxy-connection"
 
#define CROW_CONNECTION   "connection"
 
#define CROW_CONTENT_LENGTH   "content-length"
 
#define CROW_TRANSFER_ENCODING   "transfer-encoding"
 
#define CROW_UPGRADE   "upgrade"
 
#define CROW_CHUNKED   "chunked"
 
#define CROW_KEEP_ALIVE   "keep-alive"
 
#define CROW_CLOSE   "close"
 
#define CROW_PARSING_HEADER(state)   (state <= s_headers_done)
 
#define CROW_CR   '\r'
 
#define CROW_LF   '\n'
 
#define CROW_LOWER(c)   (unsigned char)(c | 0x20)
 
#define CROW_IS_ALPHA(c)   (CROW_LOWER(c) >= 'a' && CROW_LOWER(c) <= 'z')
 
#define CROW_IS_NUM(c)   ((c) >= '0' && (c) <= '9')
 
#define CROW_IS_ALPHANUM(c)   (CROW_IS_ALPHA(c) || CROW_IS_NUM(c))
 
#define CROW_IS_HEX(c)   (CROW_IS_NUM(c) || (CROW_LOWER(c) >= 'a' && CROW_LOWER(c) <= 'f'))
 
#define CROW_IS_MARK(c)
 
#define CROW_IS_USERINFO_CHAR(c)
 
#define CROW_TOKEN(c)   (tokens[(unsigned char)c])
 
#define CROW_IS_URL_CHAR(c)   (CROW_BIT_AT(normal_url_char, (unsigned char)c))
 
#define CROW_IS_HOST_CHAR(c)   (CROW_IS_ALPHANUM(c) || (c) == '.' || (c) == '-')
 
#define CROW_start_state   (parser->type == HTTP_REQUEST ? s_start_req : s_start_res)
 
#define CROW_STRICT_CHECK(cond)
 
#define CROW_NEW_MESSAGE()   (http_should_keep_alive(parser) ? CROW_start_state : s_dead)
 
#define CROW_T(v)   0
 
#define CROW_XX(num, name, string)   #string,
 
#define CROW_XX(num, name, string)   #string,
 
#define CROW_HTTP_STRERROR_GEN(n, s)   { "HPE_" #n, s },
 
#define CROW_HTTP_STRERROR_GEN(n, s)   { "HPE_" #n, s },
 

Typedefs

typedef struct http_parser http_parser
 
typedef struct http_parser_settings http_parser_settings
 
typedef int(* http_data_cb) (http_parser *, const char *at, size_t length)
 
typedef int(* http_cb) (http_parser *)
 

Enumerations

enum  http_method
 
enum  http_parser_type { HTTP_REQUEST, HTTP_RESPONSE, HTTP_BOTH }
 
enum  flags {
  F_CHUNKED = 1 << 0, F_CONNECTION_KEEP_ALIVE = 1 << 1, F_CONNECTION_CLOSE = 1 << 2, F_TRAILING = 1 << 3,
  F_UPGRADE = 1 << 4, F_SKIPBODY = 1 << 5
}
 
enum  http_errno
 
enum  http_parser_url_fields {
  UF_SCHEMA = 0, UF_HOST = 1, UF_PORT = 2, UF_PATH = 3,
  UF_QUERY = 4, UF_FRAGMENT = 5, UF_USERINFO = 6, UF_MAX = 7
}
 
enum  state {
  s_dead = 1, s_start_req_or_res, s_res_or_resp_H, s_start_res,
  s_res_H, s_res_HT, s_res_HTT, s_res_HTTP,
  s_res_first_http_major, s_res_http_major, s_res_first_http_minor, s_res_http_minor,
  s_res_first_status_code, s_res_status_code, s_res_status_start, s_res_status,
  s_res_line_almost_done, s_start_req, s_req_method, s_req_spaces_before_url,
  s_req_schema, s_req_schema_slash, s_req_schema_slash_slash, s_req_server_start,
  s_req_server, s_req_server_with_at, s_req_path, s_req_query_string_start,
  s_req_query_string, s_req_fragment_start, s_req_fragment, s_req_http_start,
  s_req_http_H, s_req_http_HT, s_req_http_HTT, s_req_http_HTTP,
  s_req_first_http_major, s_req_http_major, s_req_first_http_minor, s_req_http_minor,
  s_req_line_almost_done, s_header_field_start, s_header_field, s_header_value_discard_ws,
  s_header_value_discard_ws_almost_done, s_header_value_discard_lws, s_header_value_start, s_header_value,
  s_header_value_lws, s_header_almost_done, s_chunk_size_start, s_chunk_size,
  s_chunk_parameters, s_chunk_size_almost_done, s_headers_almost_done, s_headers_done,
  s_chunk_data, s_chunk_data_almost_done, s_chunk_data_done, s_body_identity,
  s_body_identity_eof, s_message_done
}
 
enum  header_states {
  h_general = 0, h_C, h_CO, h_CON,
  h_matching_connection, h_matching_proxy_connection, h_matching_content_length, h_matching_transfer_encoding,
  h_matching_upgrade, h_connection, h_content_length, h_transfer_encoding,
  h_upgrade, h_matching_transfer_encoding_chunked, h_matching_connection_keep_alive, h_matching_connection_close,
  h_transfer_encoding_chunked, h_connection_keep_alive, h_connection_close
}
 
enum  http_host_state {
  s_http_host_dead = 1, s_http_userinfo_start, s_http_userinfo, s_http_host_start,
  s_http_host_v6_start, s_http_host, s_http_host_v6, s_http_host_v6_end,
  s_http_host_port_start, s_http_host_port
}
 

Functions

unsigned long http_parser_version (void)
 
void http_parser_init (http_parser *parser, enum http_parser_type type)
 
size_t http_parser_execute (http_parser *parser, const http_parser_settings *settings, const char *data, size_t len)
 
int http_should_keep_alive (const http_parser *parser)
 
const char * http_method_str (enum http_method m)
 
const char * http_errno_name (enum http_errno err)
 
const char * http_errno_description (enum http_errno err)
 
int http_parser_parse_url (const char *buf, size_t buflen, int is_connect, struct http_parser_url *u)
 
void http_parser_pause (http_parser *parser, int paused)
 
int http_body_is_final (const http_parser *parser)
 
int http_message_needs_eof (const http_parser *parser)
 
enum state parse_url_char (enum state s, const char ch)
 
static enum http_host_state http_parse_host_char (enum http_host_state s, const char ch)
 
int http_parse_host (const char *buf, struct http_parser_url *u, int found_at)
 
int http_body_is_final (const struct http_parser *parser)
 

Macro Definition Documentation

◆ CROW_ARRAY_SIZE

#define CROW_ARRAY_SIZE (   a)    (sizeof(a) / sizeof((a)[0]))

◆ CROW_BIT_AT

#define CROW_BIT_AT (   a,
 
)
Value:
(!!((unsigned int) (a)[(unsigned int) (i) >> 3] & \
(1 << ((unsigned int) (i) & 7))))
string a
Definition: MakeCryptoOps.py:15

◆ CROW_CALLBACK_DATA

#define CROW_CALLBACK_DATA (   FOR)    CROW_CALLBACK_DATA_(FOR, p - FOR##_mark, p - data + 1)

◆ CROW_CALLBACK_DATA_

#define CROW_CALLBACK_DATA_ (   FOR,
  LEN,
  ER 
)
Value:
do { \
assert(CROW_HTTP_PARSER_ERRNO(parser) == HPE_OK); \
\
if (FOR##_mark) { \
if (settings->on_##FOR) { \
if (0 != settings->on_##FOR(parser, FOR##_mark, (LEN))) { \
CROW_SET_ERRNO(HPE_CB_##FOR); \
} \
\
/* We either errored above or got paused; get out */ \
if (CROW_HTTP_PARSER_ERRNO(parser) != HPE_OK) { \
return (ER); \
} \
} \
FOR##_mark = NULL; \
} \
} while (0)
#define CROW_HTTP_PARSER_ERRNO(p)
Definition: http_parser_merged.h:201

◆ CROW_CALLBACK_DATA_NOADVANCE

#define CROW_CALLBACK_DATA_NOADVANCE (   FOR)    CROW_CALLBACK_DATA_(FOR, p - FOR##_mark, p - data)

◆ CROW_CALLBACK_NOTIFY

#define CROW_CALLBACK_NOTIFY (   FOR)    CROW_CALLBACK_NOTIFY_(FOR, p - data + 1)

◆ CROW_CALLBACK_NOTIFY_

#define CROW_CALLBACK_NOTIFY_ (   FOR,
  ER 
)
Value:
do { \
assert(CROW_HTTP_PARSER_ERRNO(parser) == HPE_OK); \
\
if (settings->on_##FOR) { \
if (0 != settings->on_##FOR(parser)) { \
CROW_SET_ERRNO(HPE_CB_##FOR); \
} \
\
/* We either errored above or got paused; get out */ \
if (CROW_HTTP_PARSER_ERRNO(parser) != HPE_OK) { \
return (ER); \
} \
} \
} while (0)
#define CROW_HTTP_PARSER_ERRNO(p)
Definition: http_parser_merged.h:201

◆ CROW_CALLBACK_NOTIFY_NOADVANCE

#define CROW_CALLBACK_NOTIFY_NOADVANCE (   FOR)    CROW_CALLBACK_NOTIFY_(FOR, p - data)

◆ CROW_CHUNKED

#define CROW_CHUNKED   "chunked"

◆ CROW_CLOSE

#define CROW_CLOSE   "close"

◆ CROW_CONNECTION

#define CROW_CONNECTION   "connection"

◆ CROW_CONTENT_LENGTH

#define CROW_CONTENT_LENGTH   "content-length"

◆ CROW_CR

#define CROW_CR   '\r'

◆ CROW_ELEM_AT

#define CROW_ELEM_AT (   a,
  i,
 
)    ((unsigned int) (i) < CROW_ARRAY_SIZE(a) ? (a)[(i)] : (v))

◆ CROW_HTTP_ERRNO_GEN

#define CROW_HTTP_ERRNO_GEN (   n,
  s 
)    HPE_##n,

◆ CROW_HTTP_ERRNO_MAP

#define CROW_HTTP_ERRNO_MAP (   CROW_XX)

◆ CROW_HTTP_MAX_HEADER_SIZE

#define CROW_HTTP_MAX_HEADER_SIZE   (80*1024)

◆ CROW_HTTP_METHOD_MAP

#define CROW_HTTP_METHOD_MAP (   CROW_XX)

◆ CROW_HTTP_PARSER_ERRNO

#define CROW_HTTP_PARSER_ERRNO (   p)    ((enum http_errno) (p)->http_errno)

◆ CROW_HTTP_PARSER_STRICT

#define CROW_HTTP_PARSER_STRICT   1

◆ CROW_HTTP_PARSER_VERSION_MAJOR

#define CROW_HTTP_PARSER_VERSION_MAJOR   2

◆ CROW_HTTP_PARSER_VERSION_MINOR

#define CROW_HTTP_PARSER_VERSION_MINOR   3

◆ CROW_HTTP_PARSER_VERSION_PATCH

#define CROW_HTTP_PARSER_VERSION_PATCH   0

◆ CROW_HTTP_STRERROR_GEN [1/2]

#define CROW_HTTP_STRERROR_GEN (   n,
  s 
)    { "HPE_" #n, s },

◆ CROW_HTTP_STRERROR_GEN [2/2]

#define CROW_HTTP_STRERROR_GEN (   n,
  s 
)    { "HPE_" #n, s },

◆ CROW_IS_ALPHA

#define CROW_IS_ALPHA (   c)    (CROW_LOWER(c) >= 'a' && CROW_LOWER(c) <= 'z')

◆ CROW_IS_ALPHANUM

#define CROW_IS_ALPHANUM (   c)    (CROW_IS_ALPHA(c) || CROW_IS_NUM(c))

◆ CROW_IS_HEX

#define CROW_IS_HEX (   c)    (CROW_IS_NUM(c) || (CROW_LOWER(c) >= 'a' && CROW_LOWER(c) <= 'f'))

◆ CROW_IS_HOST_CHAR

#define CROW_IS_HOST_CHAR (   c)    (CROW_IS_ALPHANUM(c) || (c) == '.' || (c) == '-')

◆ CROW_IS_MARK

#define CROW_IS_MARK (   c)
Value:
((c) == '-' || (c) == '_' || (c) == '.' || \
(c) == '!' || (c) == '~' || (c) == '*' || (c) == '\'' || (c) == '(' || \
(c) == ')')

◆ CROW_IS_NUM

#define CROW_IS_NUM (   c)    ((c) >= '0' && (c) <= '9')

◆ CROW_IS_URL_CHAR

#define CROW_IS_URL_CHAR (   c)    (CROW_BIT_AT(normal_url_char, (unsigned char)c))

◆ CROW_IS_USERINFO_CHAR

#define CROW_IS_USERINFO_CHAR (   c)
Value:
(CROW_IS_ALPHANUM(c) || CROW_IS_MARK(c) || (c) == '%' || \
(c) == ';' || (c) == ':' || (c) == '&' || (c) == '=' || (c) == '+' || \
(c) == '$' || (c) == ',')
#define CROW_IS_MARK(c)
Definition: http_parser_merged.h:588
#define CROW_IS_ALPHANUM(c)
Definition: http_parser_merged.h:586

◆ CROW_KEEP_ALIVE

#define CROW_KEEP_ALIVE   "keep-alive"

◆ CROW_LF

#define CROW_LF   '\n'

◆ CROW_LOWER

#define CROW_LOWER (   c)    (unsigned char)(c | 0x20)

◆ CROW_MARK

#define CROW_MARK (   FOR)
Value:
do { \
if (!FOR##_mark) { \
FOR##_mark = p; \
} \
} while (0)

◆ CROW_MIN

#define CROW_MIN (   a,
 
)    ((a) < (b) ? (a) : (b))

◆ CROW_NEW_MESSAGE

#define CROW_NEW_MESSAGE ( )    (http_should_keep_alive(parser) ? CROW_start_state : s_dead)

◆ CROW_PARSING_HEADER

#define CROW_PARSING_HEADER (   state)    (state <= s_headers_done)

◆ CROW_PROXY_CONNECTION

#define CROW_PROXY_CONNECTION   "proxy-connection"

◆ CROW_SET_ERRNO

#define CROW_SET_ERRNO (   e)
Value:
do { \
parser->http_errno = (e); \
} while(0)

◆ CROW_start_state

#define CROW_start_state   (parser->type == HTTP_REQUEST ? s_start_req : s_start_res)

◆ CROW_STRICT_CHECK

#define CROW_STRICT_CHECK (   cond)
Value:
do { \
if (cond) { \
CROW_SET_ERRNO(HPE_STRICT); \
goto error; \
} \
} while (0)

◆ CROW_T

#define CROW_T (   v)    0

◆ CROW_TOKEN

#define CROW_TOKEN (   c)    (tokens[(unsigned char)c])

◆ CROW_TRANSFER_ENCODING

#define CROW_TRANSFER_ENCODING   "transfer-encoding"

◆ CROW_ULLONG_MAX

#define CROW_ULLONG_MAX   ((uint64_t) -1) /* 2^64-1 */

◆ CROW_UPGRADE

#define CROW_UPGRADE   "upgrade"

◆ CROW_XX [1/3]

#define CROW_XX (   num,
  name,
  string 
)    HTTP_##name = num,

◆ CROW_XX [2/3]

#define CROW_XX (   num,
  name,
  string 
)    #string,

◆ CROW_XX [3/3]

#define CROW_XX (   num,
  name,
  string 
)    #string,

Typedef Documentation

◆ http_cb

typedef int(* http_cb) (http_parser *)

◆ http_data_cb

typedef int(* http_data_cb) (http_parser *, const char *at, size_t length)

◆ http_parser

typedef struct http_parser http_parser

◆ http_parser_settings

Enumeration Type Documentation

◆ flags

enum flags
Enumerator
F_CHUNKED 
F_CONNECTION_KEEP_ALIVE 
F_CONNECTION_CLOSE 
F_TRAILING 
F_UPGRADE 
F_SKIPBODY 

◆ header_states

Enumerator
h_general 
h_C 
h_CO 
h_CON 
h_matching_connection 
h_matching_proxy_connection 
h_matching_content_length 
h_matching_transfer_encoding 
h_matching_upgrade 
h_connection 
h_content_length 
h_transfer_encoding 
h_upgrade 
h_matching_transfer_encoding_chunked 
h_matching_connection_keep_alive 
h_matching_connection_close 
h_transfer_encoding_chunked 
h_connection_keep_alive 
h_connection_close 

◆ http_errno

enum http_errno

◆ http_host_state

Enumerator
s_http_host_dead 
s_http_userinfo_start 
s_http_userinfo 
s_http_host_start 
s_http_host_v6_start 
s_http_host 
s_http_host_v6 
s_http_host_v6_end 
s_http_host_port_start 
s_http_host_port 

◆ http_method

◆ http_parser_type

Enumerator
HTTP_REQUEST 
HTTP_RESPONSE 
HTTP_BOTH 

◆ http_parser_url_fields

Enumerator
UF_SCHEMA 
UF_HOST 
UF_PORT 
UF_PATH 
UF_QUERY 
UF_FRAGMENT 
UF_USERINFO 
UF_MAX 

◆ state

enum state
Enumerator
s_dead 
s_start_req_or_res 
s_res_or_resp_H 
s_start_res 
s_res_H 
s_res_HT 
s_res_HTT 
s_res_HTTP 
s_res_first_http_major 
s_res_http_major 
s_res_first_http_minor 
s_res_http_minor 
s_res_first_status_code 
s_res_status_code 
s_res_status_start 
s_res_status 
s_res_line_almost_done 
s_start_req 
s_req_method 
s_req_spaces_before_url 
s_req_schema 
s_req_schema_slash 
s_req_schema_slash_slash 
s_req_server_start 
s_req_server 
s_req_server_with_at 
s_req_path 
s_req_query_string_start 
s_req_query_string 
s_req_fragment_start 
s_req_fragment 
s_req_http_start 
s_req_http_H 
s_req_http_HT 
s_req_http_HTT 
s_req_http_HTTP 
s_req_first_http_major 
s_req_http_major 
s_req_first_http_minor 
s_req_http_minor 
s_req_line_almost_done 
s_header_field_start 
s_header_field 
s_header_value_discard_ws 
s_header_value_discard_ws_almost_done 
s_header_value_discard_lws 
s_header_value_start 
s_header_value 
s_header_value_lws 
s_header_almost_done 
s_chunk_size_start 
s_chunk_size 
s_chunk_parameters 
s_chunk_size_almost_done 
s_headers_almost_done 
s_headers_done 
s_chunk_data 
s_chunk_data_almost_done 
s_chunk_data_done 
s_body_identity 
s_body_identity_eof 
s_message_done 

Function Documentation

◆ http_body_is_final() [1/2]

int http_body_is_final ( const http_parser parser)

◆ http_body_is_final() [2/2]

int http_body_is_final ( const struct http_parser parser)
inline

◆ http_errno_description()

const char * http_errno_description ( enum http_errno  err)
inline

◆ http_errno_name()

const char * http_errno_name ( enum http_errno  err)
inline

◆ http_message_needs_eof()

int http_message_needs_eof ( const http_parser parser)
inline

◆ http_method_str()

const char * http_method_str ( enum http_method  m)
inline

◆ http_parse_host()

int http_parse_host ( const char *  buf,
struct http_parser_url u,
int  found_at 
)
inline

◆ http_parse_host_char()

static enum http_host_state http_parse_host_char ( enum http_host_state  s,
const char  ch 
)
inlinestatic

◆ http_parser_execute()

size_t http_parser_execute ( http_parser parser,
const http_parser_settings settings,
const char *  data,
size_t  len 
)
inline

◆ http_parser_init()

void http_parser_init ( http_parser parser,
enum http_parser_type  type 
)
inline

◆ http_parser_parse_url()

int http_parser_parse_url ( const char *  buf,
size_t  buflen,
int  is_connect,
struct http_parser_url u 
)
inline

◆ http_parser_pause()

void http_parser_pause ( http_parser parser,
int  paused 
)
inline

◆ http_parser_version()

unsigned long http_parser_version ( void  )
inline

◆ http_should_keep_alive()

int http_should_keep_alive ( const http_parser parser)
inline

◆ parse_url_char()

enum state parse_url_char ( enum state  s,
const char  ch 
)
inline