static void netscape_cookie(dAT) { char expires[APR_RFC822_DATE_LEN]; char *val; apreq_cookie_t *c; *(const char **)&val = apr_table_get(jar, "foo"); AT_not_null(val); c = apreq_value_to_cookie(val); AT_str_eq(c->v.data, "bar"); AT_int_eq(apreq_cookie_version(c), 0); AT_str_eq(apreq_cookie_as_string(c, p), "foo=bar"); c->domain = apr_pstrdup(p, "example.com"); AT_str_eq(apreq_cookie_as_string(c, p), "foo=bar; domain=example.com"); c->path = apr_pstrdup(p, "/quux"); AT_str_eq(apreq_cookie_as_string(c, p), "foo=bar; path=/quux; domain=example.com"); apreq_cookie_expires(c, "+1y"); apr_rfc822_date(expires, apr_time_now() + apr_time_from_sec(apreq_atoi64t("+1y"))); expires[7] = '-'; expires[11] = '-'; val = apr_pstrcat(p, "foo=bar; path=/quux; domain=example.com; expires=", expires, NULL); AT_str_eq(apreq_cookie_as_string(c, p), val); }
static void rfc_cookie(dAT) { apreq_cookie_t *c = apreq_cookie_make(p,"rfc",3,"out",3); const char *expected; long expires; AT_str_eq(c->v.data, "out"); apreq_cookie_version_set(c, 1); AT_int_eq(apreq_cookie_version(c), 1); AT_str_eq(apreq_cookie_as_string(c,p),"rfc=out; Version=1"); c->domain = apr_pstrdup(p, "example.com"); #ifndef WIN32 AT_str_eq(apreq_cookie_as_string(c,p), "rfc=out; Version=1; domain=\"example.com\""); c->path = apr_pstrdup(p, "/quux"); AT_str_eq(apreq_cookie_as_string(c,p), "rfc=out; Version=1; path=\"/quux\"; domain=\"example.com\""); apreq_cookie_expires(c, "+3m"); expires = apreq_atoi64t("+3m"); expected = apr_psprintf(p, "rfc=out; Version=1; path=\"/quux\"; " "domain=\"example.com\"; max-age=%ld", expires); AT_str_eq(apreq_cookie_as_string(c,p), expected); #else expected = "rfc=out; Version=1; domain=\"example.com\""; AT_str_eq(apreq_cookie_as_string(c,p), expected); c->path = apr_pstrdup(p, "/quux"); expected = "rfc=out; Version=1; path=\"/quux\"; domain=\"example.com\""; AT_str_eq(apreq_cookie_as_string(c,p), expected); apreq_cookie_expires(c, "+3m"); expires = apreq_atoi64t("+3m"); expected = apr_psprintf(p, "rfc=out; Version=1; path=\"/quux\"; " "domain=\"example.com\"; max-age=%ld", expires); AT_str_eq(apreq_cookie_as_string(c,p), expected); #endif }
APREQ_DECLARE(int) apreq_cookie_serialize(const apreq_cookie_t *c, char *buf, apr_size_t len) { /* The format string must be large enough to accomodate all * of the cookie attributes. The current attributes sum to * ~90 characters (w/ 6-8 padding chars per attr), so anything * over 100 should be fine. */ unsigned version = apreq_cookie_version(c); char format[128] = "%s=%s"; char *f = format + strlen(format); /* XXX protocol enforcement (for debugging, anyway) ??? */ if (c->v.name == NULL) return -1; #define NULL2EMPTY(attr) (attr ? attr : "") if (version == NETSCAPE) { char expires[APR_RFC822_DATE_LEN] = {0}; #define ADD_NS_ATTR(name) do { \ if (c->name != NULL) \ strcpy(f, "; " #name "=%s"); \ else \ strcpy(f, "%0.s"); \ f += strlen(f); \ } while (0) ADD_NS_ATTR(path); ADD_NS_ATTR(domain); if (c->max_age != -1) { strcpy(f, "; expires=%s"); apr_rfc822_date(expires, c->max_age + apr_time_now()); expires[7] = '-'; expires[11] = '-'; } else strcpy(f, ""); f += strlen(f); if (apreq_cookie_is_secure(c)) strcpy(f, "; secure"); f += strlen(f); if (apreq_cookie_is_httponly(c)) strcpy(f, "; HttpOnly"); return apr_snprintf(buf, len, format, c->v.name, c->v.data, NULL2EMPTY(c->path), NULL2EMPTY(c->domain), expires); } /* c->version == RFC */ strcpy(f,"; Version=%u"); f += strlen(f); /* ensure RFC attributes are always quoted */ #define ADD_RFC_ATTR(name) do { \ if (c->name != NULL) \ if (*c->name == '"') \ strcpy(f, "; " #name "=%s"); \ else \ strcpy(f, "; " #name "=\"%s\""); \ else \ strcpy(f, "%0.s"); \ f += strlen (f); \ } while (0) ADD_RFC_ATTR(path); ADD_RFC_ATTR(domain); ADD_RFC_ATTR(port); ADD_RFC_ATTR(comment); ADD_RFC_ATTR(commentURL); strcpy(f, c->max_age != -1 ? "; max-age=%" APR_TIME_T_FMT : ""); f += strlen(f); if (apreq_cookie_is_secure(c)) strcpy(f, "; secure"); f += strlen(f); if (apreq_cookie_is_httponly(c)) strcpy(f, "; HttpOnly"); return apr_snprintf(buf, len, format, c->v.name, c->v.data, version, NULL2EMPTY(c->path), NULL2EMPTY(c->domain), NULL2EMPTY(c->port), NULL2EMPTY(c->comment), NULL2EMPTY(c->commentURL), apr_time_sec(c->max_age)); }