eval
{
};
my
$r
=
shift
;
$r
->send_http_header(
'text/plain'
);
unless
(have_module
"Apache::Cookie"
and Apache::Request->can(
'upload'
)) {
print
"1..0\n"
;
print
$@
if
$@;
print
"$INC{'Apache/Request.pm'}\n"
;
return
;
}
my
$i
= 0;
my
$tests
= 33;
$tests
+= 7
if
$r
->headers_in->get(
"Cookie"
);
print
"1..$tests\n"
;
my
$letter
=
'a'
;
for
my
$name
(
qw(one two three)
) {
my
$c
= Apache::Cookie->new(
$r
,
-name
=>
$name
,
-value
=> [
"bar_$name"
,
$letter
],
-expires
=>
'+3M'
,
-path
=>
'/'
);
my
$cc
= CGI::Cookie->new(
-name
=>
$name
,
-value
=> [
"bar_$name"
,
$letter
],
-expires
=>
'+3M'
,
-path
=>
'/'
);
++
$letter
;
$c
->bake;
my
$cgi_as_string
=
$cc
->as_string;
my
$as_string
=
$c
->as_string;
my
$header_out
= (
$r
->err_headers_out->get(
"Set-Cookie"
))[-1];
my
@val
=
$c
->value;
print
"VALUE: @val\n"
;
for
my
$v
(
"string"
, [
@val
]) {
$c
->value(
$v
);
my
@arr
=
$c
->value;
my
$n
=
@arr
;
if
(
ref
$v
) {
test ++
$i
,
$n
== 2;
}
else
{
test ++
$i
,
$n
== 1;
}
print
" VALUE: @arr ($n)\n"
;
$c
->value(\
@val
);
}
for
(1,0) {
my
$secure
=
$c
->secure;
$c
->secure(
$_
);
print
"secure: $secure\n"
;
}
print
"as_string: `$as_string'\n"
;
print
"header_out: `$header_out'\n"
;
print
"cgi cookie: `$cgi_as_string\n"
;
test ++
$i
, cookie_eq(
$as_string
,
$header_out
);
test ++
$i
, cookie_eq(
$as_string
,
$cgi_as_string
);
}
my
(
@Hargs
) = (
"-name"
=>
"key"
,
"-values"
=> {
qw(val two)
},
"-domain"
=>
".cp.net"
,
);
my
(
@Aargs
) = (
"-name"
=>
"key"
,
"-values"
=> [
qw(val two)
],
"-domain"
=>
".cp.net"
,
);
my
(
@Sargs
) = (
"-name"
=>
"key"
,
"-values"
=>
'one'
,
"-domain"
=>
".cp.net"
,
);
my
$done_meth
= 0;
for
my
$rv
(\
@Hargs
, \
@Aargs
, \
@Sargs
) {
my
$c1
= Apache::Cookie->new(
$r
,
@$rv
);
my
$c2
= CGI::Cookie->new(
@$rv
);
for
(
$c1
,
$c2
) {
$_
->expires(
"+3h"
);
}
for
my
$meth
(
qw(as_string name domain path expires secure)
) {
my
$one
=
$c1
->
$meth
() ||
""
;
my
$two
=
$c2
->
$meth
() ||
""
;
print
"Apache::Cookie: $meth => $one\n"
;
print
"CGI::Cookie: $meth => $two\n"
;
test ++
$i
, cookie_eq(
$one
,
$two
);
}
}
if
(
my
$string
=
$r
->headers_in->get(
'Cookie'
)) {
print
$string
, $/;
my
%done
= ();
print
"SCALAR context (as_string method):\n"
;
print
" Apache::Cookie:\n"
;
my
$hv
= Apache::Cookie->new(
$r
)->parse(
$string
);
for
(
sort
keys
%$hv
) {
print
" $_ => "
,
$hv
->{
$_
}->as_string, $/;
$done
{
$_
} =
$hv
->{
$_
}->as_string;
}
print
" CGI::Cookie:\n"
;
$hv
= CGI::Cookie->parse(
$string
);
for
(
sort
keys
%$hv
) {
print
" $_ => "
,
$hv
->{
$_
}->as_string, $/;
test ++
$i
, cookie_eq(
$done
{
$_
},
$hv
->{
$_
}->as_string);
}
%done
= ();
print
"ARRAY context (value method):\n"
;
print
" Apache::Cookie:\n"
;
my
%hv
= Apache::Cookie->new(
$r
)->parse(
$string
);
my
%fetch
= Apache::Cookie->fetch;
test ++
$i
,
keys
%hv
==
keys
%fetch
;
for
(
sort
keys
%hv
) {
$done
{
$_
} =
join
", "
,
$hv
{
$_
}->value;
print
" $_ => $done{$_}\n"
;
}
print
" CGI::Cookie:\n"
;
%hv
= CGI::Cookie->parse(
$string
);
for
(
sort
keys
%hv
) {
my
$val
=
join
", "
,
$hv
{
$_
}->value;
test ++
$i
, cookie_eq(
$done
{
$_
},
$val
);
print
" $_ => $val\n"
;
}
}
else
{
print
"NO Cookie set"
;
}
{
my
$cgi_exp
= CGI::expires(
'-1d'
,
'cookie'
);
my
$cookie_exp
= Apache::Cookie->expires(
'-1d'
);
print
"cookie: $cookie_exp\ncgi: $cgi_exp\n"
;
test ++
$i
, cookie_eq(
$cookie_exp
,
$cgi_exp
);
}
{
my
$cgi_exp
= CGI::expires(
'-1d'
,
'http'
);
my
$apr_exp
= Apache::Request->expires(
'-1d'
);
print
"apr: $apr_exp\ncgi: $cgi_exp\n"
;
test ++
$i
, cookie_eq(
$apr_exp
,
$cgi_exp
);
}
test ++
$i
, 1;
sub
cookie_eq {
my
(
$one
,
$two
) =
@_
;
unless
(
$one
eq
$two
) {
print
STDERR
"cookie mismatch:\n"
,
"`$one'\n"
,
" vs.\n"
,
"`$two'\n"
;
}
(
$one
&&
$two
) || (!
$one
&& !
$two
);
}