This commit is contained in:
2021-08-31 13:51:21 +08:00
parent a0bf0d3e66
commit 9d394fa0ff
5 changed files with 166 additions and 490 deletions
+26 -39
View File
@@ -3,9 +3,6 @@
namespace Server\Constrict;
use Annotation\Inject;
use Exception;
use Kiri\Exception\NotFindClassException;
use ReflectionException;
use Psr\Http\Message\ResponseInterface;
use Server\RequestInterface;
use Swoole\Server;
@@ -18,43 +15,33 @@ class ResponseEmitter implements Emitter
{
/**
* @var \Server\Constrict\DownloadEmitter
*/
#[Inject(DownloadEmitter::class)]
public DownloadEmitter $downloadEmitter;
/**
* @var RequestInterface
*/
#[Inject(RequestInterface::class)]
public RequestInterface $request;
/**
* @var \Server\RequestInterface
*/
#[Inject(RequestInterface::class)]
public RequestInterface $request;
/**
* @param \Swoole\Http\Response|\Swoole\Http2\Response $response
* @param ResponseInterface|\Server\Message\Response $emitter
* @throws NotFindClassException
* @throws ReflectionException
* @throws Exception
*/
public function sender(mixed $response, ResponseInterface $emitter): void
{
if (!empty($emitter->getHeaders()) && is_array($emitter->getHeaders())) {
foreach ($emitter->getHeaders() as $name => $values) {
$response->header($name, implode(';', $values));
}
}
if (!empty($emitter->getCookies()) && is_array($emitter->getCookies())) {
foreach ($emitter->getCookies() as $name => $cookie) {
$response->cookie($name, ...$cookie);
}
}
$response->setStatusCode($emitter->getStatusCode());
$response->header('Server', 'swoole');
$response->header('Swoole-Version', swoole_version());
$response->end($emitter->getBody());
}
/**
* @param mixed $response
* @param \Server\Message\Response|ResponseInterface $emitter
*/
public function sender(mixed $response, ResponseInterface|\Server\Message\Response $emitter): void
{
if (!empty($emitter->getHeaders()) && is_array($emitter->getHeaders())) {
foreach ($emitter->getHeaders() as $name => $values) {
$response->header($name, implode(';', $values));
}
}
if (!empty($emitter->getCookies()) && is_array($emitter->getCookies())) {
foreach ($emitter->getCookies() as $name => $cookie) {
$response->cookie($name, ...$cookie);
}
}
$response->setStatusCode($emitter->getStatusCode());
$response->header('Server', 'swoole');
$response->header('Swoole-Version', swoole_version());
$response->end($emitter->getBody());
}
}
+134 -75
View File
@@ -4,6 +4,8 @@ namespace Server\Message;
use Exception;
use JetBrains\PhpStorm\Pure;
use Kiri\Core\Help;
use Kiri\ToArray;
use Psr\Http\Message\ResponseInterface;
@@ -12,26 +14,26 @@ use Psr\Http\Message\ResponseInterface;
*/
class Response implements ResponseInterface, \Server\ResponseInterface
{
use Message;
use Message;
public int $statusCode = 200;
public int $statusCode = 200;
public string $reasonPhrase = '';
public string $reasonPhrase = '';
const CONTENT_TYPE_JSON = 'application/json;charset=utf-8';
const CONTENT_TYPE_HTML = 'text/html;charset=utf-8';
const CONTENT_TYPE_STREAM = 'octet-stream';
const CONTENT_TYPE_XML = 'application/xml;charset=utf-8';
const CONTENT_TYPE_JSON = 'application/json;charset=utf-8';
const CONTENT_TYPE_HTML = 'text/html;charset=utf-8';
const CONTENT_TYPE_STREAM = 'octet-stream';
const CONTENT_TYPE_XML = 'application/xml;charset=utf-8';
/**
*
*/
#[Pure] public function __construct()
{
$this->stream = new Stream('');
}
/**
*
*/
#[Pure] public function __construct()
{
$this->stream = new Stream('');
}
/**
@@ -39,77 +41,134 @@ class Response implements ResponseInterface, \Server\ResponseInterface
* @return $this
* @throws Exception
*/
public function withContentType(string $type): static
{
if (!in_array($type, [
Response::CONTENT_TYPE_HTML, Response::CONTENT_TYPE_JSON,
Response::CONTENT_TYPE_STREAM, Response::CONTENT_TYPE_XML
])) {
throw new Exception('Wrong content type.');
}
return $this->withHeader('Content-Type', $type);
}
public function withContentType(string $type): static
{
if (!in_array($type, [
Response::CONTENT_TYPE_HTML, Response::CONTENT_TYPE_JSON,
Response::CONTENT_TYPE_STREAM, Response::CONTENT_TYPE_XML
])) {
throw new Exception('Wrong content type.');
}
return $this->withHeader('Content-Type', $type);
}
/**
* @return int
*/
public function getStatusCode(): int
{
// TODO: Implement getStatusCode() method.
return $this->statusCode;
}
/**
* @return int
*/
public function getStatusCode(): int
{
// TODO: Implement getStatusCode() method.
return $this->statusCode;
}
/**
* @param int $code
* @param string $reasonPhrase
* @return static
*/
public function withStatus($code, $reasonPhrase = ''): static
{
$this->statusCode = $code;
$this->reasonPhrase = $reasonPhrase;
return $this;
}
/**
* @param int $code
* @param string $reasonPhrase
* @return static
*/
public function withStatus($code, $reasonPhrase = ''): static
{
$this->statusCode = $code;
$this->reasonPhrase = $reasonPhrase;
return $this;
}
/**
* @return string
*/
public function getReasonPhrase(): string
{
// TODO: Implement getReasonPhrase() method.
return $this->reasonPhrase;
}
/**
* @return string
*/
public function getReasonPhrase(): string
{
// TODO: Implement getReasonPhrase() method.
return $this->reasonPhrase;
}
/**
* @param $value
* @return ResponseInterface
*/
public function withAccessControlAllowHeaders($value): ResponseInterface
{
return $this->withHeader('Access-Control-Allow-Headers', $value);
}
/**
* @param $value
* @return ResponseInterface
*/
public function withAccessControlAllowHeaders($value): ResponseInterface
{
return $this->withHeader('Access-Control-Allow-Headers', $value);
}
/**
* @param $value
* @return ResponseInterface
*/
public function withAccessControlRequestMethod($value): ResponseInterface
{
return $this->withHeader('Access-Control-Request-Method', $value);
}
/**
* @param $value
* @return ResponseInterface
*/
public function withAccessControlRequestMethod($value): ResponseInterface
{
return $this->withHeader('Access-Control-Request-Method', $value);
}
/**
* @param $value
* @return ResponseInterface
*/
public function withAccessControlAllowOrigin($value): ResponseInterface
{
return $this->withHeader('Access-Control-Allow-Origin', $value);
}
/**
* @param $value
* @return ResponseInterface
*/
public function withAccessControlAllowOrigin($value): ResponseInterface
{
return $this->withHeader('Access-Control-Allow-Origin', $value);
}
/**
* @param $data
* @return ResponseInterface
* @throws Exception
*/
public function json($data): ResponseInterface
{
return $this->withBody(static::parser($data, self::CONTENT_TYPE_JSON))
->withContentType(self::CONTENT_TYPE_JSON);
}
/**
* @param $data
* @return ResponseInterface
* @throws Exception
*/
public function html($data): ResponseInterface
{
return $this->withBody(static::parser($data, self::CONTENT_TYPE_HTML))
->withContentType(self::CONTENT_TYPE_HTML);
}
/**
* @param $data
* @return ResponseInterface
* @throws Exception
*/
public function xml($data): ResponseInterface
{
return $this->withBody(static::parser($data, self::CONTENT_TYPE_XML))
->withContentType(self::CONTENT_TYPE_XML);
}
/**
* @param $responseData
* @param string $contentType
* @return Stream
* @throws Exception
*/
public static function parser($responseData, $contentType = self::CONTENT_TYPE_JSON): Stream
{
if (is_object($responseData)) {
$responseData = $responseData instanceof ToArray ? $responseData->toArray() : get_object_vars($responseData);
}
if ($contentType == self::CONTENT_TYPE_JSON) {
return new Stream(json_encode($responseData));
}
if ($contentType == self::CONTENT_TYPE_XML) {
return new Stream(Help::toXml($responseData));
}
return new Stream((string)($responseData));
}
}
+1 -1
View File
@@ -143,7 +143,7 @@ class Stream implements StreamInterface
* @param string $string
* @return int
*/
public function append($string): int
public function append(string $string): int
{
$this->body .= $string;
$this->size = strlen($this->body);
+5 -4
View File
@@ -58,10 +58,11 @@ class Http extends \Server\Abstracts\Http implements OnClose, OnConnect
}
/**
* @param $responseData
* @return \Server\ResponseInterface
*/
/**
* @param $responseData
* @return ResponseInterface
* @throws Exception
*/
private function transferToResponse($responseData): ResponseInterface
{
$interface = $this->response->withStatus(200);