Nebula
Nebula
http_parser.c 文件参考
+ http_parser.c 的引用(Include)关系图:

宏定义

#define ULLONG_MAX   ((uint64_t) -1) /* 2^64-1 */
 
#define MIN(a, b)   ((a) < (b) ? (a) : (b))
 
#define ARRAY_SIZE(a)   (sizeof(a) / sizeof((a)[0]))
 
#define BIT_AT(a, i)
 
#define ELEM_AT(a, i, v)   ((unsigned int) (i) < ARRAY_SIZE(a) ? (a)[(i)] : (v))
 
#define SET_ERRNO(e)
 
#define CURRENT_STATE()   p_state
 
#define UPDATE_STATE(V)   p_state = (enum state) (V);
 
#define RETURN(V)
 
#define REEXECUTE()   goto reexecute; \
 
#define LIKELY(X)   (X)
 
#define UNLIKELY(X)   (X)
 
#define CALLBACK_NOTIFY_(FOR, ER)
 
#define CALLBACK_NOTIFY(FOR)   CALLBACK_NOTIFY_(FOR, p - data + 1)
 
#define CALLBACK_NOTIFY_NOADVANCE(FOR)   CALLBACK_NOTIFY_(FOR, p - data)
 
#define CALLBACK_DATA_(FOR, LEN, ER)
 
#define CALLBACK_DATA(FOR)   CALLBACK_DATA_(FOR, p - FOR##_mark, p - data + 1)
 
#define CALLBACK_DATA_NOADVANCE(FOR)   CALLBACK_DATA_(FOR, p - FOR##_mark, p - data)
 
#define MARK(FOR)
 
#define COUNT_HEADER_SIZE(V)
 
#define PROXY_CONNECTION   "proxy-connection"
 
#define CONNECTION   "connection"
 
#define CONTENT_LENGTH   "content-length"
 
#define TRANSFER_ENCODING   "transfer-encoding"
 
#define UPGRADE   "upgrade"
 
#define CHUNKED   "chunked"
 
#define KEEP_ALIVE   "keep-alive"
 
#define CLOSE   "close"
 
#define XX(num, name, string)   #string,
 
#define T(v)   0
 
#define PARSING_HEADER(state)   (state <= s_headers_done)
 
#define CR   '\r'
 
#define LF   '\n'
 
#define LOWER(c)   (unsigned char)(c | 0x20)
 
#define IS_ALPHA(c)   (LOWER(c) >= 'a' && LOWER(c) <= 'z')
 
#define IS_NUM(c)   ((c) >= '0' && (c) <= '9')
 
#define IS_ALPHANUM(c)   (IS_ALPHA(c) || IS_NUM(c))
 
#define IS_HEX(c)   (IS_NUM(c) || (LOWER(c) >= 'a' && LOWER(c) <= 'f'))
 
#define IS_MARK(c)
 
#define IS_USERINFO_CHAR(c)
 
#define STRICT_TOKEN(c)   ((c == ' ') ? 0 : tokens[(unsigned char)c])
 
#define TOKEN(c)   STRICT_TOKEN(c)
 
#define IS_URL_CHAR(c)   (BIT_AT(normal_url_char, (unsigned char)c))
 
#define IS_HOST_CHAR(c)   (IS_ALPHANUM(c) || (c) == '.' || (c) == '-')
 
#define IS_HEADER_CHAR(ch)   (ch == CR || ch == LF || ch == 9 || ((unsigned char)ch > 31 && ch != 127))
 
#define start_state   (parser->type == HTTP_REQUEST ? s_start_req : s_start_res)
 
#define STRICT_CHECK(cond)
 
#define NEW_MESSAGE()   (http_should_keep_alive(parser) ? start_state : s_dead)
 
#define HTTP_STRERROR_GEN(n, s)   { "HPE_" #n, s },
 
#define XX(meth, pos, ch, new_meth)
 
#define XX(num, name, string)   case HTTP_STATUS_##name: return #string;
 

枚举

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_http_major, s_res_http_dot, s_res_http_minor, s_res_http_end,
  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_http_major, s_req_http_dot, s_req_http_minor, s_req_http_end,
  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_content_length_num,
  h_content_length_ws, h_transfer_encoding, h_upgrade, h_matching_transfer_encoding_chunked,
  h_matching_connection_token_start, h_matching_connection_keep_alive, h_matching_connection_close, h_matching_connection_upgrade,
  h_matching_connection_token, h_transfer_encoding_chunked, h_connection_keep_alive, h_connection_close,
  h_connection_upgrade
}
 
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_v6_zone_start, s_http_host_v6_zone, s_http_host_port_start, s_http_host_port
}
 

函数

int http_message_needs_eof (const http_parser *parser)
 
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_status_str (enum http_status s)
 
void http_parser_init (http_parser *parser, enum http_parser_type t)
 
void http_parser_settings_init (http_parser_settings *settings)
 
const char * http_errno_name (enum http_errno err)
 
const char * http_errno_description (enum http_errno err)
 
void http_parser_url_init (struct http_parser_url *u)
 
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 struct http_parser *parser)
 
unsigned long http_parser_version (void)
 

宏定义说明

#define ARRAY_SIZE (   a)    (sizeof(a) / sizeof((a)[0]))
#define BIT_AT (   a,
 
)
值:
(!!((unsigned int) (a)[(unsigned int) (i) >> 3] & \
(1 << ((unsigned int) (i) & 7))))
#define CALLBACK_DATA (   FOR)    CALLBACK_DATA_(FOR, p - FOR##_mark, p - data + 1)
#define CALLBACK_DATA_ (   FOR,
  LEN,
  ER 
)
值:
do { \
assert(HTTP_PARSER_ERRNO(parser) == HPE_OK); \
\
if (FOR##_mark) { \
if (LIKELY(settings->on_##FOR)) { \
parser->state = CURRENT_STATE(); \
if (UNLIKELY(0 != \
settings->on_##FOR(parser, FOR##_mark, (LEN)))) { \
SET_ERRNO(HPE_CB_##FOR); \
} \
UPDATE_STATE(parser->state); \
\
/* We either errored above or got paused; get out */ \
if (UNLIKELY(HTTP_PARSER_ERRNO(parser) != HPE_OK)) { \
return (ER); \
} \
} \
FOR##_mark = NULL; \
} \
} while (0)
#define UNLIKELY(X)
Definition: http_parser.c:73
#define LIKELY(X)
Definition: http_parser.c:72
#define CURRENT_STATE()
Definition: http_parser.c:56
#define UPDATE_STATE(V)
Definition: http_parser.c:57
#define HTTP_PARSER_ERRNO(p)
Definition: http_parser.h:290
#define SET_ERRNO(e)
Definition: http_parser.c:50
#define CALLBACK_DATA_NOADVANCE (   FOR)    CALLBACK_DATA_(FOR, p - FOR##_mark, p - data)
#define CALLBACK_NOTIFY (   FOR)    CALLBACK_NOTIFY_(FOR, p - data + 1)
#define CALLBACK_NOTIFY_ (   FOR,
  ER 
)
值:
do { \
assert(HTTP_PARSER_ERRNO(parser) == HPE_OK); \
\
if (LIKELY(settings->on_##FOR)) { \
parser->state = CURRENT_STATE(); \
if (UNLIKELY(0 != settings->on_##FOR(parser))) { \
SET_ERRNO(HPE_CB_##FOR); \
} \
UPDATE_STATE(parser->state); \
\
/* We either errored above or got paused; get out */ \
if (UNLIKELY(HTTP_PARSER_ERRNO(parser) != HPE_OK)) { \
return (ER); \
} \
} \
} while (0)
#define UNLIKELY(X)
Definition: http_parser.c:73
#define LIKELY(X)
Definition: http_parser.c:72
#define CURRENT_STATE()
Definition: http_parser.c:56
#define UPDATE_STATE(V)
Definition: http_parser.c:57
#define HTTP_PARSER_ERRNO(p)
Definition: http_parser.h:290
#define SET_ERRNO(e)
Definition: http_parser.c:50
#define CALLBACK_NOTIFY_NOADVANCE (   FOR)    CALLBACK_NOTIFY_(FOR, p - data)
#define CHUNKED   "chunked"
#define CLOSE   "close"
#define CONNECTION   "connection"
#define CONTENT_LENGTH   "content-length"
#define COUNT_HEADER_SIZE (   V)
值:
do { \
nread += (V); \
if (UNLIKELY(nread > (HTTP_MAX_HEADER_SIZE))) { \
SET_ERRNO(HPE_HEADER_OVERFLOW); \
goto error; \
} \
} while (0)
#define HTTP_MAX_HEADER_SIZE
Definition: http_parser.h:63
#define UNLIKELY(X)
Definition: http_parser.c:73
#define SET_ERRNO(e)
Definition: http_parser.c:50
#define CR   '\r'
#define CURRENT_STATE ( )    p_state
#define ELEM_AT (   a,
  i,
 
)    ((unsigned int) (i) < ARRAY_SIZE(a) ? (a)[(i)] : (v))
#define HTTP_STRERROR_GEN (   n,
 
)    { "HPE_" #n, s },
#define IS_ALPHA (   c)    (LOWER(c) >= 'a' && LOWER(c) <= 'z')
#define IS_ALPHANUM (   c)    (IS_ALPHA(c) || IS_NUM(c))
#define IS_HEADER_CHAR (   ch)    (ch == CR || ch == LF || ch == 9 || ((unsigned char)ch > 31 && ch != 127))

Verify that a char is a valid visible (printable) US-ASCII character or x80-FF

#define IS_HEX (   c)    (IS_NUM(c) || (LOWER(c) >= 'a' && LOWER(c) <= 'f'))
#define IS_HOST_CHAR (   c)    (IS_ALPHANUM(c) || (c) == '.' || (c) == '-')
#define IS_MARK (   c)
值:
((c) == '-' || (c) == '_' || (c) == '.' || \
(c) == '!' || (c) == '~' || (c) == '*' || (c) == '\'' || (c) == '(' || \
(c) == ')')
#define IS_NUM (   c)    ((c) >= '0' && (c) <= '9')
#define IS_URL_CHAR (   c)    (BIT_AT(normal_url_char, (unsigned char)c))
#define IS_USERINFO_CHAR (   c)
值:
(IS_ALPHANUM(c) || IS_MARK(c) || (c) == '%' || \
(c) == ';' || (c) == ':' || (c) == '&' || (c) == '=' || (c) == '+' || \
(c) == '$' || (c) == ',')
#define IS_ALPHANUM(c)
Definition: http_parser.c:415
#define IS_MARK(c)
Definition: http_parser.c:417
#define KEEP_ALIVE   "keep-alive"
#define LF   '\n'
#define LIKELY (   X)    (X)
#define LOWER (   c)    (unsigned char)(c | 0x20)
#define MARK (   FOR)
值:
do { \
if (!FOR##_mark) { \
FOR##_mark = p; \
} \
} while (0)
#define MIN (   a,
 
)    ((a) < (b) ? (a) : (b))
#define NEW_MESSAGE ( )    (http_should_keep_alive(parser) ? start_state : s_dead)
#define PARSING_HEADER (   state)    (state <= s_headers_done)
#define PROXY_CONNECTION   "proxy-connection"
#define REEXECUTE ( )    goto reexecute; \
#define RETURN (   V)
值:
do { \
parser->nread = nread; \
parser->state = CURRENT_STATE(); \
return (V); \
} while (0);
#define CURRENT_STATE()
Definition: http_parser.c:56
#define SET_ERRNO (   e)
值:
do { \
parser->nread = nread; \
parser->http_errno = (e); \
} while(0)
#define start_state   (parser->type == HTTP_REQUEST ? s_start_req : s_start_res)
#define STRICT_CHECK (   cond)
值:
do { \
if (cond) { \
SET_ERRNO(HPE_STRICT); \
goto error; \
} \
} while (0)
#define SET_ERRNO(e)
Definition: http_parser.c:50
#define STRICT_TOKEN (   c)    ((c == ' ') ? 0 : tokens[(unsigned char)c])
#define T (   v)    0
#define TOKEN (   c)    STRICT_TOKEN(c)
#define TRANSFER_ENCODING   "transfer-encoding"
#define ULLONG_MAX   ((uint64_t) -1) /* 2^64-1 */
#define UNLIKELY (   X)    (X)
#define UPDATE_STATE (   V)    p_state = (enum state) (V);
#define UPGRADE   "upgrade"
#define XX (   num,
  name,
  string 
)    #string,
#define XX (   meth,
  pos,
  ch,
  new_meth 
)
值:
case (HTTP_##meth << 16 | pos << 8 | ch): \
parser->method = HTTP_##new_meth; break;
#define XX (   num,
  name,
  string 
)    case HTTP_STATUS_##name: return #string;

枚举类型说明

枚举值
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_content_length_num 
h_content_length_ws 
h_transfer_encoding 
h_upgrade 
h_matching_transfer_encoding_chunked 
h_matching_connection_token_start 
h_matching_connection_keep_alive 
h_matching_connection_close 
h_matching_connection_upgrade 
h_matching_connection_token 
h_transfer_encoding_chunked 
h_connection_keep_alive 
h_connection_close 
h_connection_upgrade 
枚举值
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_v6_zone_start 
s_http_host_v6_zone 
s_http_host_port_start 
s_http_host_port 
enum state
枚举值
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_http_major 
s_res_http_dot 
s_res_http_minor 
s_res_http_end 
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_http_major 
s_req_http_dot 
s_req_http_minor 
s_req_http_end 
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 

函数说明

int http_body_is_final ( const struct http_parser parser)
const char* http_errno_description ( enum http_errno  err)
const char* http_errno_name ( enum http_errno  err)

+ 这是这个函数的调用关系图:

int http_message_needs_eof ( const http_parser parser)

+ 这是这个函数的调用关系图:

const char* http_method_str ( enum http_method  m)

+ 这是这个函数的调用关系图:

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

+ 函数调用图:

+ 这是这个函数的调用关系图:

void http_parser_init ( http_parser parser,
enum http_parser_type  t 
)

+ 这是这个函数的调用关系图:

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 
)
void http_parser_settings_init ( http_parser_settings settings)
void http_parser_url_init ( struct http_parser_url u)
unsigned long http_parser_version ( void  )
int http_should_keep_alive ( const http_parser parser)

+ 函数调用图:

+ 这是这个函数的调用关系图:

const char* http_status_str ( enum http_status  s)

变量说明

const char* description
const char* name