diff options
author | Přemysl Janouch <p@janouch.name> | 2018-10-15 03:02:49 +0200 |
---|---|---|
committer | Přemysl Janouch <p@janouch.name> | 2018-10-15 03:02:49 +0200 |
commit | 14ded260a0d8e364f2edb895e915c623e1ab7ce7 (patch) | |
tree | 200fb0bbeca614ca6b14417b8280be364811f670 | |
parent | 8b334e9c9187f4eb8bdbfde7644f82a66d30af00 (diff) | |
download | json-rpc-shell-14ded260a0d8e364f2edb895e915c623e1ab7ce7.tar.gz json-rpc-shell-14ded260a0d8e364f2edb895e915c623e1ab7ce7.tar.xz json-rpc-shell-14ded260a0d8e364f2edb895e915c623e1ab7ce7.zip |
Clarify and degrade FastCGI multiplexing
No need to support more than 255 concurrent requests on one connection.
-rw-r--r-- | demo-json-rpc-server.c | 28 |
1 files 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); |