1 package HTTP::Headers::ETag;
10 package HTTP::Headers;
16 my @old = _split_etag_list($self->_header($header));
18 $self->_header($header => join(", ", _split_etag_list(@_)));
20 wantarray ? @old : join(", ", @old);
23 sub etag { shift->_etags("ETag", @_); }
24 sub if_match { shift->_etags("If-Match", @_); }
25 sub if_none_match { shift->_etags("If-None-Match", @_); }
28 # Either a date or an entity-tag
30 my @old = $self->_header("If-Range");
34 $self->remove_header("If-Range");
36 elsif ($new =~ /^\d+$/) {
37 $self->_date_header("If-Range", $new);
40 $self->_etags("If-Range", $new);
43 return unless defined(wantarray);
45 my $t = HTTP::Date::str2time($_);
48 wantarray ? @old : join(", ", @old);
52 # Split a list of entity tag values. The return value is a list
53 # consisting of one element per entity tag. Suitable for parsing
54 # headers like C<If-Match>, C<If-None-Match>. You might even want to
55 # use it on C<ETag> and C<If-Range> entity tag values, because it will
56 # normalize them to the common form.
58 # entity-tag = [ weak ] opaque-tag
60 # opaque-tag = quoted-string
70 $weak = "W/" if s,^\s*[wW]/,,;
72 if (s/^\s*(\"[^\"\\]*(?:\\.[^\"\\]*)*\")//) {
73 push(@res, "$weak$1");
76 push(@res, qq(W/"")) if $weak;
78 elsif (s/^\s*([^,\s]+)//) {
80 $etag =~ s/([\"\\])/\\$1/g;
81 push(@res, qq($weak"$etag"));
83 elsif (s/^\s+// || !length) {
84 push(@res, qq(W/"")) if $weak;
87 die "This should not happen: '$_'";