fix(http): don't segfault on non-routed requests
parent
711eaa2bde
commit
72fae76ef6
|
@ -34,6 +34,8 @@ typedef enum http_route_type {
|
||||||
*/
|
*/
|
||||||
typedef bool (*step)(event_loop_conn *conn);
|
typedef bool (*step)(event_loop_conn *conn);
|
||||||
|
|
||||||
|
extern const step http_default_res_steps[HTTP_LOOP_MAX_STEPS];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Struct describing a route a request can take.
|
* Struct describing a route a request can take.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -4,6 +4,9 @@
|
||||||
#include "http_loop.h"
|
#include "http_loop.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
|
||||||
|
const step http_default_res_steps[HTTP_LOOP_MAX_STEPS] = {
|
||||||
|
http_loop_step_write_header, http_loop_step_write_body, NULL};
|
||||||
|
|
||||||
bool http_loop_handle_request(event_loop_conn *conn) {
|
bool http_loop_handle_request(event_loop_conn *conn) {
|
||||||
// Prevents the request handler function from looping indefinitely without
|
// Prevents the request handler function from looping indefinitely without
|
||||||
// ever consuming new data
|
// ever consuming new data
|
||||||
|
|
|
@ -105,9 +105,12 @@ bool http_loop_step_write_body(event_loop_conn *conn) {
|
||||||
void http_loop_handle_response(event_loop_conn *conn) {
|
void http_loop_handle_response(event_loop_conn *conn) {
|
||||||
http_loop_ctx *ctx = conn->ctx;
|
http_loop_ctx *ctx = conn->ctx;
|
||||||
|
|
||||||
|
// Non-routed requests also need to be processed
|
||||||
|
const step *steps =
|
||||||
|
ctx->route != NULL ? ctx->route->steps_res : http_default_res_steps;
|
||||||
|
|
||||||
while ((conn->state == event_loop_conn_state_res) &&
|
while ((conn->state == event_loop_conn_state_res) &&
|
||||||
(ctx->route->steps_res[ctx->current_step] != NULL) &&
|
(steps[ctx->current_step] != NULL) && steps[ctx->current_step](conn)) {
|
||||||
ctx->route->steps_res[ctx->current_step](conn)) {
|
|
||||||
ctx->current_step++;
|
ctx->current_step++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -115,7 +118,7 @@ void http_loop_handle_response(event_loop_conn *conn) {
|
||||||
// After response processing has finished its work, we reset the context to
|
// After response processing has finished its work, we reset the context to
|
||||||
// prepare for a new request
|
// prepare for a new request
|
||||||
if ((conn->state != event_loop_conn_state_res) ||
|
if ((conn->state != event_loop_conn_state_res) ||
|
||||||
(ctx->route->steps_res[ctx->current_step] == NULL)) {
|
(steps[ctx->current_step] == NULL)) {
|
||||||
http_loop_ctx_reset(ctx);
|
http_loop_ctx_reset(ctx);
|
||||||
|
|
||||||
conn->state = event_loop_conn_state_req;
|
conn->state = event_loop_conn_state_req;
|
||||||
|
|
Loading…
Reference in New Issue