char * VRT_time_string(const struct sess *sp, double t) { char *p; AN(p = WS_Alloc(sp->http->ws, TIM_FORMAT_SIZE)); TIM_format(t, p); return p; }
static int cnt_error(struct sess *sp) { struct worker *w; struct http *h; char date[40]; CHECK_OBJ_NOTNULL(sp, SESS_MAGIC); w = sp->wrk; if (sp->obj == NULL) { HSH_Prealloc(sp); sp->obj = HSH_NewObject(sp, 1); sp->obj->xid = sp->xid; sp->obj->entered = sp->t_req; } else { /* XXX: Null the headers ? */ } CHECK_OBJ_NOTNULL(sp->obj, OBJECT_MAGIC); h = sp->obj->http; http_PutProtocol(w, sp->fd, h, "HTTP/1.1"); http_PutStatus(w, sp->fd, h, sp->err_code); TIM_format(TIM_real(), date); http_PrintfHeader(w, sp->fd, h, "Date: %s", date); http_PrintfHeader(w, sp->fd, h, "Server: Varnish"); http_PrintfHeader(w, sp->fd, h, "Retry-After: %d", params->err_ttl); if (sp->err_reason != NULL) http_PutResponse(w, sp->fd, h, sp->err_reason); else http_PutResponse(w, sp->fd, h, http_StatusMessage(sp->err_code)); VCL_error_method(sp); if (sp->handling == VCL_RET_RESTART) { HSH_Drop(sp); sp->director = NULL; sp->restarts++; sp->step = STP_RECV; return (0); } /* We always close when we take this path */ sp->doclose = "error"; sp->wantbody = 1; assert(sp->handling == VCL_RET_DELIVER); sp->err_code = 0; sp->err_reason = NULL; sp->wrk->bereq = NULL; sp->step = STP_DELIVER; return (0); }
static void tst(const char *s, time_t good) { time_t t; char buf[BUFSIZ]; t = TIM_parse(s); TIM_format(t, buf); printf("%-30s -> %12jd -> %s\n", s, (intmax_t)t, buf); if (t != good) { printf("Parse error! Got: %jd should have %jd diff %jd\n", (intmax_t)t, (intmax_t)good, (intmax_t)(t - good)); exit (2); } }
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 */ tst("Sun, 06 Nov 1994 08:49:37 GMT", 784111777); tst("Sunday, 06-Nov-94 08:49:37 GMT", 784111777); tst("Sun Nov 6 08:49:37 1994", 784111777); tst_delta(); return (0); }