stadly / http
一个处理 HTTP 头部的 PHP 库。
v1.2.0
2023-09-22 08:52 UTC
Requires
- php: >=8.0
- cocur/slugify: ^4.0
Requires (Dev)
- php-parallel-lint/php-parallel-lint: ^1.3
- phpstan/phpstan: ^1.0.0
- phpstan/phpstan-deprecation-rules: ^1.0.0
- phpstan/phpstan-phpunit: ^1.0.0
- phpstan/phpstan-strict-rules: ^1.0.0
- phpunit/phpunit: ^9.5
- squizlabs/php_codesniffer: ^3.5
- stadly/php-style: ^1.0
README
一个用于解析和构建 HTTP 头部的 PHP 库。
安装
通过 Composer
$ composer require stadly/http
用法
解析 HTTP 头部
可以使用每个头部类的 fromValue
解析头部值
use Stadly\Http\Header\Common\ContentType; use Stadly\Http\Header\Request\IfNoneMatch; use Stadly\Http\Header\Response\ContentDisposition; $contentType = ContentType::fromValue($_SERVER['HTTP_CONTENT_TYPE']); $ifNoneMatch = IfNoneMatch::fromValue($_SERVER['HTTP_IF_NONE_MATCH']); $contentDisposition = ContentDisposition::fromValue($_SERVER['HTTP_CONTENT_DISPOSITION']);
可以使用 HeaderFactory::fromString
解析头部字符串
use Stadly\Http\Header\Request\HeaderFactory as RequestHeaderFactory; use Stadly\Http\Header\Response\HeaderFactory as ResponseHeaderFactory; $requestHeaders = [ 'Content-Type: text/html; charset=UTF-8', 'If-Match: "67ab43", "54ed21", W/"7892dd"', 'Range: bytes=10-100, 200-300', ]; foreach ($requestHeaders as $headerString) { $header = RequestHeaderFactory::fromString($headerString); } $responseHeaders = [ 'Content-Type: multipart/form-data; boundary="abc def"', 'Cache-Control: no-cache="foo, bar", max-age=120, must-revalidate', "Content-Disposition: attachment; filename=unicorn.jpg; filename*=UTF-8''%F0%9F%A6%84.jpg", ]; foreach ($responseHeaders as $headerString) { $header = ResponseHeaderFactory::fromString($headerString); }
请注意,头部字符串包括头部名称,而头部值不包括。以下结果是相同的头部
use Stadly\Http\Header\Response\ContentDisposition; use Stadly\Http\Header\Response\HeaderFactory; $header1 = ContentDisposition::fromValue('inline; filename=image.jpg'); $header2 = HeaderFactory::fromString('Content-Disposition: inline; filename=image.jpg');
示例用法
示例解析 If-None-Match
请求头部并使用它来确定是否提供文件。为提供文件而构建响应头部 Content-Disposition
和 ETag
。
use Stadly\Http\Header\Request\IfNoneMatch; use Stadly\Http\Header\Response\ContentDisposition; use Stadly\Http\Header\Response\ETag; use Stadly\Http\Header\Value\EntityTag\EntityTag; $entityTag = new EntityTag(md5($filename)); $ifNoneMatch = IfNoneMatch::fromValue($_SERVER['HTTP_IF_NONE_MATCH']); if ($ifNoneMatch->evaluate($entityTag)) { // Serve file. $contentDisposition = new ContentDisposition('attachment'); $contentDisposition->setFilename(basename($filename)); header((string)$contentDisposition); $eTag = new ETag($entityTag); header((string)$eTag); readfile($filename); } else { // 304 Not modified. http_response_code(304); }
头部字段概述
已实现检查的头部字段。
常见头部字段
表示元数据
- 内容类型 https://tools.ietf.org/html/rfc7231#section-3.1.1.5
- 内容编码 https://tools.ietf.org/html/rfc7231#section-3.1.2.2
- 内容语言 https://tools.ietf.org/html/rfc7231#section-3.1.3.2
- 内容位置 https://tools.ietf.org/html/rfc7231#section-3.1.4.2
有效载荷语义
- 内容长度 https://tools.ietf.org/html/rfc7230#section-3.3.2
- 内容范围 https://tools.ietf.org/html/rfc7233#section-4.2
- 后缀 https://tools.ietf.org/html/rfc7230#section-4.4
- 传输编码 https://tools.ietf.org/html/rfc7230#section-3.3.1
请求头部字段
控制
- 缓存控制 https://tools.ietf.org/html/rfc7234#section-5.2
- 期望 https://tools.ietf.org/html/rfc7231#section-5.1.1
- 主机 https://tools.ietf.org/html/rfc7230#section-5.4
- 最大转发 https://tools.ietf.org/html/rfc7231#section-5.1.2
- 预处理 https://tools.ietf.org/html/rfc7234#section-5.4
- 范围 https://tools.ietf.org/html/rfc7233#section-3.1
- TE https://tools.ietf.org/html/rfc7230#section-4.3
条件
- If-Match https://tools.ietf.org/html/rfc7232#section-3.1
- If-None-Match https://tools.ietf.org/html/rfc7232#section-3.2
- If-Modified-Since https://tools.ietf.org/html/rfc7232#section-3.3
- If-Unmodified-Since https://tools.ietf.org/html/rfc7232#section-3.4
- If-Range https://tools.ietf.org/html/rfc7233#section-3.2
内容协商
- 接受 https://tools.ietf.org/html/rfc7231#section-5.3.2
- 接受字符集 https://tools.ietf.org/html/rfc7231#section-5.3.3
- 接受编码 https://tools.ietf.org/html/rfc7231#section-5.3.4
- Accept-Language https://tools.ietf.org/html/rfc7231#section-5.3.5
身份验证凭证
- 授权 https://tools.ietf.org/html/rfc7235#section-4.2
- 代理授权 https://tools.ietf.org/html/rfc7235#section-4.4
请求上下文
- 来自 https://tools.ietf.org/html/rfc7231#section-5.5.1
- 引用者 https://tools.ietf.org/html/rfc7231#section-5.5.2
- User-Agent https://tools.ietf.org/html/rfc7231#section-5.5.3
响应头字段
控制数据
- Age https://tools.ietf.org/html/rfc7234#section-5.1
- 缓存控制 https://tools.ietf.org/html/rfc7234#section-5.2
- Expires https://tools.ietf.org/html/rfc7234#section-5.3
- Date https://tools.ietf.org/html/rfc7231#section-7.1.1.2
- Location https://tools.ietf.org/html/rfc7231#section-7.1.2
- Retry-After https://tools.ietf.org/html/rfc7231#section-7.1.3
- Vary https://tools.ietf.org/html/rfc7231#section-7.1.4
- Warning https://tools.ietf.org/html/rfc7234#section-5.5
验证器头字段
- ETag https://tools.ietf.org/html/rfc7232#section-2.3
- Last-Modified https://tools.ietf.org/html/rfc7232#section-2.2
身份验证挑战
- WWW-Authenticate https://tools.ietf.org/html/rfc7235#section-4.1
- Proxy-Authenticate https://tools.ietf.org/html/rfc7235#section-4.3
响应上下文
- Accept-Ranges https://tools.ietf.org/html/rfc7233#section-2.3
- Allow https://tools.ietf.org/html/rfc7231#section-7.4.1
- Server https://tools.ietf.org/html/rfc7231#section-7.4.2
其他
- Content-Disposition https://tools.ietf.org/html/rfc6266#section-4
变更日志
请参阅CHANGELOG以获取有关最近更改的更多信息。
测试
$ composer test
贡献
请参阅CONTRIBUTING和CODE_OF_CONDUCT以获取详细信息。
安全性
如果您发现任何安全问题,请通过电子邮件[email protected]而不是使用问题跟踪器。
鸣谢
许可协议
MIT 许可协议 (MIT)。请参阅许可文件以获取更多信息。