From e008f0d4887d07cbeb7b0046cd142e7db5d91873 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Sun, 21 Apr 2024 10:26:52 +0200 Subject: add cache control to /config endpoint --- src/backend/anastasis-httpd_config.c | 113 +++++++++++++++++++++++------------ 1 file changed, 74 insertions(+), 39 deletions(-) (limited to 'src/backend/anastasis-httpd_config.c') diff --git a/src/backend/anastasis-httpd_config.c b/src/backend/anastasis-httpd_config.c index 677c5dc..315419e 100644 --- a/src/backend/anastasis-httpd_config.c +++ b/src/backend/anastasis-httpd_config.c @@ -1,6 +1,6 @@ /* This file is part of Anastasis - Copyright (C) 2020, 2021 Anastasis SARL + Copyright (C) 2020, 2021, 2024 Anastasis SARL Anastasis is free software; you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software @@ -78,48 +78,83 @@ MHD_RESULT AH_handler_config (struct AH_RequestHandler *rh, struct MHD_Connection *connection) { - json_t *method_arr = json_array (); + static struct MHD_Response *response; + static struct GNUNET_TIME_Absolute a; - GNUNET_assert (NULL != method_arr); + if ( (GNUNET_TIME_absolute_is_past (a)) && + (NULL != response) ) { - json_t *method; + MHD_destroy_response (response); + response = NULL; + } + if (NULL == response) + { + json_t *method_arr = json_array (); + struct GNUNET_TIME_Timestamp km; + char dat[128]; + + GNUNET_assert (NULL != method_arr); + a = GNUNET_TIME_relative_to_absolute (GNUNET_TIME_UNIT_DAYS); + /* Round up to next full day to ensure the expiration + time does not become a fingerprint! */ + a = GNUNET_TIME_absolute_round_down (a, + GNUNET_TIME_UNIT_DAYS); + a = GNUNET_TIME_absolute_add (a, + GNUNET_TIME_UNIT_DAYS); + /* => /config response stays at most 48h in caches! */ + km = GNUNET_TIME_absolute_to_timestamp (a); + TALER_MHD_get_date_string (km.abs_time, + dat); + { + json_t *method; + + method = GNUNET_JSON_PACK ( + GNUNET_JSON_pack_string ("type", + "question"), + TALER_JSON_pack_amount ("cost", + &AH_question_cost)); + GNUNET_assert ( + 0 == + json_array_append_new (method_arr, + method)); + } + GNUNET_CONFIGURATION_iterate_sections (AH_cfg, + &add_methods, + method_arr); - method = GNUNET_JSON_PACK ( - GNUNET_JSON_pack_string ("type", - "question"), - TALER_JSON_pack_amount ("cost", - &AH_question_cost)); - GNUNET_assert ( - 0 == - json_array_append_new (method_arr, - method)); + response = TALER_MHD_MAKE_JSON_PACK ( + GNUNET_JSON_pack_string ("name", + "anastasis"), + GNUNET_JSON_pack_string ("version", + "0:2:0"), + GNUNET_JSON_pack_string ("implementation", + "urn:net:taler:specs:anastasis:c-reference"), + GNUNET_JSON_pack_string ("business_name", + AH_business_name), + GNUNET_JSON_pack_array_steal ("methods", + method_arr), + GNUNET_JSON_pack_uint64 ("storage_limit_in_megabytes", + AH_upload_limit_mb), + TALER_JSON_pack_amount ("annual_fee", + &AH_annual_fee), + TALER_JSON_pack_amount ("truth_upload_fee", + &AH_truth_upload_fee), + TALER_JSON_pack_amount ("liability_limit", + &AH_insurance), + GNUNET_JSON_pack_data_auto ("provider_salt", + &AH_provider_salt)); + GNUNET_break (MHD_YES == + MHD_add_response_header (response, + MHD_HTTP_HEADER_EXPIRES, + dat)); + GNUNET_break (MHD_YES == + MHD_add_response_header (response, + MHD_HTTP_HEADER_CACHE_CONTROL, + "public,max-age=21600")); /* 6h */ } - GNUNET_CONFIGURATION_iterate_sections (AH_cfg, - &add_methods, - method_arr); - return TALER_MHD_REPLY_JSON_PACK ( - connection, - MHD_HTTP_OK, - GNUNET_JSON_pack_string ("name", - "anastasis"), - GNUNET_JSON_pack_string ("version", - "0:1:0"), - GNUNET_JSON_pack_string ("implementation", - "urn:net:taler:specs:anastasis:c-reference"), - GNUNET_JSON_pack_string ("business_name", - AH_business_name), - GNUNET_JSON_pack_array_steal ("methods", - method_arr), - GNUNET_JSON_pack_uint64 ("storage_limit_in_megabytes", - AH_upload_limit_mb), - TALER_JSON_pack_amount ("annual_fee", - &AH_annual_fee), - TALER_JSON_pack_amount ("truth_upload_fee", - &AH_truth_upload_fee), - TALER_JSON_pack_amount ("liability_limit", - &AH_insurance), - GNUNET_JSON_pack_data_auto ("provider_salt", - &AH_provider_salt)); + return MHD_queue_response (connection, + MHD_HTTP_OK, + response); } -- cgit v1.2.3