Allow aborting the FastCGI protocol parser

This commit is contained in:
Přemysl Eric Janouch 2018-10-18 04:08:47 +02:00
parent 9494e8e2af
commit 3e4e4e5103
Signed by: p
GPG Key ID: A0420B94F92B9493
2 changed files with 9 additions and 7 deletions

View File

@ -792,7 +792,8 @@ enum fcgi_protocol_status
struct fcgi_parser; struct fcgi_parser;
typedef void (*fcgi_message_fn) /// Message handler, returns false if further processing should be stopped
typedef bool (*fcgi_message_fn)
(const struct fcgi_parser *parser, void *user_data); (const struct fcgi_parser *parser, void *user_data);
enum fcgi_parser_state enum fcgi_parser_state
@ -854,7 +855,7 @@ fcgi_parser_unpack_header (struct fcgi_parser *self)
str_remove_slice (&self->input, 0, unpacker.offset); str_remove_slice (&self->input, 0, unpacker.offset);
} }
static void static bool
fcgi_parser_push (struct fcgi_parser *self, const void *data, size_t len) fcgi_parser_push (struct fcgi_parser *self, const void *data, size_t len)
{ {
// This could be made considerably faster for high-throughput applications // This could be made considerably faster for high-throughput applications
@ -866,14 +867,14 @@ fcgi_parser_push (struct fcgi_parser *self, const void *data, size_t len)
{ {
case FCGI_READING_HEADER: case FCGI_READING_HEADER:
if (self->input.len < FCGI_HEADER_LEN) if (self->input.len < FCGI_HEADER_LEN)
return; return true;
fcgi_parser_unpack_header (self); fcgi_parser_unpack_header (self);
self->state = FCGI_READING_CONTENT; self->state = FCGI_READING_CONTENT;
break; break;
case FCGI_READING_CONTENT: case FCGI_READING_CONTENT:
if (self->input.len < self->content_length) if (self->input.len < self->content_length)
return; return true;
// Move an appropriate part of the input buffer to the content buffer // Move an appropriate part of the input buffer to the content buffer
str_reset (&self->content); str_reset (&self->content);
@ -883,10 +884,11 @@ fcgi_parser_push (struct fcgi_parser *self, const void *data, size_t len)
break; break;
case FCGI_READING_PADDING: case FCGI_READING_PADDING:
if (self->input.len < self->padding_length) if (self->input.len < self->padding_length)
return; return true;
// Call the callback to further process the message // Call the callback to further process the message
self->on_message (self, self->user_data); if (!self->on_message (self, self->user_data))
return false;
// Remove the padding from the input buffer // Remove the padding from the input buffer
str_remove_slice (&self->input, 0, self->padding_length); str_remove_slice (&self->input, 0, self->padding_length);

View File

@ -1093,7 +1093,7 @@ struct async
LIST_HEADER (struct async) LIST_HEADER (struct async)
struct async_manager *manager; ///< Our manager object struct async_manager *manager; ///< Our manager object
// "cancelled" may not be accesed or modified by the worker thread // "cancelled" may not be accessed or modified by the worker thread
pthread_t worker; ///< Worker thread ID pthread_t worker; ///< Worker thread ID
bool started; ///< Worker thread ID is valid bool started; ///< Worker thread ID is valid