From 75889d812402ac2b75d891576a1c37cb43c8eaf3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20K=C3=A4fer?= Date: Tue, 4 Nov 2014 06:44:50 -0800 Subject: [PATCH] replace strftime_l with our custom formatter --- include/mbgl/util/time.hpp | 6 ++++++ platform/default/http_request_baton_curl.cpp | 14 ++++---------- src/util/time.cpp | 13 +++++++++++++ 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/include/mbgl/util/time.hpp b/include/mbgl/util/time.hpp index 9d61edf75..e8afbeff6 100644 --- a/include/mbgl/util/time.hpp +++ b/include/mbgl/util/time.hpp @@ -1,7 +1,9 @@ #ifndef MBGL_UTIL_TIME #define MBGL_UTIL_TIME +#include #include +#include namespace mbgl { @@ -15,6 +17,10 @@ namespace util { // comparisons between different timestamps produce meaningful values. timestamp now(); + +// Returns the RFC1123 formatted date. E.g. "Tue, 04 Nov 2014 02:13:24 GMT" +std::string rfc1123(std::time_t time); + } // used for time conversions diff --git a/platform/default/http_request_baton_curl.cpp b/platform/default/http_request_baton_curl.cpp index 0c3d2b43f..80eed2767 100644 --- a/platform/default/http_request_baton_curl.cpp +++ b/platform/default/http_request_baton_curl.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include @@ -9,8 +10,6 @@ #include #include #include -#include -#include // This file contains code from http://curl.haxx.se/libcurl/c/multi-uv.html: @@ -369,9 +368,6 @@ void start_request(void *const ptr) { util::ptr &baton = *baton_guard.get(); assert(baton); - // Create a C locale - static locale_t locale = newlocale(LC_ALL_MASK, nullptr, nullptr); - CURL *handle = nullptr; if (!handles.empty()) { handle = handles.front(); @@ -390,11 +386,9 @@ void start_request(void *const ptr) { const std::string header = std::string("If-None-Match: ") + baton->response->etag; context->headers = curl_slist_append(context->headers, header.c_str()); } else if (baton->response->modified) { - const time_t modified = baton->response->modified; - struct tm *timeinfo = std::gmtime(&modified); - char buffer[64]; - strftime_l(buffer, 64, "If-Modified-Since: %a, %d %b %Y %H:%M:%S GMT", timeinfo, locale); - context->headers = curl_slist_append(context->headers, buffer); + const std::string time = std::string("If-Modified-Since: ") + + util::rfc1123(baton->response->modified); + context->headers = curl_slist_append(context->headers, time.c_str()); } } diff --git a/src/util/time.cpp b/src/util/time.cpp index 4cd8077f9..1953975b1 100644 --- a/src/util/time.cpp +++ b/src/util/time.cpp @@ -8,5 +8,18 @@ timestamp now() { return uv_hrtime(); } +static const char *week[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; +static const char *months[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; + +std::string rfc1123(std::time_t time) { + std::tm info; + gmtime_r(&time, &info); + char buffer[30]; + snprintf(buffer, 30, "%s, %02d %s %4d %02d:%02d:%02d GMT", week[info.tm_wday], info.tm_mday, + months[info.tm_mon], 1900 + info.tm_year, info.tm_hour, info.tm_min, info.tm_sec); + return buffer; +} + } }