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 // Tradtional request handler
$http = function (Psr\Http\Message\ServerRequestInterface $request, ?callable $next=null) { $http = function (Psr\Http\Message\ServerRequestInterface $request, ?callable $next=null) {
$promise = new React\Promise\Promise(); $promise = new React\Promise\Promise(function ($resolve) use ($request) {
React\Loop\Loop::laterTick(function () use ($request, $promise) {
// ... // ...
$promise->resolve($response); $resolve($response);
}); });
return $promise; return $promise;
}; };

View File

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

View File

@ -43,9 +43,12 @@ class SettingsFrame extends Frame
return $packed; 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()); 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 public function packHeaders(HeaderBag $headers): string
{ {
$packed = ''; $packed = '';
@ -102,12 +108,19 @@ class HeaderPacker
$packed .= $value; $packed .= $value;
} else { } else {
// Literal // Literal
// TODO pack literal
} }
} }
return $packed; return $packed;
} }
/**
* Unpack a binary string to a HeaderBag.
*
* @param string $raw
* @return HeaderBag
*/
public function unpackHeaders(string $raw): HeaderBag public function unpackHeaders(string $raw): HeaderBag
{ {
$headers = new HeaderBag(); $headers = new HeaderBag();
@ -167,7 +180,9 @@ class HeaderPacker
{ {
if ($index < self::STATIC_TABLE_SIZE) if ($index < self::STATIC_TABLE_SIZE)
return self::$staticTable[$index]; 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]; return $this->dynamicTable[$index - self::STATIC_TABLE_SIZE];
} }

View File

@ -22,17 +22,33 @@ class Http2Middleware
public function __invoke(ServerRequestInterface $request, ?callable $next=null) 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 private function parseSettingsFromBase64String(string $settings): SettingsFrame
{ {
$decoded = base64_decode($settings); $decoded = base64_decode($settings);
$frame = new SettingsFrame(); $frame = new SettingsFrame();
$frame->parseFrame($decoded); $frame->fromBinary($decoded);
return $frame; return $frame;
} }
/**
* Prepare a connection for the HTTP/2 session.
*
* @param ServerRequestInterface $request
* @return Http2Connection
*/
private function setupConnection(ServerRequestInterface $request): Http2Connection private function setupConnection(ServerRequestInterface $request): Http2Connection
{ {
$stream = new ThroughStream(); $stream = new ThroughStream();