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
|
// 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;
|
||||||
};
|
};
|
||||||
|
@ -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
|
||||||
{
|
{
|
||||||
|
@ -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']);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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();
|
||||||
|
Loading…
Reference in New Issue
Block a user