Add functions to format and parse RFC1123-style times, for HTTP protocol.

svn:r2129
This commit is contained in:
Nick Mathewson 2004-08-04 01:11:15 +00:00
parent 8b55f73bbe
commit 14d5478f29
3 changed files with 66 additions and 0 deletions

View File

@ -914,6 +914,57 @@ time_t tor_timegm (struct tm *tm) {
return ret; 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. * Low-level I/O.
*/ */

View File

@ -201,6 +201,9 @@ void tv_addms(struct timeval *a, long ms);
void tv_add(struct timeval *a, struct timeval *b); void tv_add(struct timeval *a, struct timeval *b);
int tv_cmp(struct timeval *a, struct timeval *b); int tv_cmp(struct timeval *a, struct timeval *b);
time_t tor_timegm(struct tm *tm); time_t tor_timegm(struct tm *tm);
#define RFC1123_TIME_LEN 29
void tor_format_rfc1123_time(char *buf, time_t t);
int tor_parse_rfc1123_time(const char *buf, time_t *t);
int write_all(int fd, const char *buf, size_t count, int isSocket); int write_all(int fd, const char *buf, size_t count, int isSocket);
int read_all(int fd, char *buf, size_t count, int isSocket); int read_all(int fd, char *buf, size_t count, int isSocket);

View File

@ -439,6 +439,9 @@ test_util() {
struct timeval start, end; struct timeval start, end;
struct tm a_time; struct tm a_time;
smartlist_t *sl; smartlist_t *sl;
char timestr[RFC1123_TIME_LEN+1];
time_t t_res;
int i;
start.tv_sec = 5; start.tv_sec = 5;
start.tv_usec = 5000; start.tv_usec = 5000;
@ -479,6 +482,15 @@ test_util() {
a_time.tm_mday = 10; a_time.tm_mday = 10;
test_eq((time_t) 1076393695UL, tor_timegm(&a_time)); test_eq((time_t) 1076393695UL, tor_timegm(&a_time));
tor_format_rfc1123_time(timestr, 0);
test_streq("Thu, 01 Jan 1970 00:00:00 GMT", timestr);
tor_format_rfc1123_time(timestr, (time_t)1091580502UL);
test_streq("Wed, 04 Aug 2004 00:48:22 GMT", timestr);
t_res = 0;
i = tor_parse_rfc1123_time(timestr, &t_res);
test_eq(i,0);
test_eq(t_res, (time_t)1091580502UL);
/* Test smartlist */ /* Test smartlist */
sl = smartlist_create(); sl = smartlist_create();