$VERSION
=
sprintf
(
"%d.%02d"
,
q$Revision: 1.3 $
=~ /(\d+)\.(\d+)/);
sub
_etags
{
my
$self
=
shift
;
my
$header
=
shift
;
my
@old
= _split_etag_list(
$self
->_header(
$header
));
if
(
@_
) {
$self
->_header(
$header
=>
join
(
", "
, _split_etag_list(
@_
)));
}
wantarray
?
@old
:
join
(
", "
,
@old
);
}
sub
etag {
shift
->_etags(
"ETag"
,
@_
); }
sub
if_match {
shift
->_etags(
"If-Match"
,
@_
); }
sub
if_none_match {
shift
->_etags(
"If-None-Match"
,
@_
); }
sub
if_range {
my
$self
=
shift
;
my
@old
=
$self
->_header(
"If-Range"
);
if
(
@_
) {
my
$new
=
shift
;
if
(!
defined
$new
) {
$self
->remove_header(
"If-Range"
);
}
elsif
(
$new
=~ /^\d+$/) {
$self
->_date_header(
"If-Range"
,
$new
);
}
else
{
$self
->_etags(
"If-Range"
,
$new
);
}
}
return
unless
defined
(
wantarray
);
for
(
@old
) {
my
$t
= HTTP::Date::str2time(
$_
);
$_
=
$t
if
$t
;
}
wantarray
?
@old
:
join
(
", "
,
@old
);
}
sub
_split_etag_list
{
my
(
@val
) =
@_
;
my
@res
;
for
(
@val
) {
while
(
length
) {
my
$weak
=
""
;
$weak
=
"W/"
if
s,^\s*[wW]/,,;
my
$etag
=
""
;
if
(s/^\s*(\"[^\"\\]*(?:\\.[^\"\\]*)*\")//) {
push
(
@res
,
"$weak$1"
);
}
elsif
(s/^\s*,//) {
push
(
@res
,
qq(W/"")
)
if
$weak
;
}
elsif
(s/^\s*([^,\s]+)//) {
$etag
= $1;
$etag
=~ s/([\"\\])/\\$1/g;
push
(
@res
,
qq($weak"$etag")
);
}
elsif
(s/^\s+// || !
length
) {
push
(
@res
,
qq(W/"")
)
if
$weak
;
}
else
{
die
"This should not happen: '$_'"
;
}
}
}
@res
;
}
1;