make frame fromBinary public, improve docs

This commit is contained in:
Chris 2024-02-27 00:21:54 +01:00
parent b706afaf67
commit 5c2279a544
5 changed files with 41 additions and 8 deletions

View File

@ -22,10 +22,9 @@ The idea is tho end up with something like this. Expect a lot to change tho.
// Tradtional request handler
$http = function (Psr\Http\Message\ServerRequestInterface $request, ?callable $next=null) {
$promise = new React\Promise\Promise();
React\Loop\Loop::laterTick(function () use ($request, $promise) {
$promise = new React\Promise\Promise(function ($resolve) use ($request) {
// ...
$promise->resolve($response);
$resolve($response);
});
return $promise;
};

View File

@ -68,7 +68,7 @@ abstract class Frame
abstract public function toBinary(): string;
abstract protected function fromBinary(string $binary): void;
abstract public function fromBinary(string $binary): void;
public function encodeFrame(): string
{

View File

@ -43,9 +43,12 @@ class SettingsFrame extends Frame
return $packed;
}
protected function fromBinary(string $data): void
public function fromBinary(string $data): void
{
for ($n = 0; $n < strlen($data) - 3; $n = $n + 3) {
$unpacked = unpack('vsetting/Vvalue', substr($data,$n,3));
$this->set($unpacked['setting'], $unpacked['value']);
}
}
}

View File

@ -86,6 +86,12 @@ class HeaderPacker
if (!self::$huffman) self::$huffman = new Codec(Dictionary::createRfc7541Dictionary());
}
/**
* Pack a HeaderBag into a binary string.
*
* @param HeaderBag $headers
* @return string
*/
public function packHeaders(HeaderBag $headers): string
{
$packed = '';
@ -102,12 +108,19 @@ class HeaderPacker
$packed .= $value;
} else {
// Literal
// TODO pack literal
}
}
return $packed;
}
/**
* Unpack a binary string to a HeaderBag.
*
* @param string $raw
* @return HeaderBag
*/
public function unpackHeaders(string $raw): HeaderBag
{
$headers = new HeaderBag();
@ -167,7 +180,9 @@ class HeaderPacker
{
if ($index < self::STATIC_TABLE_SIZE)
return self::$staticTable[$index];
// TODO bounds check
if ($index - self::STATIC_TABLE_SIZE >= count($this->dynamicTable)) {
// TODO throw exception
}
return $this->dynamicTable[$index - self::STATIC_TABLE_SIZE];
}

View File

@ -22,17 +22,33 @@ class Http2Middleware
public function __invoke(ServerRequestInterface $request, ?callable $next=null)
{
// expect upgrade h2 for secure connections, h2c for plaintext
// TODO handle HTTP/2 upgrade from HTTP/1.1
// TODO handle HTTP/2 with prior knowledge
}
/**
* Parse the settings frame present in the HTTP/1.1 upgrade request.
*
* @param string $settings
* @return SettingsFrame
*/
private function parseSettingsFromBase64String(string $settings): SettingsFrame
{
$decoded = base64_decode($settings);
$frame = new SettingsFrame();
$frame->parseFrame($decoded);
$frame->fromBinary($decoded);
return $frame;
}
/**
* Prepare a connection for the HTTP/2 session.
*
* @param ServerRequestInterface $request
* @return Http2Connection
*/
private function setupConnection(ServerRequestInterface $request): Http2Connection
{
$stream = new ThroughStream();