From 14ded260a0d8e364f2edb895e915c623e1ab7ce7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=99emysl=20Janouch?= Date: Mon, 15 Oct 2018 03:02:49 +0200 Subject: Clarify and degrade FastCGI multiplexing No need to support more than 255 concurrent requests on one connection. --- demo-json-rpc-server.c | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/demo-json-rpc-server.c b/demo-json-rpc-server.c index fa7f833..aa56563 100644 --- a/demo-json-rpc-server.c +++ b/demo-json-rpc-server.c @@ -124,10 +124,6 @@ struct fcgi_muxer // TODO: bool quitting; that causes us to reject all requests? - /// Requests assigned to request IDs - // TODO: allocate this dynamically - struct fcgi_request *requests[1 << 16]; - void (*write_cb) (void *user_data, const void *data, size_t len); void (*close_cb) (void *user_data); @@ -136,6 +132,9 @@ struct fcgi_muxer void (*request_destroy_cb) (void *handler_data); void *user_data; ///< User data for callbacks + + /// Requests assigned to request IDs (may not be FCGI_NULL_REQUEST_ID) + struct fcgi_request *requests[1 << 8]; }; static void @@ -284,18 +283,21 @@ fcgi_muxer_on_get_values nv_parser.output = &values; fcgi_nv_parser_push (&nv_parser, parser->content.str, parser->content.len); + const char *key = NULL; - struct str_map_iter iter = str_map_iter_make (&values); - while (str_map_iter_next (&iter)) - { - const char *key = iter.link->key; + // No real-world servers seem to actually use multiplexing + // or even issue this request, but we will implement it anyway + if (str_map_find (&values, (key = FCGI_MPXS_CONNS))) + str_map_set (&response, key, xstrdup ("1")); - // TODO: if (!strcmp (key, FCGI_MAX_CONNS)) - // TODO: if (!strcmp (key, FCGI_MAX_REQS)) + // It's not clear whether FCGI_MAX_REQS means concurrently over all + // connections or over just a single connection (multiplexed), though + // supposedly it's actually per /web server/. Supply the strictest limit. + if (str_map_find (&values, (key = FCGI_MAX_REQS))) + str_map_set (&response, key, + xstrdup_printf ("%zu", N_ELEMENTS (self->requests) - 1)); - if (!strcmp (key, FCGI_MPXS_CONNS)) - str_map_set (&response, key, xstrdup ("1")); - } + // FCGI_MAX_CONNS would be basically infinity. We don't limit connections. struct str content = str_make (); fcgi_nv_convert (&response, &content); -- cgit v1.2.3