706 | 706 |
next unless defined;
|
707 | 707 |
while (my ($k, $v) = each %$_) {
|
708 | 708 |
$request->{headers}{lc $k} = $v;
|
|
709 |
$request->{header_case}{lc $k} = $k;
|
709 | 710 |
}
|
710 | 711 |
}
|
711 | 712 |
|
|
1177 | 1178 |
sub write_request {
|
1178 | 1179 |
@_ == 2 || die(q/Usage: $handle->write_request(request)/ . "\n");
|
1179 | 1180 |
my($self, $request) = @_;
|
1180 | |
$self->write_request_header(@{$request}{qw/method uri headers/});
|
|
1181 |
$self->write_request_header(@{$request}{qw/method uri headers header_case/});
|
1181 | 1182 |
$self->write_body($request) if $request->{cb};
|
1182 | 1183 |
return;
|
1183 | 1184 |
}
|
1184 | 1185 |
|
1185 | |
my %HeaderCase = (
|
1186 | |
'content-md5' => 'Content-MD5',
|
1187 | |
'etag' => 'ETag',
|
1188 | |
'te' => 'TE',
|
1189 | |
'www-authenticate' => 'WWW-Authenticate',
|
1190 | |
'x-xss-protection' => 'X-XSS-Protection',
|
|
1186 |
# Standard request header names/case from HTTP/1.1 RFCs
|
|
1187 |
my @rfc_request_headers = qw(
|
|
1188 |
Accept Accept-Charset Accept-Encoding Accept-Language Authorization
|
|
1189 |
Cache-Control Connection Content-Length Expect From Host
|
|
1190 |
If-Match If-Modified-Since If-None-Match If-Range If-Unmodified-Since
|
|
1191 |
Max-Forwards Pragma Proxy-Authorization Range Referer TE Trailer
|
|
1192 |
Transfer-Encoding Upgrade User-Agent Via
|
1191 | 1193 |
);
|
|
1194 |
|
|
1195 |
my @other_request_headers = qw(
|
|
1196 |
Content-Encoding Content-MD5 Content-Type Cookie DNT Date Origin
|
|
1197 |
X-XSS-Protection
|
|
1198 |
);
|
|
1199 |
|
|
1200 |
my %HeaderCase = map { lc($_) => $_ } @rfc_request_headers, @other_request_headers;
|
1192 | 1201 |
|
1193 | 1202 |
# to avoid multiple small writes and hence nagle, you can pass the method line or anything else to
|
1194 | 1203 |
# combine writes.
|
1195 | 1204 |
sub write_header_lines {
|
1196 | |
(@_ == 2 || @_ == 3 && ref $_[1] eq 'HASH') || die(q/Usage: $handle->write_header_lines(headers[,prefix])/ . "\n");
|
1197 | |
my($self, $headers, $prefix_data) = @_;
|
|
1205 |
(@_ >= 2 && @_ <= 4 && ref $_[1] eq 'HASH') || die(q/Usage: $handle->write_header_lines(headers, [header_case, prefix])/ . "\n");
|
|
1206 |
my($self, $headers, $header_case, $prefix_data) = @_;
|
|
1207 |
$header_case ||= {};
|
1198 | 1208 |
|
1199 | 1209 |
my $buf = (defined $prefix_data ? $prefix_data : '');
|
1200 | 1210 |
while (my ($k, $v) = each %$headers) {
|
1201 | 1211 |
my $field_name = lc $k;
|
1202 | 1212 |
if (exists $HeaderCase{$field_name}) {
|
1203 | 1213 |
$field_name = $HeaderCase{$field_name};
|
|
1214 |
}
|
|
1215 |
elsif (exists $header_case->{$field_name}) {
|
|
1216 |
$field_name = $header_case->{$field_name};
|
1204 | 1217 |
}
|
1205 | 1218 |
else {
|
1206 | 1219 |
$field_name =~ /\A $Token+ \z/xo
|
|
1363 | 1376 |
}
|
1364 | 1377 |
|
1365 | 1378 |
sub write_request_header {
|
1366 | |
@_ == 4 || die(q/Usage: $handle->write_request_header(method, request_uri, headers)/ . "\n");
|
1367 | |
my ($self, $method, $request_uri, $headers) = @_;
|
1368 | |
|
1369 | |
return $self->write_header_lines($headers, "$method $request_uri HTTP/1.1\x0D\x0A");
|
|
1379 |
@_ == 5 || die(q/Usage: $handle->write_request_header(method, request_uri, headers, header_case)/ . "\n");
|
|
1380 |
my ($self, $method, $request_uri, $headers, $header_case) = @_;
|
|
1381 |
|
|
1382 |
return $self->write_header_lines($headers, $header_case, "$method $request_uri HTTP/1.1\x0D\x0A");
|
1370 | 1383 |
}
|
1371 | 1384 |
|
1372 | 1385 |
sub _do_timeout {
|
|
1706 | 1719 |
|
1707 | 1720 |
There is no support for a Request-URI of '*' for the 'OPTIONS' request.
|
1708 | 1721 |
|
|
1722 |
=item *
|
|
1723 |
|
|
1724 |
Headers mentioned in the RFCs and some other, well-known headers are
|
|
1725 |
generated with their canonical case. Other headers are sent in the
|
|
1726 |
case provided by the user. There is no order to header fields.
|
|
1727 |
|
1709 | 1728 |
=back
|
1710 | 1729 |
|
1711 | 1730 |
Despite the limitations listed above, HTTP::Tiny is considered
|