Merge pull request #71 from mogenson/fix-get-current-time

This commit is contained in:
crispyberry
2026-02-25 01:16:15 +08:00
committed by GitHub

View File

@@ -106,33 +106,54 @@ static esp_err_t fetch_time_via_proxy(char *out, size_t out_size)
return ESP_OK; return ESP_OK;
} }
/* Event handler that captures the Date response header */
typedef struct {
char date_val[64];
} time_header_ctx_t;
/**
* HTTP event handler that captures the "Date" response header.
*
* esp_http_client_get_header() only accesses request headers, so response
* headers must be captured here during HTTP_EVENT_ON_HEADER events.
* The Date value is copied into the time_header_ctx_t provided via user_data.
*/
static esp_err_t time_http_event_handler(esp_http_client_event_t *evt)
{
time_header_ctx_t *ctx = evt->user_data;
if (evt->event_id == HTTP_EVENT_ON_HEADER) {
if (strcasecmp(evt->header_key, "Date") == 0 && ctx) {
strncpy(ctx->date_val, evt->header_value, sizeof(ctx->date_val) - 1);
ctx->date_val[sizeof(ctx->date_val) - 1] = '\0';
}
}
return ESP_OK;
}
/* Fetch time via direct HTTPS */ /* Fetch time via direct HTTPS */
static esp_err_t fetch_time_direct(char *out, size_t out_size) static esp_err_t fetch_time_direct(char *out, size_t out_size)
{ {
time_header_ctx_t ctx = {0};
esp_http_client_config_t config = { esp_http_client_config_t config = {
.url = "https://api.telegram.org/", .url = "https://api.telegram.org/",
.method = HTTP_METHOD_HEAD, .method = HTTP_METHOD_HEAD,
.timeout_ms = 10000, .timeout_ms = 10000,
.crt_bundle_attach = esp_crt_bundle_attach, .crt_bundle_attach = esp_crt_bundle_attach,
.event_handler = time_http_event_handler,
.user_data = &ctx,
}; };
esp_http_client_handle_t client = esp_http_client_init(&config); esp_http_client_handle_t client = esp_http_client_init(&config);
if (!client) return ESP_FAIL; if (!client) return ESP_FAIL;
esp_err_t err = esp_http_client_perform(client); esp_err_t err = esp_http_client_perform(client);
if (err != ESP_OK) {
esp_http_client_cleanup(client);
return err;
}
/* Get Date header */
char *date_ptr = NULL;
esp_http_client_get_header(client, "Date", &date_ptr);
esp_http_client_cleanup(client); esp_http_client_cleanup(client);
if (!date_ptr || date_ptr[0] == '\0') return ESP_ERR_NOT_FOUND; if (err != ESP_OK) return err;
if (ctx.date_val[0] == '\0') return ESP_ERR_NOT_FOUND;
if (!parse_and_set_time(date_ptr, out, out_size)) return ESP_FAIL; if (!parse_and_set_time(ctx.date_val, out, out_size)) return ESP_FAIL;
return ESP_OK; return ESP_OK;
} }