Commit 18befe6c authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Add time parse/format functions to libvarnish


git-svn-id: http://www.varnish-cache.org/svn/trunk/varnish-cache@189 d4fa192b-c00b-0410-8231-f00ffab90ce4
parent 2b55be57
......@@ -6,6 +6,11 @@
void FreeArgv(char **argv);
char **ParseArgv(const char *s, int comment);
#ifdef CLOCK_MONOTONIC
/* from libvarnish/time.c */
void TIM_format(time_t t, char *p);
time_t TIM_parse(const char *p);
#endif
/* Assert zero return value */
#define AZ(foo) do { assert((foo) == 0); } while (0)
......@@ -6,4 +6,5 @@ lib_LTLIBRARIES = libvarnish.la
libvarnish_la_SOURCES = \
argv.c \
cli.c
cli.c \
time.c
/*
* $Id$
*
* Semi-trivial functions to handle HTTP header timestamps according to
* RFC 2616 section 3.3.
*
* In the highly unlikely event of performance trouble, handbuilt versions
* would likely be faster than relying on the OS time functions.
*
* We must parse three different formats:
* 000000000011111111112222222222
* 012345678901234567890123456789
* ------------------------------
* "Sun, 06 Nov 1994 08:49:37 GMT" RFC822 & RFC1123
* "Sunday, 06-Nov-94 08:49:37 GMT" RFC850
* "Sun Nov 6 08:49:37 1994" ANSI-C asctime()
*
* And always output the RFC1123 format.
*
*/
#include <stdio.h>
#include <string.h>
#include <time.h>
void
TIM_format(time_t t, char *p)
{
struct tm tm;
gmtime_r(&t, &tm);
strftime(p, 30, "%a, %d %b %Y %T GMT", &tm);
}
/* XXX: add statistics ? */
static const char *fmts[] = {
"%a, %d %b %Y %T GMT", /* RFC 822 & RFC1123 */
"%A, %d-%b-%y %T GMT", /* RFC850 */
"%a %b %d %T %Y", /* ANSI-C asctime() */
NULL
};
time_t
TIM_parse(const char *p)
{
struct tm tm;
const char **r;
for (r = fmts; *r != NULL; r++) {
memset(&tm, 0, sizeof tm);
if (strptime(p, *r, &tm) != NULL)
return(timegm(&tm));
}
return (0);
}
#ifdef TEST_DRIVER
int
main(int argc, char **argv)
{
time_t t;
char buf[BUFSIZ];
time(&t);
memset(buf, 0x55, sizeof buf);
TIM_format(t, buf);
printf("scan = %d <%s>\n", TIM_parse(buf), buf);
/* Examples from RFC2616 section 3.3.1 */
printf("scan = %d\n", TIM_parse("Sun, 06 Nov 1994 08:49:37 GMT"));
printf("scan = %d\n", TIM_parse("Sunday, 06-Nov-94 08:49:37 GMT"));
printf("scan = %d\n", TIM_parse("Sun Nov 6 08:49:37 1994"));
return (0);
}
#endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment