parent
3813b96b7d
commit
8eb57bef1e
src
20
src/uhttp.c
20
src/uhttp.c
|
@ -163,6 +163,17 @@ static int on_header_value(http_parser *parser, const char *at, size_t len)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int on_headers_complete(http_parser *parser)
|
||||||
|
{
|
||||||
|
struct uh_connection *con = container_of(parser, struct uh_connection, parser);
|
||||||
|
|
||||||
|
if (parser->method != HTTP_GET && parser->method != HTTP_POST) {
|
||||||
|
uh_send_error(con, UH_STATUS_METHOD_NOT_ALLOWED, NULL);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int on_body(http_parser *parser, const char *at, size_t len)
|
static int on_body(http_parser *parser, const char *at, size_t len)
|
||||||
{
|
{
|
||||||
struct uh_connection *con = container_of(parser, struct uh_connection, parser);
|
struct uh_connection *con = container_of(parser, struct uh_connection, parser);
|
||||||
|
@ -220,6 +231,7 @@ static http_parser_settings parser_settings = {
|
||||||
.on_url = on_url,
|
.on_url = on_url,
|
||||||
.on_header_field = on_header_field,
|
.on_header_field = on_header_field,
|
||||||
.on_header_value = on_header_value,
|
.on_header_value = on_header_value,
|
||||||
|
.on_headers_complete = on_headers_complete,
|
||||||
.on_body = on_body,
|
.on_body = on_body,
|
||||||
.on_message_complete = on_message_complete
|
.on_message_complete = on_message_complete
|
||||||
};
|
};
|
||||||
|
@ -276,7 +288,7 @@ handshake_done:
|
||||||
}
|
}
|
||||||
|
|
||||||
parsered = http_parser_execute(&con->parser, &parser_settings, base, len);
|
parsered = http_parser_execute(&con->parser, &parser_settings, base, len);
|
||||||
if (unlikely(parsered != len)){
|
if (unlikely(parsered != len && !(con->flags & UH_CON_CLOSE))) {
|
||||||
uh_log_err("http parser failed:%s", http_errno_description(HTTP_PARSER_ERRNO(&con->parser)));
|
uh_log_err("http parser failed:%s", http_errno_description(HTTP_PARSER_ERRNO(&con->parser)));
|
||||||
uh_send_error(con, UH_STATUS_BAD_REQUEST, NULL);
|
uh_send_error(con, UH_STATUS_BAD_REQUEST, NULL);
|
||||||
} else {
|
} else {
|
||||||
|
@ -491,12 +503,8 @@ void uh_send_error(struct uh_connection *con, int code, const char *reason)
|
||||||
uh_send_head(con, code, strlen(reason), "Content-Type: text/plain\r\nConnection: keep-alive\r\n");
|
uh_send_head(con, code, strlen(reason), "Content-Type: text/plain\r\nConnection: keep-alive\r\n");
|
||||||
} else {
|
} else {
|
||||||
uh_send_head(con, code, strlen(reason), "Content-Type: text/plain\r\nConnection: close\r\n");
|
uh_send_head(con, code, strlen(reason), "Content-Type: text/plain\r\nConnection: close\r\n");
|
||||||
|
con->flags |= UH_CON_CLOSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (parser->method != HTTP_HEAD)
|
|
||||||
uh_send(con, reason, strlen(reason));
|
|
||||||
|
|
||||||
con->flags |= UH_CON_CLOSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void uh_redirect(struct uh_connection *con, int code, const char *location)
|
void uh_redirect(struct uh_connection *con, int code, const char *location)
|
||||||
|
|
Loading…
Reference in New Issue