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); | ||||
| 
 | ||||
| extern const step http_default_res_steps[HTTP_LOOP_MAX_STEPS]; | ||||
| 
 | ||||
| /**
 | ||||
|  * Struct describing a route a request can take. | ||||
|  */ | ||||
|  |  | |||
|  | @ -4,6 +4,9 @@ | |||
| #include "http_loop.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) { | ||||
|   // Prevents the request handler function from looping indefinitely without
 | ||||
|   // 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) { | ||||
|   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) && | ||||
|          (ctx->route->steps_res[ctx->current_step] != NULL) && | ||||
|          ctx->route->steps_res[ctx->current_step](conn)) { | ||||
|          (steps[ctx->current_step] != NULL) && steps[ctx->current_step](conn)) { | ||||
|     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
 | ||||
|   // prepare for a new request
 | ||||
|   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); | ||||
| 
 | ||||
|     conn->state = event_loop_conn_state_req; | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue