make frame fromBinary public, improve docs
This commit is contained in:
parent
b706afaf67
commit
5c2279a544
@ -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;
|
||||
};
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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']);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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];
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
|
Loading…
Reference in New Issue
Block a user