ceive / net-hypertext
超文本 (HTT)
dev-master
2017-08-23 02:36 UTC
Requires
- ceive/data-keword: dev-master
- ceive/net: dev-master
- ceive/value: dev-master
This package is not auto-updated.
Last update: 2024-09-29 03:59:16 UTC
README
HTT 规范
摘要
- 双向反应:标题-内容
- 标题影响内容格式
- 内容影响标题(默认为
Content-Length)如果内容是
ContentInterface的派生类,则可以在显示前影响任何标题
- 根据标题编码/解码内容
文档的字符串表示,完全根据标题进行编码。
- 从不同的来源读取(默认字符串)
在读取流时支持
Transfer-Encoding: chunked - 写入不同的来源(默认字符串)
- 访问标题应使用
Camelize风格。 - 标题操作工具
-
标题键的规范化(
Camelize风格) -
解析值
['value' => null, 'params' => [], 'elements' => []]
-
将结构渲染为字符串
渲染过程:文档根据标题进行编码。如果内容是 ContentInterface 的派生类,则在此对象内部可能发生更改标题的操作,直到渲染。
渲染结果
文档的内容应完全符合标题,就像根据内容更改的标题应符合内容类型的标准要求(如果内容是 ContentInterface)。
解析(语法分析和解析)
在解析时:从字符串解析文档,也根据标题进行解码内容。在解析后:文档应包含已解码、规范化的内容,与原生表示一致。
不同来源的可能性
应在此处提及文档可以来自不同的来源。例如 [从字符串到字符串] 或 [从流到流]。在流式读取时,如果 Transfer-Encoding 标题(不要与 Content-Transfer-Encoding 混淆)等于 chunked,则将从流中解析部分(块/块),文本内容将从块中解析并形成用于进一步按标题解析的内容。
示例
<?php
namespace Jungle\Util\Specifications\Htt;
include '../../loader.php';
/** Кодировки cp1253, koi8-r, iso-8859-5, etc...*/
$DOCUMENT_CHARSET = 'iso-8859-5';
$document = new Document();
$document->setHeaders([
'' => 'POST / HTTP/1.1',
'Accept' => 'text/html',
//'Content-Transfer-Encoding' => 'quoted-printable',
//'Content-Transfer-Encoding' => 'base64',
'Content-Type' => 'text/html; charset=' . $DOCUMENT_CHARSET
]);
$multipart = new Content\Multipart();
$raw_document = <<<'TAG'
Content-Type: image/gif
Content-Disposition: attachment; filename=gif1.gif; name=part1
Текст все-же в нужной кодировке, я думаю)
TAG;
$multipart->addPart(new Document($raw_document));
$document->setContent($multipart);
/**
* По умолчанию сервер PHP отправляет клиенту charset=utf-8,
* поэтому если отобразить контент с другой кодировкой, то читаемого текста мы не увидим.
* Для проверки отображения мультибайтового контента в кодировках отличающихся от utf-8
* можно указать в заголовках ответа charset=$DOCUMENT_CHARSET
*
* Так-же по умолчанию, файл написан в кодировке utf-8, весь видимый в файле текст. в том числе многобайтовый,
* если указать в заголовках ответа charset=$DOCUMENT_CHARSET, то весь видимый в файле текст станет нечитаемым в браузере,
* а мультибайтовый текст документов станет видимым.
* Это можно проверить сменив кодировку страницы в настройках страницы в браузере.
*
* @code: ini_set('default_charset',$DOCUMENT_CHARSET);
* Можно эмулировать эту опирацию, в ручную сменив кодировку страницы в настройках страницы в браузере.
*
*/
//ini_set('default_charset',$DOCUMENT_CHARSET);
echo '<h3>Обращение со структурой Документа</h3>';
echo '<pre style="font-family: Lucida Console">';
echo ">> Получим Партицию мультипарт контента, с Content-Disposition: name='part1' и выведем содержание\r\n";
echo '<br/>';
echo $multipart->getPartByDispositionName('part1')->getContent();
echo '</pre>';
echo '<h3>Рендеринг структуры документа в строку</h3>';
echo '<pre style="font-family: Lucida Console">';
$inline_document = "$document";
echo $inline_document;
echo '</pre>';
$hash = md5($inline_document);
echo '<h3>Парсинг документа из строки, и проверка целостности дальнейшего рендеринга</h3>';
$document = new Document($inline_document);
echo '<pre style="font-family: Lucida Console">';
echo $inline_re_document = $document;
echo '</pre>';
$hash_re = md5($inline_re_document);
echo '<h2>Разница <u>render(structure) > parse(rendered) > render(parsed_structure)</u>: '.strcmp($inline_document, $inline_re_document).'</h2>';
echo '<h2>Сравните хеши</h2>';
echo '<div>Рендеринг 1: '.$hash.'</div>';
echo '<div>Рендеринг 2: '.$hash_re.'</div>';