This commit is contained in:
2021-08-27 17:46:40 +08:00
parent 79c8f1f799
commit 151ac4ac0e
3 changed files with 87 additions and 32 deletions
+44
View File
@@ -0,0 +1,44 @@
<?php
namespace Server\Message;
class Headers
{
private array $headers = [];
/**
* @param array $headers
* @return $this
*/
public function withHeader(array $headers): static
{
$class = clone $this;
$class->headers = $headers;
return $class;
}
/**
* @param $name
* @param null $default
* @return string|array|float|int|null
*/
public function get($name, $default = null): string|array|float|int|null
{
return $this->headers[$name] ?? $default;
}
/**
* @return array
*/
public function toArray(): array
{
return $this->headers;
}
}
+36
View File
@@ -4,7 +4,9 @@ namespace Server\Message;
use JetBrains\PhpStorm\Pure;
use Kiri\Core\Xml;
use Kiri\Kiri;
use Psr\Http\Message\StreamInterface;
use ReflectionException;
/**
@@ -76,6 +78,40 @@ trait Message
}
/**
* @param \Swoole\Http\Request $request
* @return $this
* @throws ReflectionException
*/
private function parseRequestHeaders(\Swoole\Http\Request $request): static
{
$index = strpos($request->getData(), "\r\n\r\n");
$headers = explode("\r\n", substr($request->getData(), 0, $index));
array_shift($headers);
foreach ($headers as $header) {
[$key, $value] = explode(': ', $header);
$this->addRequestHeader($key, $value);
}
$class = Kiri::getDi()->get(Headers::class);
$this->header = $class->withHeader($this->headers);
return $this;
}
/**
* @param $key
* @param $value
*/
private function addRequestHeader($key, $value)
{
$this->headers[$key] = [];
foreach (explode(';', $value) as $item) {
$this->headers[$key][] = $item;
}
}
/**
* @param $name
* @return string|null
+7 -32
View File
@@ -2,10 +2,12 @@
namespace Server\Message;
use Annotation\Inject;
use BadMethodCallException;
use JetBrains\PhpStorm\Pure;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\UriInterface;
use ReflectionException;
/**
@@ -23,6 +25,9 @@ class Request implements RequestInterface
public string $method;
public Headers $header;
/**
* @var Uri
*/
@@ -49,6 +54,7 @@ class Request implements RequestInterface
/**
* @param \Swoole\Http\Request $request
* @return RequestInterface
* @throws ReflectionException
*/
public static function parseRequest(\Swoole\Http\Request $request): RequestInterface
{
@@ -60,38 +66,7 @@ class Request implements RequestInterface
$message->version = $request->server['server_protocol'];
$message->stream = new Stream($request->getContent());
$message->servers = $request->server;
return $message->parseHeaders($request);
}
/**
* @param \Swoole\Http\Request $request
* @return $this
*/
private function parseHeaders(\Swoole\Http\Request $request): static
{
$index = strpos($request->getData(), "\r\n\r\n");
$headers = explode("\r\n", substr($request->getData(), 0, $index));
array_shift($headers);
foreach ($headers as $header) {
[$key, $value] = explode(': ', $header);
$this->addHeader($key, $value);
}
return $this;
}
/**
* @param $key
* @param $value
*/
private function addHeader($key, $value)
{
$this->headers[$key] = [];
foreach (explode(';', $value) as $item) {
$this->headers[$key][] = $item;
}
return $message->parseRequestHeaders($request);
}