|
HTTP Parser and message builder / objects in plain C Snapshot
|
parser of http responses More...
Classes | |
| struct | tagHTTP_RESPONSE_PARSER |
Typedefs | |
| typedef struct tagHTTP_RESPONSE_PARSER | HTTP_RESPONSE_PARSER |
Functions | |
| int | HTTP_RESPONSE_PARSER_init (HTTP_RESPONSE_PARSER *parser, HTTP_RESP_HEADER_PARSED header_parsed, HTTP_RESP_MESSAGE_BODY_DATA on_message_body_data, HTTP_RESP_FINISHED on_request_finished, void *ctx) |
| initialise request parser object | |
| PARSER_STATUS | HTTP_RESPONSE_PARSER_process (HTTP_RESPONSE_PARSER *parser, HTTP_RESPONSE *response, BF *data) |
| parse a http response | |
parser of http responses
| typedef struct tagHTTP_RESPONSE_PARSER HTTP_RESPONSE_PARSER |
| int HTTP_RESPONSE_PARSER_init | ( | HTTP_RESPONSE_PARSER * | parser, |
| HTTP_RESP_HEADER_PARSED | header_parsed, | ||
| HTTP_RESP_MESSAGE_BODY_DATA | on_message_body_data, | ||
| HTTP_RESP_FINISHED | on_request_finished, | ||
| void * | ctx | ||
| ) |
initialise request parser object
Definition at line 822 of file http.c.
{
parser->ctx = ctx;
parser->ev_header = header_parsed;
parser->ev_body = on_message_body_data;
parser->ev_finish = on_request_finished;
if (! HTTP_PARSER_init( &parser->base )) {
return -1;
}
if (init_parsers_general_header( &parser->base ) ) {
return -1;
}
return 0;
}
| PARSER_STATUS HTTP_RESPONSE_PARSER_process | ( | HTTP_RESPONSE_PARSER * | parser, |
| HTTP_RESPONSE * | response, | ||
| BF * | data | ||
| ) |
parse a http response
Definition at line 845 of file http.c.
{
int rt, eof_header;
while(1) {
switch( parser->base.state ) {
case HTTP_STATE_PARSING_REQUEST_LINE:
rt = parse_response_line( response, bf );
if (rt != 0) {
goto resp_do_return;
}
parser->base.state = HTTP_STATE_PARSING_HEADERS; //
//break; - fall through
case HTTP_STATE_PARSING_HEADERS:
rt = HTTP_parse_header_line( (HTTP_PARSER *) parser, (HTTP_MESSAGE *) response, bf, &eof_header );
if (rt != 0) {
goto resp_do_return;
}
if (eof_header) {
// eof parsing http header.
parser->ev_header( response, parser->ctx );
if (response->base.flags & HTTP_MESSAGE_FLAG_TRANSFER_CHUNKED) {
parser->base.state = HTTP_STATE_PARSING_BODY_CHUNK_HEADER;
continue;
}
if (response->base.flags & HTTP_MESSAGE_FLAG_HAS_CONTENT_LENGTH) {
HTTP_PARSER_content_length_init( &parser->base, &response->base );
continue;
}
next_response:
HTTP_RESPONSE_free( response );
parser->ev_finish( response, parser->ctx );
parser->base.state = HTTP_STATE_PARSING_REQUEST_LINE;
BF_compact(bf);
return PARSER_STATUS_COMPLETED;
}
break;
case HTTP_STATE_PARSING_BODY_CONTENT_LENGTH:
rt = HTTP_PARSER_content_length_process(
&parser->base, bf,
(HTTP_PROCESS_MSG_DATA) parser->ev_body,
&response->base, parser->ctx);
if (rt != 0) {
goto resp_do_return;
}
goto next_response;
default: // remaining states deal with chunks
rt = HTTP_PARSER_chunked_data_process(
&parser->base, bf,
(HTTP_PROCESS_MSG_DATA) parser->ev_body,
&response->base, parser->ctx);
if (rt != 0) {
goto resp_do_return;
}
goto next_response;
}
}
resp_do_return:
if (rt == PARSER_STATUS_NEED_MORE_DATA) {
BF_compact( bf );
}
return rt;
}
1.7.4