summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/sync/sync-httpd_config.c70
1 files changed, 54 insertions, 16 deletions
diff --git a/src/sync/sync-httpd_config.c b/src/sync/sync-httpd_config.c
index 886f2af..c1c40ca 100644
--- a/src/sync/sync-httpd_config.c
+++ b/src/sync/sync-httpd_config.c
@@ -1,6 +1,6 @@
/*
This file is part of Sync
- Copyright (C) 2020 Taler Systems SA
+ Copyright (C) 2020,2024 Taler Systems SA
Sync is free software; you can redistribute it and/or modify it under the
terms of the GNU Lesser General Public License as published by the Free Software
@@ -38,21 +38,59 @@ SH_handler_config (struct SH_RequestHandler *rh,
const char *upload_data,
size_t *upload_data_size)
{
- return TALER_MHD_REPLY_JSON_PACK (
- connection,
- MHD_HTTP_OK,
- GNUNET_JSON_pack_string ("name",
- "sync"),
- GNUNET_JSON_pack_string ("implementation",
- "urn:net:taler:specs:sync:c-reference"),
- GNUNET_JSON_pack_uint64 ("storage_limit_in_megabytes",
- SH_upload_limit_mb),
- TALER_JSON_pack_amount ("liability_limit",
- &SH_insurance),
- TALER_JSON_pack_amount ("annual_fee",
- &SH_annual_fee),
- GNUNET_JSON_pack_string ("version",
- "2:1:0"));
+ static struct MHD_Response *response;
+ static struct GNUNET_TIME_Absolute a;
+
+ (void) connection_cls;
+ (void) upload_data;
+ (void) upload_data_size;
+ if ( (GNUNET_TIME_absolute_is_past (a)) &&
+ (NULL != response) )
+ {
+ MHD_destroy_response (response);
+ response = NULL;
+ }
+ if (NULL == response)
+ {
+ struct GNUNET_TIME_Timestamp km;
+ char dat[128];
+
+ 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);
+ response = TALER_MHD_MAKE_JSON_PACK (
+ GNUNET_JSON_pack_string ("name",
+ "sync"),
+ GNUNET_JSON_pack_string ("implementation",
+ "urn:net:taler:specs:sync:c-reference"),
+ GNUNET_JSON_pack_uint64 ("storage_limit_in_megabytes",
+ SH_upload_limit_mb),
+ TALER_JSON_pack_amount ("liability_limit",
+ &SH_insurance),
+ TALER_JSON_pack_amount ("annual_fee",
+ &SH_annual_fee),
+ GNUNET_JSON_pack_string ("version",
+ "2:2:0"));
+ 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 */
+ }
+ return MHD_queue_response (connection,
+ MHD_HTTP_OK,
+ response);
}