fix(http): don't segfault on non-routed requests

lsm
Jef Roosens 2023-11-03 14:41:55 +01:00
parent 711eaa2bde
commit 72fae76ef6
Signed by: Jef Roosens
GPG Key ID: B75D4F293C7052DB
3 changed files with 11 additions and 3 deletions

View File

@ -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.
*/ */

View File

@ -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

View File

@ -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;