diff options
author | Nick Mathewson <nickm@torproject.org> | 2004-08-04 01:11:15 +0000 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2004-08-04 01:11:15 +0000 |
commit | 14d5478f2995e6d9e654acbeb4f36e9a57cc9194 (patch) | |
tree | cdb41d5d5ce1e687410bf887effd8a6b90bf8c55 /src/common/util.c | |
parent | 8b55f73bbee6b282a451e87820cd8f38f13046ac (diff) | |
download | tor-14d5478f2995e6d9e654acbeb4f36e9a57cc9194.tar.gz tor-14d5478f2995e6d9e654acbeb4f36e9a57cc9194.zip |
Add functions to format and parse RFC1123-style times, for HTTP protocol.
svn:r2129
Diffstat (limited to 'src/common/util.c')
-rw-r--r-- | src/common/util.c | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/src/common/util.c b/src/common/util.c index ed5b6a06f4..252f566dee 100644 --- a/src/common/util.c +++ b/src/common/util.c @@ -914,6 +914,57 @@ time_t tor_timegm (struct tm *tm) { return ret; } +/* strftime is locale-specific, so we need to replace those parts */ +static const char *WEEKDAY_NAMES[] = + { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; +static const char *MONTH_NAMES[] = + { "Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; + +void tor_format_rfc1123_time(char *buf, time_t t) { + struct tm *tm = gmtime(&t); + + strftime(buf, RFC1123_TIME_LEN+1, "XXX, %d XXX %Y %H:%M:%S GMT", tm); + tor_assert(tm->tm_wday >= 0 && tm->tm_wday <= 6); + memcpy(buf, WEEKDAY_NAMES[tm->tm_wday], 3); + tor_assert(tm->tm_wday >= 0 && tm->tm_mon <= 11); + memcpy(buf+8, MONTH_NAMES[tm->tm_mon], 3); +} + +int tor_parse_rfc1123_time(const char *buf, time_t *t) { + struct tm tm; + char month[4]; + char weekday[4]; + int i, m; + + if (strlen(buf) != RFC1123_TIME_LEN) + return -1; + memset(&tm, 0, sizeof(tm)); + if (sscanf(buf, "%3s, %d %3s %d %d:%d:%d GMT", weekday, + &tm.tm_mday, month, &tm.tm_year, &tm.tm_hour, + &tm.tm_min, &tm.tm_sec) < 7) { + log_fn(LOG_WARN, "Got invalid RFC1123 time \"%s\"", buf); + return -1; + } + + m = -1; + for (i = 0; i < 12; ++i) { + if (!strcmp(month, MONTH_NAMES[i])) { + m = i; + break; + } + } + if (m<0) { + log_fn(LOG_WARN, "Got invalid RFC1123 time \"%s\"", buf); + return -1; + } + + tm.tm_mon = m; + tm.tm_year -= 1900; + *t = tor_timegm(&tm); + return 0; +} + /* * Low-level I/O. */ |