blob: 9186d036e2ff097da29f414fb45877892853bd6c [file] [log] [blame]
#include "apache_request.h"
#include "apache_cookie.h"
#include "mod_perl.h"
typedef ApacheCookie * Apache__Cookie;
static SV *cookie_bless(ApacheCookie *c)
{
SV *sv = newSV(0);
sv_setref_pv(sv, "Apache::Cookie", (void*)c);
return sv;
}
static ApacheCookie *sv_2cookie(SV *sv)
{
if (SvROK(sv) && sv_derived_from(sv, "Apache::Cookie")) {
return (ApacheCookie *)SvIV((SV*)SvRV(sv));
}
else {
return ApacheCookie_new(perl_request_rec(NULL), NULL);
}
}
#define cookie_push(c) \
XPUSHs(sv_2mortal(newSVpv(c->name,0))); \
XPUSHs(sv_2mortal(cookie_bless(c)))
#define ApacheCookie_name(c, val) \
ApacheCookie_attr(c, "name", val)
#define ApacheCookie_domain(c, val) \
ApacheCookie_attr(c, "domain", val)
#define ApacheCookie_path(c, val) \
ApacheCookie_attr(c, "path", val)
#define ApacheCookie_secure(c, val) \
ApacheCookie_attr(c, "secure", val)
MODULE = Apache::Cookie PACKAGE = Apache::Cookie PREFIX = ApacheCookie_
PROTOTYPES: DISABLE
Apache::Cookie
ApacheCookie_new(class, r, ...)
SV *class
Apache r
PREINIT:
I32 i;
CODE:
class = class; /* -Wall */
RETVAL = ApacheCookie_new(r, NULL);
for (i=2; i<items; i+=2) {
char *key = SvPV(ST(i),na);
SV *val = ST(i+1);
if (SvROK(val)) {
if (SvTYPE(SvRV(val)) == SVt_PVAV) {
I32 n;
AV *av = (AV*)SvRV(val);
for (n=0; n<=AvFILL(av); n++) {
(void)ApacheCookie_attr(RETVAL, key,
SvPV(*av_fetch(av, n, FALSE),na));
}
}
else if (SvTYPE(SvRV(val)) == SVt_PVHV) {
HV *hv = (HV*)SvRV(val);
SV *sv;
char *value;
I32 len;
(void)hv_iterinit(hv);
while ((sv = hv_iternextsv(hv, &value, &len))) {
(void)ApacheCookie_attr(RETVAL, key, value);
(void)ApacheCookie_attr(RETVAL, key, SvPV(sv,na));
}
}
else {
croak("not an ARRAY or HASH reference!");
}
}
else {
(void)ApacheCookie_attr(RETVAL, key, SvPV(val,na));
}
}
OUTPUT:
RETVAL
char *
ApacheCookie_as_string(c)
Apache::Cookie c
void
ApacheCookie_parse(sv, string=NULL)
SV *sv
char *string
ALIAS:
Apache::Cookie::fetch = 1
PREINIT:
ApacheCookieJar *cookies;
ApacheCookie *c;
int i;
PPCODE:
if ((ix = XSANY.any_i32) == 1) {
request_rec *r = perl_request_rec(NULL);
c = ApacheCookie_new(r, NULL);
}
else {
c = sv_2cookie(sv);
}
cookies = ApacheCookie_parse(c->r, string);
if (!ApacheCookieJarItems(cookies)) {
XSRETURN_UNDEF;
}
if (GIMME == G_SCALAR) {
HV *hv = newHV();
SV *sv;
for (i=0; i<ApacheCookieJarItems(cookies); i++) {
ApacheCookie *c = ApacheCookieJarFetch(cookies, i);
if (c && c->name) {
hv_store(hv, c->name, strlen(c->name), cookie_bless(c), FALSE);
}
}
sv = newRV_noinc((SV*)hv);
XPUSHs(sv_2mortal(sv));
}
else {
for (i=0; i<cookies->nelts; i++) {
cookie_push(ApacheCookieJarFetch(cookies, i));
}
}
void
ApacheCookie_value(c, val=Nullsv)
Apache::Cookie c
SV *val
PREINIT:
int i;
I32 gimmes = (GIMME == G_SCALAR);
PPCODE:
for (i = 0; i<ApacheCookieItems(c); i++) {
XPUSHs(sv_2mortal(newSVpv(ApacheCookieFetch(c,i),0)));
if (gimmes) {
break;
}
}
if (val) {
STRLEN len;
char *value;
ApacheCookieItems(c) = 0;
if (SvROK(val)) {
AV *av = (AV*)SvRV(val);
for (i=0; i<=AvFILL(av); i++) {
SV *sv = *av_fetch(av, i, FALSE);
value = SvPV(sv,len);
ApacheCookieAddLen(c, value, len);
}
}
else {
value = SvPV(val,len);
ApacheCookieAddLen(c, value, len);
}
}
char *
ApacheCookie_name(c, val=NULL)
Apache::Cookie c
char *val
char *
ApacheCookie_domain(c, val=NULL)
Apache::Cookie c
char *val
char *
ApacheCookie_path(c, val=NULL)
Apache::Cookie c
char *val
char *
ApacheCookie_expires(c, val=NULL)
Apache::Cookie c
char *val
char *
ApacheCookie_secure(c, val=NULL)
Apache::Cookie c
char *val
void
ApacheCookie_bake(c)
Apache::Cookie c