HTTP::Tiny - 一个小巧、简单、正确的 HTTP/1.1 客户端
版本 0.086
use HTTP::Tiny;
my $response = HTTP::Tiny->new->get('http://example.com/');
die "Failed!\n" unless $response->{success};
print "$response->{status} $response->{reason}\n";
while (my ($k, $v) = each %{$response->{headers}}) {
for (ref $v eq 'ARRAY' ? @$v : $v) {
print "$k: $_\n";
}
}
print $response->{content} if length $response->{content};
这是一个非常简单的 HTTP/1.1 客户端,旨在进行简单的请求,而无需像 LWP::UserAgent 这样的大型框架的开销。
它比 HTTP::Lite 更正确、更完整。它支持代理和重定向。它还可以在 EINTR 之后正确恢复。
如果安装了 IO::Socket::IP 0.25 或更高版本,HTTP::Tiny 将使用它而不是 IO::Socket::INET,以透明地支持 IPv4 和 IPv6。
Cookie 支持需要 HTTP::CookieJar 或支持 add
和 cookie_header
方法的等效类。
$http = HTTP::Tiny->new( %attributes );
此构造函数返回一个新的 HTTP::Tiny 对象。有效的属性包括
agent
— 用户代理字符串(默认为 'HTTP-Tiny/$VERSION')。如果 agent
— 以空格字符结尾,则会附加默认的用户代理字符串。
cookie_jar
— HTTP::CookieJar — 的实例或支持 add
和 cookie_header
方法的等效类
default_headers
— 用于请求的默认标头哈希引用
local_address
— 要绑定的本地 IP 地址
keep_alive
— 是否重用上次连接(如果方案、主机和端口相同)(默认为 1)
max_redirect
— 允许的最大重定向次数(默认为 5)
max_size
— 最大响应大小(以字节为单位)(仅在不使用数据回调时)。如果定义,响应大小超过此值的请求将返回 599 状态码。
http_proxy
— 用于 HTTP 连接的代理服务器 URL(默认为 $ENV{http_proxy}
— 如果已设置)
https_proxy
— 用于 HTTPS 连接的代理服务器 URL(默认为 $ENV{https_proxy}
— 如果已设置)
proxy
— 用于 HTTP 和 HTTPS 连接的通用代理服务器 URL(默认为 $ENV{all_proxy}
— 如果已设置)
no_proxy
— 不应代理的域名后缀列表。必须是逗号分隔的字符串或数组引用。(默认为 $ENV{no_proxy}
—)
timeout
— 请求超时时间(以秒为单位)(默认为 60)如果套接字打开、读取或写入时间超过超时时间,请求响应状态码将为 599。
verify_SSL
— 一个布尔值,指示是否验证 https
— 连接的 TLS/SSL 证书(默认为 true)。在版本 0.083 中从 false 更改为 true。
SSL_options
— 要传递给 IO::Socket::SSL 的 SSL_*
— 选项的哈希引用
$ENV{PERL_HTTP_TINY_SSL_INSECURE_BY_DEFAULT}
- 如果设置为 1,则将默认证书验证行为更改为不检查服务器身份。仅在未设置 verify_SSL
时有效。在版本 0.083 中添加。
每个属性都存在访问器/修改器方法。
为 proxy
、http_proxy
或 https_proxy
传递显式 undef
将阻止从环境获取相应的代理。
请求执行期间的错误将导致伪 HTTP 状态码为 599,原因是“内部异常”。响应中的内容字段将包含错误文本。
keep_alive
参数启用持久连接,但仅限于单个目标方案、主机和端口。如果通过访问器修改了任何与连接相关的属性,或者进程 ID 或线程 ID 发生更改,则持久连接将被丢弃。如果您希望跨多个目标建立持久连接,请使用多个 HTTP::Tiny 对象。
有关 verify_SSL
和 SSL_options
属性的更多信息,请参阅 "SSL 支持"。
$response = $http->get($url);
$response = $http->get($url, \%options);
$response = $http->head($url);
这些方法是为给定方法调用 request()
的简写。URL 必须对不安全字符进行转义,并对国际域名进行编码。有关有效选项和对响应的描述,请参见 request()
。
如果状态代码为 2XX,则响应的 success
字段将为 true。
$response = $http->post_form($url, $form_data);
$response = $http->post_form($url, $form_data, \%options);
此方法执行 POST
请求,并将表单数据哈希或数组引用中的键值对发送到给定 URL,并使用 content-type
为 application/x-www-form-urlencoded
。如果数据作为数组引用提供,则顺序将保留;如果作为哈希引用提供,则条款将按键和值排序以确保一致性。有关编码的详细信息,请参见 www_form_urlencode
方法的文档。
URL 必须对不安全字符进行转义,并对国际域名进行编码。有关有效选项和对响应的描述,请参见 request()
。选项哈希引用中的任何 content-type
标头或内容都将被忽略。
如果状态代码为 2XX,则响应的 success
字段将为 true。
$response = $http->mirror($url, $file, \%options)
if ( $response->{success} ) {
print "$file is up to date\n";
}
对 URL 执行 GET
请求,并将响应主体保存到提供的文件名中。URL 必须对不安全字符进行转义,并对国际域名进行编码。如果文件已存在,则请求将包含一个 If-Modified-Since
标头,其中包含文件的修改时间戳。您可以在 $options->{headers}
哈希中自己指定不同的 If-Modified-Since
标头。
如果状态代码为 2XX 或 304(未修改),则响应的 success
字段将为 true。
如果文件已修改,并且服务器响应包含正确格式的 Last-Modified
标头,则文件修改时间将相应更新。
$response = $http->request($method, $url);
$response = $http->request($method, $url, \%options);
对给定 URL 执行给定方法类型('GET'、'HEAD'、'POST'、'PUT' 等)的 HTTP 请求。URL 必须对不安全字符进行转义,并对国际域名进行编码。
注意:方法名称区分大小写,符合 HTTP/1.1 规范。不要在真正需要 GET
时使用 get
。有关这如何应用于重定向,请参见 LIMITATIONS。
如果 URL 包含“user:password”节,它们将用于基本身份验证标头。(授权标头不会包含在重定向请求中。)例如
$http->request('GET', 'http://Aladdin:open [email protected]/');
如果 "user:password" 部分包含保留字符,则必须进行百分比转义。
$http->request('GET', 'http://john%40example.com:[email protected]/');
可以附加一个选项的哈希引用来修改请求。
有效的选项包括:
headers
— 包含要与请求一起包含的标头的哈希引用。如果标头的值为数组引用,则该标头将使用数组中的每个值多次输出。这些标头会覆盖任何默认标头。
content
— 一个标量,作为请求正文包含,或者一个代码引用,将被迭代调用以生成请求正文。
trailer_callback
— 一个代码引用,如果存在,将被调用以提供尾部标头的哈希引用(仅在使用分块传输编码时使用)。
data_callback
— 一个代码引用,将被调用以接收响应正文的每个块。
peer
— 覆盖主机解析,并强制所有连接仅转到特定对等地址,而不管请求的 URL 如何。这将包括任何重定向!此选项应谨慎使用(例如调试或非常特殊的情况)。它可以作为标量或代码引用给出,该引用将接收主机名,其响应将被视为地址。
Host
标头根据 RFC 2616 从 URL 生成。在 headers
选项中指定 Host
是致命错误。其他标头可能会被忽略或覆盖,如果需要,以确保传输符合标准。
如果 content
选项是代码引用,它将被迭代调用以提供请求的正文内容。当迭代器耗尽时,它应该返回空字符串或 undef。
如果 content
选项为空字符串,则不会生成 content-type
或 content-length
标头。
如果提供了data_callback
选项,它将被迭代调用,直到接收整个响应主体。第一个参数将是一个包含响应主体一部分的字符串,第二个参数将是正在进行的响应哈希引用,如下所述。(这允许根据在内容主体之前接收到的status
或headers
定制回调的操作。)
请求/响应中的内容数据被处理为“原始字节”。任何编码/解码(以及相关的标头)都是调用者的责任。
request
方法返回一个包含响应的哈希引用。哈希引用将具有以下键
success
— 布尔值,指示操作是否返回了 2XX 状态码
url
— 提供响应的 URL。这是请求的 URL,除非有重定向,在这种情况下,它是重定向链中查询的最后一个 URL
status
— 响应的 HTTP 状态码
reason
— 服务器返回的响应短语
content
— 响应的主体。如果响应没有任何内容,或者提供了数据回调来使用响应主体,这将是空字符串
headers
— 标头字段的哈希引用。所有标头字段名称都将被规范化为小写。如果标头重复,则值将是数组引用;否则,它将是一个包含值的标量字符串
protocol
- 如果此字段存在,它是响应的协议,例如 HTTP/1.0 或 HTTP/1.1
redirects
如果此字段存在,它是重定向中响应哈希引用的数组引用,按照重定向发生的顺序。如果它不存在,则没有发生重定向。
在请求执行期间发生错误时,status
字段将包含 599,content
字段将包含错误文本。
$params = $http->www_form_urlencode( $data );
$response = $http->get("http://example.com/query?$params");
此方法将数据哈希或数组引用中的键/值对转换为x-www-form-urlencoded
字符串。数据引用中的键和值将根据 RFC 3986 进行 UTF-8 编码和转义。如果值是数组引用,则键将与数组引用的每个值一起重复。如果数据作为哈希引用提供,则结果字符串中的键/值对将按键和值排序,以确保一致的排序。
$ok = HTTP::Tiny->can_ssl;
($ok, $why) = HTTP::Tiny->can_ssl;
($ok, $why) = $http->can_ssl;
指示是否支持 SSL。当作为类对象调用时,它检查Net::SSLeay和IO::Socket::SSL的正确版本。当作为对象方法调用时,如果SSL_verify
为真,或者如果在SSL_options
中设置了SSL_verify_mode
,它将检查 CA 文件是否可用。
在标量上下文中,返回一个布尔值,指示 SSL 是否可用。在列表上下文中,返回布尔值和一个(可能是多行的)错误字符串,指示 SSL 为什么不可用。
$host = $http->connected;
($host, $port) = $http->connected;
指示是否根据 keep_alive
选项保持与对等方的连接。
在标量上下文中,返回用冒号分隔的对等方主机和端口,或 undef
(如果未连接到对等方)。在列表上下文中,返回对等方主机和端口或空列表(如果未连接到对等方)。
注意:此方法不能可靠地用于发现远程主机是否已关闭其套接字端。
仅当安装了 IO::Socket::SSL 1.56 或更高版本和 Net::SSLeay 1.49 或更高版本时,才支持直接 https
连接。如果未安装这些模块的最新版本或 TLS 加密失败,则会发生错误。您还可以使用 HTTP::Tiny::can_ssl()
实用程序函数,该函数返回布尔值以查看是否安装了所需的模块。
可以通过支持 CONNECT 命令(即 RFC 2817)的 http
代理建立 https
连接。您不能通过本身需要 https
进行通信的代理代理 https
。
TLS/SSL 提供两种不同的功能
加密通信通道
服务器身份验证
默认情况下,HTTP::Tiny 会验证服务器身份.
由于安全问题,此行为在 0.083 版本中发生了更改。可以通过将 $ENV{PERL_HTTP_TINY_SSL_INSECURE_BY_DEFAULT}
设置为 1 来启用之前的默认行为。
验证通过检查 TLS/SSL 连接是否具有与连接主机名相对应的有效证书以及证书是否已由 CA 验证来完成。假设您信任 CA,这将防止 中间人攻击。
证书验证需要包含受信任 CA 证书的文件。
如果存在环境变量 SSL_CERT_FILE
,HTTP::Tiny 将尝试在该位置查找 CA 证书文件。
如果安装了 Mozilla::CA 模块,HTTP::Tiny 将使用其中包含的 CA 文件作为受信任 CA 的来源。
如果该模块不可用,则 HTTP::Tiny 将在多个系统特定的默认位置搜索 CA 证书文件
/etc/ssl/certs/ca-certificates.crt
/etc/pki/tls/certs/ca-bundle.crt
/etc/ssl/ca-bundle.pem
/etc/openssl/certs/ca-certificates.crt
/etc/ssl/cert.pem
/usr/local/share/certs/ca-root-nss.crt
/etc/pki/tls/cacert.pem
/etc/certs/ca-certificates.crt
如果 verify_SSL
为真且没有可用的 CA 证书文件,则会发生错误。
如果您希望完全控制 TLS/SSL 连接,则 SSL_options
属性允许您提供一个哈希引用,该引用将传递给 IO::Socket::SSL::start_SSL()
,覆盖 HTTP::Tiny 设置的任何选项。例如,要提供您自己的受信任 CA 文件
SSL_options => {
SSL_ca_file => $file_path,
}
SSL_options
属性也可以用于诸如为服务器身份验证提供客户端证书或控制用于 TLS/SSL 连接的密码选择等操作。有关详细信息,请参阅 IO::Socket::SSL 文档。
HTTP::Tiny 可以代理 http
和 https
请求。仅支持基本代理授权,并且必须作为代理 URL 的一部分提供:http://user:[email protected]/
。
HTTP::Tiny 支持以下代理环境变量
http_proxy 或 HTTP_PROXY
https_proxy 或 HTTPS_PROXY
all_proxy 或 ALL_PROXY
如果设置了 REQUEST_METHOD
环境变量,则这可能是一个 CGI 进程,并且 HTTP_PROXY
将从 Proxy:
标头设置,这是一个安全风险。如果设置了 REQUEST_METHOD
,则会忽略 HTTP_PROXY
(仅忽略大写变体),但会考虑 CGI_HTTP_PROXY
。
支持使用 CONNECT 方法通过 http
代理隧道 https
。如果您的代理本身使用 https
,则无法通过它隧道 https
。
请注意,代理 https
连接会使您面临代理服务器中间人攻击的风险。
no_proxy
环境变量以逗号分隔的域名扩展列表的形式支持,代理不应为此列表使用代理。
传递给 new
的代理参数将覆盖其相应的环境变量。
HTTP::Tiny 有条件地符合 HTTP/1.1 规范
"消息语法和路由" [RFC7230]
"语义和内容" [RFC7231]
"条件请求" [RFC7232]
"范围请求" [RFC7233]
"缓存" [RFC7234]
"身份验证" [RFC7235]
它试图满足规范中所有“必须”的要求,但没有实现所有“应该”的要求。(注意:它是针对早期的 RFC 2616 规范开发的,可能尚未满足修订后的 RFC 7230-7235 规范。)此外,HTTP::Tiny 支持 RFC 5789 的 PATCH
方法。
一些值得注意的特定限制包括
HTTP::Tiny 专注于正确的传输。用户有责任确保用户定义的标头和内容符合 HTTP/1.1 规范。
用户必须确保 URL 针对不安全字符进行了正确转义,并且国际域名已正确编码为 ASCII。请参阅 URI::Escape、URI::_punycode 和 Net::IDN::Encode。
重定向严格遵循规范。仅当请求方法为“GET”或“HEAD”时,重定向才对响应代码 301、302、307 和 308 自动执行。响应代码 303 始终转换为“GET”重定向,如规范所规定。不支持状态 305(“使用代理”)重定向。
没有使用 Expect
标头延迟请求主体的规定。意外的 1XX
响应将根据规范静默忽略。
仅支持“分块”的 Transfer-Encoding
。
不支持“OPTIONS”请求的“*” Request-URI。
RFC 中提到的标头以及其他一些众所周知的标头将以其规范形式生成。其他标头将以用户提供的形式发送。除了控制标头(首先发送)之外,标头将以任意顺序发送。
尽管存在上述限制,但 HTTP::Tiny 被认为功能齐全。新的功能请求应发送到 HTTP::Tiny::UA。
HTTP::Tiny::UA - HTTP::Tiny 的更高级别 UA 功能
HTTP::Thin - 带有 HTTP::Request/HTTP::Response 兼容性的 HTTP::Tiny 包装器
HTTP::Tiny::Mech - 将 WWW::Mechanize 实例包装在 HTTP::Tiny 兼容接口中
IO::Socket::IP - IPv6 支持所需
IO::Socket::SSL - SSL 支持所需
LWP::UserAgent - 如果 HTTP::Tiny 对您来说不够用,这是“标准”做法
Mozilla::CA - 如果您想验证 SSL 证书,则需要此项
Net::SSLeay - SSL 支持所需
请通过以下问题跟踪器报告任何 Bug 或功能请求:https://github.com/chansen/p5-http-tiny/issues。您将自动收到有关您问题进度的通知。
这是一个开源软件。代码库可供公众根据许可条款进行审查和贡献。
https://github.com/chansen/p5-http-tiny
git clone https://github.com/chansen/p5-http-tiny.git
Christian Hansen <[email protected]>
David Golden <[email protected]>
Alan Gardner <[email protected]>
Alessandro Ghedini <[email protected]>
A. Sinan Unur <[email protected]>
Brad Gilbert <[email protected]>
brian m. carlson <[email protected]>
Chris Nehren <[email protected]>
Chris Weyl <[email protected]>
Claes Jakobsson <[email protected]>
Clinton Gormley <[email protected]>
Craig A. Berry <[email protected]>
Craig Berry <[email protected]>
David Golden <[email protected]>
David Mitchell <[email protected]>
Dean Pearce <[email protected]>
Edward Zborowski <[email protected]>
Felipe Gasper <[email protected]>
Graham Knop <[email protected]>
Greg Kennedy <[email protected]>
James E Keenan <[email protected]>
James Raspass <[email protected]>
Jeremy Mates <[email protected]>
Jess Robinson <[email protected]>
Karen Etheridge <[email protected]>
Lukas Eklund <[email protected]>
Martin J. Evans <[email protected]>
Martin-Louis Bright <[email protected]>
Matthew Horsfall <[email protected]>
Michael R. Davis <[email protected]>
Mike Doherty <[email protected]>
Nicolas Rochelemagne <[email protected]>
Olaf Alders <[email protected]>
Olivier Mengué <[email protected]>
Petr Písař <[email protected]>
sanjay-cpu <[email protected]>
Serguei Trouchelle <[email protected]>
Shoichi Kaji <[email protected]>
SkyMarshal <[email protected]>
Sören Kornetzki <[email protected]>
Steve Grazzini <[email protected]>
Stig Palmquist <[email protected]>
Syohei YOSHIDA <[email protected]>
Tatsuhiko Miyagawa <[email protected]>
Tom Hukins <[email protected]>
Tony Cook <[email protected]>
Xavier Guimard <[email protected]>
本软件版权 (c) 2023 由 Christian Hansen 所有。
这是一个自由软件;您可以根据 Perl 5 编程语言系统本身的相同条款重新发布和/或修改它。