diff options
author | Christian Grothoff <christian@grothoff.org> | 2017-04-17 01:29:36 +0200 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2017-04-17 01:29:36 +0200 |
commit | 5a321621f40d09b4f38bdd6dd43ee6580915fba2 (patch) | |
tree | af62e2b0c8e7751657bcf9d2714af2f8a571514a /src/exchange/taler-exchange-httpd_keystate.c | |
parent | 0b3abbd30487ff1c5e9ce9be5561511fcf760f4f (diff) | |
download | exchange-5a321621f40d09b4f38bdd6dd43ee6580915fba2.tar.gz exchange-5a321621f40d09b4f38bdd6dd43ee6580915fba2.tar.bz2 exchange-5a321621f40d09b4f38bdd6dd43ee6580915fba2.zip |
implement #4982
Diffstat (limited to 'src/exchange/taler-exchange-httpd_keystate.c')
-rw-r--r-- | src/exchange/taler-exchange-httpd_keystate.c | 51 |
1 files changed, 49 insertions, 2 deletions
diff --git a/src/exchange/taler-exchange-httpd_keystate.c b/src/exchange/taler-exchange-httpd_keystate.c index 95ddd04bf..057f89ce3 100644 --- a/src/exchange/taler-exchange-httpd_keystate.c +++ b/src/exchange/taler-exchange-httpd_keystate.c @@ -72,6 +72,16 @@ struct TEH_KS_StateHandle char *keys_json; /** + * deflate-compressed version of @e keys_json, or NULL if not available. + */ + void *keys_jsonz; + + /** + * Number of bytes in @e keys_jsonz. + */ + size_t keys_jsonz_size; + + /** * Mapping from denomination keys to denomination key issue struct. * Used to lookup the key by hash. */ @@ -709,6 +719,7 @@ ks_release_ (struct TEH_KS_StateHandle *key_state) key_state->revoked_map = NULL; } GNUNET_free_non_null (key_state->keys_json); + GNUNET_free_non_null (key_state->keys_jsonz); GNUNET_free (key_state); } } @@ -851,6 +862,17 @@ TEH_KS_acquire_ (const char *location) JSON_INDENT (2)); GNUNET_assert (NULL != key_state->keys_json); json_decref (keys); + /* also compute compressed version of /keys */ + key_state->keys_jsonz = GNUNET_strdup (key_state->keys_json); + key_state->keys_jsonz_size = strlen (key_state->keys_json); + if (MHD_YES != + TEH_RESPONSE_body_compress (&key_state->keys_jsonz, + &key_state->keys_jsonz_size)) + { + GNUNET_free (key_state->keys_jsonz); + key_state->keys_jsonz = NULL; + key_state->keys_jsonz_size = 0; + } internal_key_state = key_state; } key_state = internal_key_state; @@ -1225,10 +1247,26 @@ TEH_KS_handler_keys (struct TEH_RequestHandler *rh, struct MHD_Response *response; int ret; char dat[128]; + char *json; + size_t json_len; + int comp; key_state = TEH_KS_acquire (); - response = MHD_create_response_from_buffer (strlen (key_state->keys_json), - key_state->keys_json, + comp = MHD_NO; + if (NULL != key_state->keys_jsonz) + comp = TEH_RESPONSE_can_compress (connection); + if (MHD_YES == comp) + { + json = key_state->keys_jsonz; + json_len = key_state->keys_jsonz_size; + } + else + { + json = key_state->keys_json; + json_len = strlen (key_state->keys_json); + } + response = MHD_create_response_from_buffer (json_len, + json, MHD_RESPMEM_MUST_COPY); TEH_KS_release (key_state); if (NULL == response) @@ -1241,6 +1279,15 @@ TEH_KS_handler_keys (struct TEH_RequestHandler *rh, MHD_add_response_header (response, MHD_HTTP_HEADER_CONTENT_TYPE, rh->mime_type)); + if (MHD_YES != + MHD_add_response_header (response, + MHD_HTTP_HEADER_CONTENT_ENCODING, + "deflate")) + { + GNUNET_break (0); + MHD_destroy_response (response); + return MHD_NO; + } get_date_string (key_state->reload_time, dat); GNUNET_break (MHD_YES == |