ceive/net-hypertext

超文本 (HTT)

dev-master 2017-08-23 02:36 UTC

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>';