File Coverage

blib/lib/Mojo/Headers.pm
Criterion Covered Total %
statement 104 104 100.0
branch 32 32 100.0
condition 21 26 80.7
subroutine 72 72 100.0
pod 18 18 100.0
total 247 252 98.0


line stmt bran cond sub pod time code
1             package Mojo::Headers;
2 62     62   70856 use Mojo::Base -base;
  62         148  
  62         448  
3              
4 62     62   452 use Carp qw(croak);
  62         146  
  62         3428  
5 62     62   467 use Mojo::Util qw(header_params monkey_patch);
  62         187  
  62         160930  
6              
7             has max_line_size => sub { $ENV{MOJO_MAX_LINE_SIZE} || 8192 };
8             has max_lines => sub { $ENV{MOJO_MAX_LINES} || 100 };
9              
10             # Common headers
11             my %NAMES = map { lc() => $_ } (
12             qw(Accept Accept-Charset Accept-Encoding Accept-Language Accept-Ranges Access-Control-Allow-Origin Allow),
13             qw(Authorization Cache-Control Connection Content-Disposition Content-Encoding Content-Language Content-Length),
14             qw(Content-Location Content-Range Content-Security-Policy Content-Type Cookie DNT Date ETag Expect Expires Host),
15             qw(If-Modified-Since If-None-Match Last-Modified Link Location Origin Proxy-Authenticate Proxy-Authorization),
16             qw(Range Sec-WebSocket-Accept Sec-WebSocket-Extensions Sec-WebSocket-Key Sec-WebSocket-Protocol),
17             qw(Sec-WebSocket-Version Server Server-Timing Set-Cookie Status Strict-Transport-Security TE Trailer),
18             qw(Transfer-Encoding Upgrade User-Agent Vary WWW-Authenticate)
19             );
20             for my $header (keys %NAMES) {
21             my $name = $header;
22             $name =~ y/-/_/;
23             monkey_patch __PACKAGE__, $name, sub {
24 47374     47374   70181 my $self = shift;
        47374      
        47374      
        47374      
        47374      
        47374      
        47374      
        47374      
        47374      
        47374      
        47374      
        47374      
        47374      
        47374      
        47374      
        47374      
        47374      
        47374      
        47374      
        47374      
        47374      
        47374      
        47374      
        47374      
        47374      
        47374      
        47374      
        47374      
        47374      
        47374      
        47374      
        47374      
        47374      
        47374      
        47374      
        47374      
        47374      
        47374      
        47374      
        47374      
        47374      
        47374      
        47374      
        47374      
        47374      
        47374      
        47374      
        47374      
        47374      
        47374      
        47374      
25 47374 100 50     112614 $self->{headers}{$header} = [@_] and return $self if @_;
26 38083 100       195743 return undef unless my $headers = $self->{headers}{$header};
27 8091         54155 return join ', ', @$headers;
28             };
29             }
30              
31             # Hop-by-hop headers
32             my @HOP_BY_HOP
33             = map {lc} qw(Connection Keep-Alive Proxy-Authenticate Proxy-Authorization TE Trailer Transfer-Encoding Upgrade);
34              
35             sub add {
36 9178     9178 1 17285 my ($self, $name) = (shift, shift);
37              
38 9178   66     25529 tr/\x0d\x0a// and croak "Invalid characters in $name header" for @_;
39              
40             # Make sure we have a normal case entry for name
41 9174         15506 my $key = lc $name;
42 9174 100 66     20344 $self->{names}{$key} //= $name unless $NAMES{$key};
43 9174         11382 push @{$self->{headers}{$key}}, @_;
  9174         25658  
44              
45 9174         20120 return $self;
46             }
47              
48             sub append {
49 61     61 1 944 my ($self, $name, $value) = @_;
50 61         207 my $old = $self->header($name);
51 61 100       345 return $self->header($name => defined $old ? "$old, $value" : $value);
52             }
53              
54             sub clone {
55 81     81 1 718 my $self = shift;
56              
57 81         217 my $clone = $self->new;
58 81   100     153 %{$clone->{names}} = %{$self->{names} // {}};
  81         253  
  81         435  
59 81         183 @{$clone->{headers}{$_}} = @{$self->{headers}{$_}} for keys %{$self->{headers}};
  81         280  
  305         839  
  305         585  
60              
61 81         336 return $clone;
62             }
63              
64             sub dehop {
65 22     22 1 42 my $self = shift;
66 22         47 delete @{$self->{headers}}{@HOP_BY_HOP};
  22         75  
67 22         67 return $self;
68             }
69              
70 69   100 69 1 596 sub every_header { shift->{headers}{lc shift} // [] }
71              
72             sub from_hash {
73 224     224 1 677 my ($self, $hash) = @_;
74              
75             # Empty hash deletes all headers
76 224 100       372 delete $self->{headers} if keys %{$hash} == 0;
  224         956  
77              
78             # Merge
79 224         773 for my $header (keys %$hash) {
80 221         469 my $value = $hash->{$header};
81 221 100       805 $self->add($header => ref $value eq 'ARRAY' ? @$value : $value);
82             }
83              
84 224         568 return $self;
85             }
86              
87             sub header {
88 1006     1006 1 3902 my ($self, $name) = (shift, shift);
89              
90             # Replace
91 1006 100       2678 return $self->remove($name)->add($name, @_) if @_;
92              
93 811 100       3208 return undef unless my $headers = $self->{headers}{lc $name};
94 590         3816 return join ', ', @$headers;
95             }
96              
97 2768   50 2768 1 11356 sub is_finished { (shift->{state} // '') eq 'finished' }
98              
99 2681     2681 1 8337 sub is_limit_exceeded { !!shift->{limit} }
100              
101 2158     2158 1 6795 sub leftovers { delete shift->{buffer} }
102              
103             sub links {
104 11     11 1 36 my ($self, $links) = @_;
105              
106 11 100       38 return $self->link(join(', ', map {qq{<$links->{$_}>; rel="$_"}} sort keys %$links)) if $links;
  4         21  
107              
108 8   100     17 my $header = $self->link // '';
109 8         17 my $data = {};
110 8         56 while ($header =~ s/^[,\s]*<(.+?)>//) {
111 8         24 my $target = $1;
112 8         30 (my $params, $header) = header_params $header;
113 8 100 100     125 $data->{$params->{rel}} //= {%$params, link => $target} if defined $params->{rel};
114             }
115              
116 8         59 return $data;
117             }
118              
119             sub names {
120 2097     2097 1 4843 my $self = shift;
121 2097 100       3101 return [map { $NAMES{$_} || $self->{names}{$_} } sort keys %{$self->{headers}}];
  8578         27554  
  2097         12872  
122             }
123              
124             sub parse {
125 2769     2769 1 5866 my ($self, $chunk) = @_;
126              
127 2769         5602 $self->{state} = 'headers';
128 2769         9305 $self->{buffer} .= $chunk;
129 2769   100     9819 my $headers = $self->{cache} //= [];
130 2769         7232 my $size = $self->max_line_size;
131 2769         6821 my $lines = $self->max_lines;
132 2769         70942 while ($self->{buffer} =~ s/^(.*?)\x0d?\x0a//) {
133 10778         26805 my $line = $1;
134              
135             # Check line size limit
136 10778 100 100     41409 if ($+[0] > $size || @$headers >= $lines) {
137 5         27 @$self{qw(state limit)} = ('finished', 1);
138 5         31 return $self;
139             }
140              
141             # New header
142 10773 100 66     41394 if ($line =~ /^(\S[^:]*):\s*(.*)$/) { push @$headers, [$1, $2] }
  8613 100       132890  
143              
144             # Multi-line
145 3         22 elsif ($line =~ s/^\s+// && @$headers) { $headers->[-1][1] .= " $line" }
146              
147             # Empty line
148             else {
149 2157         7884 $self->add(@$_) for @$headers;
150 2157         6199 @$self{qw(state cache)} = ('finished', []);
151 2157         9834 return $self;
152             }
153             }
154              
155             # Check line size limit
156 607 100       1505 @$self{qw(state limit)} = ('finished', 1) if length $self->{buffer} > $size;
157              
158 607         1299 return $self;
159             }
160              
161 3     3 1 11 sub referer { shift->referrer(@_) }
162 10     10 1 49 sub referrer { shift->header(Referer => @_) }
163              
164             sub remove {
165 1377     1377 1 3158 my ($self, $name) = @_;
166 1377         4238 delete $self->{headers}{lc $name};
167 1377         2989 return $self;
168             }
169              
170             sub to_hash {
171 28     28 1 3769 my ($self, $multi) = @_;
172 28 100       64 return {map { $_ => $self->{headers}{lc $_} } @{$self->names}} if $multi;
  45         233  
  18         60  
173 10         14 return {map { $_ => $self->header($_) } @{$self->names}};
  24         47  
  10         21  
174             }
175              
176             sub to_string {
177 1995     1995 1 3292 my $self = shift;
178              
179             # Make sure multi-line values are formatted correctly
180 1995         3066 my @headers;
181 1995         2876 for my $name (@{$self->names}) { push @headers, "$name: $_" for @{$self->{headers}{lc $name}} }
  1995         4654  
  8264         11309  
  8264         29927  
182              
183 1995         10197 return join "\x0d\x0a", @headers;
184             }
185              
186             1;
187              
188             =encoding utf8
189              
190             =head1 NAME
191              
192             Mojo::Headers - HTTP headers
193              
194             =head1 SYNOPSIS
195              
196             use Mojo::Headers;
197              
198             # Parse
199             my $headers = Mojo::Headers->new;
200             $headers->parse("Content-Length: 42\x0d\x0a");
201             $headers->parse("Content-Type: text/html\x0d\x0a\x0d\x0a");
202             say $headers->content_length;
203             say $headers->content_type;
204              
205             # Build
206             my $headers = Mojo::Headers->new;
207             $headers->content_length(42);
208             $headers->content_type('text/plain');
209             say $headers->to_string;
210              
211             =head1 DESCRIPTION
212              
213             L is a container for HTTP headers, based on L and L
214             7231|https://tools.ietf.org/html/rfc7231>.
215              
216             =head1 ATTRIBUTES
217              
218             L implements the following attributes.
219              
220             =head2 max_line_size
221              
222             my $size = $headers->max_line_size;
223             $headers = $headers->max_line_size(1024);
224              
225             Maximum header line size in bytes, defaults to the value of the C environment variable or C<8192>
226             (8KiB).
227              
228             =head2 max_lines
229              
230             my $num = $headers->max_lines;
231             $headers = $headers->max_lines(200);
232              
233             Maximum number of header lines, defaults to the value of the C environment variable or C<100>.
234              
235             =head1 METHODS
236              
237             L inherits all methods from L and implements the following new ones.
238              
239             =head2 accept
240              
241             my $accept = $headers->accept;
242             $headers = $headers->accept('application/json');
243              
244             Get or replace current header value, shortcut for the C header.
245              
246             =head2 accept_charset
247              
248             my $charset = $headers->accept_charset;
249             $headers = $headers->accept_charset('UTF-8');
250              
251             Get or replace current header value, shortcut for the C header.
252              
253             =head2 accept_encoding
254              
255             my $encoding = $headers->accept_encoding;
256             $headers = $headers->accept_encoding('gzip');
257              
258             Get or replace current header value, shortcut for the C header.
259              
260             =head2 accept_language
261              
262             my $language = $headers->accept_language;
263             $headers = $headers->accept_language('de, en');
264              
265             Get or replace current header value, shortcut for the C header.
266              
267             =head2 accept_ranges
268              
269             my $ranges = $headers->accept_ranges;
270             $headers = $headers->accept_ranges('bytes');
271              
272             Get or replace current header value, shortcut for the C header.
273              
274             =head2 access_control_allow_origin
275              
276             my $origin = $headers->access_control_allow_origin;
277             $headers = $headers->access_control_allow_origin('*');
278              
279             Get or replace current header value, shortcut for the C header from L
280             Resource Sharing|https://www.w3.org/TR/cors/>.
281              
282             =head2 add
283              
284             $headers = $headers->add(Foo => 'one value');
285             $headers = $headers->add(Foo => 'first value', 'second value');
286              
287             Add header with one or more lines.
288              
289             # "Vary: Accept
290             # Vary: Accept-Encoding"
291             $headers->add(Vary => 'Accept')->add(Vary => 'Accept-Encoding')->to_string;
292              
293             =head2 allow
294              
295             my $allow = $headers->allow;
296             $headers = $headers->allow('GET, POST');
297              
298             Get or replace current header value, shortcut for the C header.
299              
300             =head2 append
301              
302             $headers = $headers->append(Vary => 'Accept-Encoding');
303              
304             Append value to header and flatten it if necessary.
305              
306             # "Vary: Accept"
307             $headers->append(Vary => 'Accept')->to_string;
308              
309             # "Vary: Accept, Accept-Encoding"
310             $headers->vary('Accept')->append(Vary => 'Accept-Encoding')->to_string;
311              
312             =head2 authorization
313              
314             my $authorization = $headers->authorization;
315             $headers = $headers->authorization('Basic Zm9vOmJhcg==');
316              
317             Get or replace current header value, shortcut for the C header.
318              
319             =head2 cache_control
320              
321             my $cache_control = $headers->cache_control;
322             $headers = $headers->cache_control('max-age=1, no-cache');
323              
324             Get or replace current header value, shortcut for the C header.
325              
326             =head2 clone
327              
328             my $clone = $headers->clone;
329              
330             Return a new L object cloned from these headers.
331              
332             =head2 connection
333              
334             my $connection = $headers->connection;
335             $headers = $headers->connection('close');
336              
337             Get or replace current header value, shortcut for the C header.
338              
339             =head2 content_disposition
340              
341             my $disposition = $headers->content_disposition;
342             $headers = $headers->content_disposition('foo');
343              
344             Get or replace current header value, shortcut for the C header.
345              
346             =head2 content_encoding
347              
348             my $encoding = $headers->content_encoding;
349             $headers = $headers->content_encoding('gzip');
350              
351             Get or replace current header value, shortcut for the C header.
352              
353             =head2 content_language
354              
355             my $language = $headers->content_language;
356             $headers = $headers->content_language('en');
357              
358             Get or replace current header value, shortcut for the C header.
359              
360             =head2 content_length
361              
362             my $len = $headers->content_length;
363             $headers = $headers->content_length(4000);
364              
365             Get or replace current header value, shortcut for the C header.
366              
367             =head2 content_location
368              
369             my $location = $headers->content_location;
370             $headers = $headers->content_location('http://127.0.0.1/foo');
371              
372             Get or replace current header value, shortcut for the C header.
373              
374             =head2 content_range
375              
376             my $range = $headers->content_range;
377             $headers = $headers->content_range('bytes 2-8/100');
378              
379             Get or replace current header value, shortcut for the C header.
380              
381             =head2 content_security_policy
382              
383             my $policy = $headers->content_security_policy;
384             $headers = $headers->content_security_policy('default-src https:');
385              
386             Get or replace current header value, shortcut for the C header from L
387             1.0|https://www.w3.org/TR/CSP/>.
388              
389             =head2 content_type
390              
391             my $type = $headers->content_type;
392             $headers = $headers->content_type('text/plain');
393              
394             Get or replace current header value, shortcut for the C header.
395              
396             =head2 cookie
397              
398             my $cookie = $headers->cookie;
399             $headers = $headers->cookie('f=b');
400              
401             Get or replace current header value, shortcut for the C header from L
402             6265|https://tools.ietf.org/html/rfc6265>.
403              
404             =head2 date
405              
406             my $date = $headers->date;
407             $headers = $headers->date('Sun, 17 Aug 2008 16:27:35 GMT');
408              
409             Get or replace current header value, shortcut for the C header.
410              
411             =head2 dehop
412              
413             $headers = $headers->dehop;
414              
415             Remove hop-by-hop headers that should not be retransmitted.
416              
417             =head2 dnt
418              
419             my $dnt = $headers->dnt;
420             $headers = $headers->dnt(1);
421              
422             Get or replace current header value, shortcut for the C (Do Not Track) header, which has no specification yet, but
423             is very commonly used.
424              
425             =head2 etag
426              
427             my $etag = $headers->etag;
428             $headers = $headers->etag('"abc321"');
429              
430             Get or replace current header value, shortcut for the C header.
431              
432             =head2 every_header
433              
434             my $all = $headers->every_header('Location');
435              
436             Similar to L, but returns all headers sharing the same name as an array reference.
437              
438             # Get first header value
439             say $headers->every_header('Location')->[0];
440              
441             =head2 expect
442              
443             my $expect = $headers->expect;
444             $headers = $headers->expect('100-continue');
445              
446             Get or replace current header value, shortcut for the C header.
447              
448             =head2 expires
449              
450             my $expires = $headers->expires;
451             $headers = $headers->expires('Thu, 01 Dec 1994 16:00:00 GMT');
452              
453             Get or replace current header value, shortcut for the C header.
454              
455             =head2 from_hash
456              
457             $headers = $headers->from_hash({'Cookie' => 'a=b'});
458             $headers = $headers->from_hash({'Cookie' => ['a=b', 'c=d']});
459             $headers = $headers->from_hash({});
460              
461             Parse headers from a hash reference, an empty hash removes all headers.
462              
463             =head2 header
464              
465             my $value = $headers->header('Foo');
466             $headers = $headers->header(Foo => 'one value');
467             $headers = $headers->header(Foo => 'first value', 'second value');
468              
469             Get or replace the current header values.
470              
471             =head2 host
472              
473             my $host = $headers->host;
474             $headers = $headers->host('127.0.0.1');
475              
476             Get or replace current header value, shortcut for the C header.
477              
478             =head2 if_modified_since
479              
480             my $date = $headers->if_modified_since;
481             $headers = $headers->if_modified_since('Sun, 17 Aug 2008 16:27:35 GMT');
482              
483             Get or replace current header value, shortcut for the C header.
484              
485             =head2 if_none_match
486              
487             my $etag = $headers->if_none_match;
488             $headers = $headers->if_none_match('"abc321"');
489              
490             Get or replace current header value, shortcut for the C header.
491              
492             =head2 is_finished
493              
494             my $bool = $headers->is_finished;
495              
496             Check if header parser is finished.
497              
498             =head2 is_limit_exceeded
499              
500             my $bool = $headers->is_limit_exceeded;
501              
502             Check if headers have exceeded L or L.
503              
504             =head2 last_modified
505              
506             my $date = $headers->last_modified;
507             $headers = $headers->last_modified('Sun, 17 Aug 2008 16:27:35 GMT');
508              
509             Get or replace current header value, shortcut for the C header.
510              
511             =head2 leftovers
512              
513             my $bytes = $headers->leftovers;
514              
515             Get and remove leftover data from header parser.
516              
517             =head2 link
518              
519             my $link = $headers->link;
520             $headers = $headers->link('; rel="next"');
521              
522             Get or replace current header value, shortcut for the C header from L
523             5988|https://tools.ietf.org/html/rfc5988>.
524              
525             =head2 links
526              
527             my $links = $headers->links;
528             $headers = $headers->links({next => 'http://example.com/foo', prev => 'http://example.com/bar'});
529              
530             Get or set web links from or to C header according to L.
531              
532             # Extract information about next page
533             say $headers->links->{next}{link};
534             say $headers->links->{next}{title};
535              
536             =head2 location
537              
538             my $location = $headers->location;
539             $headers = $headers->location('http://127.0.0.1/foo');
540              
541             Get or replace current header value, shortcut for the C header.
542              
543             =head2 names
544              
545             my $names = $headers->names;
546              
547             Return an array reference with all currently defined headers.
548              
549             # Names of all headers
550             say for @{$headers->names};
551              
552             =head2 origin
553              
554             my $origin = $headers->origin;
555             $headers = $headers->origin('http://example.com');
556              
557             Get or replace current header value, shortcut for the C header from L
558             6454|https://tools.ietf.org/html/rfc6454>.
559              
560             =head2 parse
561              
562             $headers = $headers->parse("Content-Type: text/plain\x0d\x0a\x0d\x0a");
563              
564             Parse formatted headers.
565              
566             =head2 proxy_authenticate
567              
568             my $authenticate = $headers->proxy_authenticate;
569             $headers = $headers->proxy_authenticate('Basic "realm"');
570              
571             Get or replace current header value, shortcut for the C header.
572              
573             =head2 proxy_authorization
574              
575             my $authorization = $headers->proxy_authorization;
576             $headers = $headers->proxy_authorization('Basic Zm9vOmJhcg==');
577              
578             Get or replace current header value, shortcut for the C header.
579              
580             =head2 range
581              
582             my $range = $headers->range;
583             $headers = $headers->range('bytes=2-8');
584              
585             Get or replace current header value, shortcut for the C header.
586              
587             =head2 referer
588              
589             my $referrer = $headers->referer;
590             $headers = $headers->referer('http://example.com');
591              
592             Alias for L.
593              
594             =head2 referrer
595              
596             my $referrer = $headers->referrer;
597             $headers = $headers->referrer('http://example.com');
598              
599             Get or replace current header value, shortcut for the C header, there was a typo in L
600             2068|https://tools.ietf.org/html/rfc2068> which resulted in C becoming an official header.
601              
602             =head2 remove
603              
604             $headers = $headers->remove('Foo');
605              
606             Remove a header.
607              
608             =head2 sec_websocket_accept
609              
610             my $accept = $headers->sec_websocket_accept;
611             $headers = $headers->sec_websocket_accept('s3pPLMBiTxaQ9kYGzzhZRbK+xOo=');
612              
613             Get or replace current header value, shortcut for the C header from L
614             6455|https://tools.ietf.org/html/rfc6455>.
615              
616             =head2 sec_websocket_extensions
617              
618             my $extensions = $headers->sec_websocket_extensions;
619             $headers = $headers->sec_websocket_extensions('foo');
620              
621             Get or replace current header value, shortcut for the C header from L
622             6455|https://tools.ietf.org/html/rfc6455>.
623              
624             =head2 sec_websocket_key
625              
626             my $key = $headers->sec_websocket_key;
627             $headers = $headers->sec_websocket_key('dGhlIHNhbXBsZSBub25jZQ==');
628              
629             Get or replace current header value, shortcut for the C header from L
630             6455|https://tools.ietf.org/html/rfc6455>.
631              
632             =head2 sec_websocket_protocol
633              
634             my $proto = $headers->sec_websocket_protocol;
635             $headers = $headers->sec_websocket_protocol('sample');
636              
637             Get or replace current header value, shortcut for the C header from L
638             6455|https://tools.ietf.org/html/rfc6455>.
639              
640             =head2 sec_websocket_version
641              
642             my $version = $headers->sec_websocket_version;
643             $headers = $headers->sec_websocket_version(13);
644              
645             Get or replace current header value, shortcut for the C header from L
646             6455|https://tools.ietf.org/html/rfc6455>.
647              
648             =head2 server
649              
650             my $server = $headers->server;
651             $headers = $headers->server('Mojo');
652              
653             Get or replace current header value, shortcut for the C header.
654              
655             =head2 server_timing
656              
657             my $timing = $headers->server_timing;
658             $headers = $headers->server_timing('app;desc=Mojolicious;dur=0.0001');
659              
660             Get or replace current header value, shortcut for the C header from L
661             Timing|https://www.w3.org/TR/server-timing/>.
662              
663             =head2 set_cookie
664              
665             my $cookie = $headers->set_cookie;
666             $headers = $headers->set_cookie('f=b; path=/');
667              
668             Get or replace current header value, shortcut for the C header from L
669             6265|https://tools.ietf.org/html/rfc6265>.
670              
671             =head2 status
672              
673             my $status = $headers->status;
674             $headers = $headers->status('200 OK');
675              
676             Get or replace current header value, shortcut for the C header from L
677             3875|https://tools.ietf.org/html/rfc3875>.
678              
679             =head2 strict_transport_security
680              
681             my $policy = $headers->strict_transport_security;
682             $headers = $headers->strict_transport_security('max-age=31536000');
683              
684             Get or replace current header value, shortcut for the C header from L
685             6797|https://tools.ietf.org/html/rfc6797>.
686              
687             =head2 te
688              
689             my $te = $headers->te;
690             $headers = $headers->te('chunked');
691              
692             Get or replace current header value, shortcut for the C header.
693              
694             =head2 to_hash
695              
696             my $single = $headers->to_hash;
697             my $multi = $headers->to_hash(1);
698              
699             Turn headers into hash reference, array references to represent multiple headers with the same name are disabled by
700             default.
701              
702             say $headers->to_hash->{DNT};
703              
704             =head2 to_string
705              
706             my $str = $headers->to_string;
707              
708             Turn headers into a string, suitable for HTTP messages.
709              
710             =head2 trailer
711              
712             my $trailer = $headers->trailer;
713             $headers = $headers->trailer('X-Foo');
714              
715             Get or replace current header value, shortcut for the C header.
716              
717             =head2 transfer_encoding
718              
719             my $encoding = $headers->transfer_encoding;
720             $headers = $headers->transfer_encoding('chunked');
721              
722             Get or replace current header value, shortcut for the C header.
723              
724             =head2 upgrade
725              
726             my $upgrade = $headers->upgrade;
727             $headers = $headers->upgrade('websocket');
728              
729             Get or replace current header value, shortcut for the C header.
730              
731             =head2 user_agent
732              
733             my $agent = $headers->user_agent;
734             $headers = $headers->user_agent('Mojo/1.0');
735              
736             Get or replace current header value, shortcut for the C header.
737              
738             =head2 vary
739              
740             my $vary = $headers->vary;
741             $headers = $headers->vary('*');
742              
743             Get or replace current header value, shortcut for the C header.
744              
745             =head2 www_authenticate
746              
747             my $authenticate = $headers->www_authenticate;
748             $headers = $headers->www_authenticate('Basic realm="realm"');
749              
750             Get or replace current header value, shortcut for the C header.
751              
752             =head1 SEE ALSO
753              
754             L, L, L.
755              
756             =cut