This commit is contained in:
2021-08-13 14:13:56 +08:00
parent 1f45c2c218
commit 1e8dbecbf5
9 changed files with 48 additions and 374 deletions
@@ -7,7 +7,7 @@
*/
declare(strict_types=1);
namespace HttpServer\Client\Help;
namespace HttpServer\Client;
use Exception;
use JetBrains\PhpStorm\Pure;
@@ -1,7 +1,7 @@
<?php
namespace HttpServer\Client\Help;
namespace HttpServer\Client;
use Closure;
@@ -1,9 +1,10 @@
<?php
declare(strict_types=1);
namespace HttpServer\Client\Help;
namespace HttpServer\Client;
use CurlHandle;
use Exception;
use JetBrains\PhpStorm\Pure;
@@ -35,10 +36,10 @@ class Curl extends ClientAbstracts
* @param $path
* @param $method
* @param $params
* @return mixed
* @return CurlHandle
* @throws Exception
*/
private function getCurlHandler($path, $method, $params): mixed
private function getCurlHandler($path, $method, $params): CurlHandle
{
[$host, $isHttps, $path] = $this->matchHost($path);
@@ -68,10 +69,10 @@ class Curl extends ClientAbstracts
/**
* @param $resource
* @return bool
* @return void
* @throws Exception
*/
private function curlHandlerSslSet($resource): mixed
private function curlHandlerSslSet($resource): void
{
if (!empty($this->ssl_key)) {
if (!file_exists($this->ssl_key)) {
@@ -85,7 +86,6 @@ class Curl extends ClientAbstracts
}
curl_setopt($resource, CURLOPT_SSLCERT, $this->getSslCertFile());
}
return $resource;
}
@@ -93,10 +93,10 @@ class Curl extends ClientAbstracts
* @param $resource
* @param $path
* @param $method
* @return resource
* @return CurlHandle
* @throws Exception
*/
private function do($resource, $path, $method)
private function do($resource, $path, $method): CurlHandle
{
curl_setopt($resource, CURLOPT_URL, $path);
curl_setopt($resource, CURLOPT_TIMEOUT, $this->getTimeout()); // 超时设置
@@ -152,7 +152,7 @@ class Curl extends ClientAbstracts
* @return mixed
* @throws Exception
*/
private function parseResponse($curl, $output, $params = []): mixed
private function parseResponse($curl, $output, array $params = []): mixed
{
curl_close($curl);
if ($output === FALSE) {
@@ -199,7 +199,7 @@ class Curl extends ClientAbstracts
private function headerFormat($headers): array
{
$_tmp = [];
foreach ($headers as $key => $val) {
foreach ($headers as $val) {
$trim = explode(': ', trim($val));
$_tmp[strtolower($trim[0])] = $trim[1] ?? '';
-327
View File
@@ -1,327 +0,0 @@
<?php
declare(strict_types=1);
namespace HttpServer\Client;
use Exception;
use HttpServer\Http\Context;
use Server\Events\OnAfterRequest;
use Kiri\Abstracts\Component;
use Kiri\Channel;
use Kiri\Core\Json;
use Kiri\Core\Xml;
use Kiri\Event;
use Kiri\Events\EventProvider;
use Kiri\Kiri;
use Swoole\Coroutine\Http2\Client as H2Client;
use Swoole\Http2\Request;
use Swoole\Http2\Response;
/**
* Class Http2
* @package HttpServer\Client
*/
class Http2 extends Component
{
private array $_clients = [];
/**
* @throws Exception
*/
public function init()
{
Event::on(Event::SYSTEM_RESOURCE_RELEASES, [$this, 'releases']);
Event::on(Event::SYSTEM_RESOURCE_CLEAN, [$this, 'clean']);
}
/**
* @throws Exception
*/
public function releases()
{
$this->_clients = [];
}
/**
* 清空
*/
public function clean()
{
foreach ($this->_clients as $client) {
/** @var H2Client $client */
$client->close();
}
$this->_clients = [];
}
/**
* @param bool $isRev
* @return Http2
*/
public function setIsRev(bool $isRev): static
{
Context::setContext('http2isRev', $isRev);
return $this;
}
/**
* @param int $timeout
* @return Http2
*/
public function setTimeout(int $timeout): static
{
Context::setContext('http2timeout', $timeout);
return $this;
}
/**
* @param array $headers
* @return Http2
*/
public function setHeader(array $headers): static
{
Context::setContext('http2Headers', $headers);
return $this;
}
/**
* @param $domain
* @param $path
* @param array $params
* @param int $timeout
* @return Result
* @throws Exception
*/
public function get($domain, $path, array $params = [], int $timeout = -1): Result
{
$request = $this->dispatch($domain, $path, 'GET', $params, $timeout);
return new Result(['code' => 0, 'data' => $request]);
}
/**
* @param $domain
* @param $path
* @param array $params
* @param int $timeout
* @return Result
* @throws Exception
*/
public function post($domain, $path, array $params = [], int $timeout = -1): Result
{
$request = $this->dispatch($domain, $path, 'POST', $params, $timeout);
return new Result(['code' => 0, 'data' => $request]);
}
/**
* @param $domain
* @param $path
* @param array $params
* @param int $timeout
* @return Result
* @throws Exception
*/
public function upload($domain, $path, array $params = [], int $timeout = -1): Result
{
$request = $this->dispatch($domain, $path, 'POST', $params, $timeout, true);
return new Result(['code' => 0, 'data' => $request]);
}
/**
* @param $domain
* @param $path
* @param array $params
* @param int $timeout
* @return Result
* @throws Exception
*/
public function delete($domain, $path, array $params = [], int $timeout = -1): Result
{
$request = $this->dispatch($domain, $path, 'DELETE', $params, $timeout);
return new Result(['code' => 0, 'data' => $request]);
}
/**
* @param $domain
* @param $path
* @param $method
* @param array $params
* @param int $timeout
* @param bool $isUpload
* @return mixed
* @throws Exception
*/
private function dispatch($domain, $path, $method, array $params = [], int $timeout = -1, bool $isUpload = false): mixed
{
[$domain, $isSsl] = $this->clear($domain);
$request = $this->getRequest($path, $method, $params, $isUpload);
$request->headers = array_merge($request->headers, [
'Host' => $domain
]);
return $this->doRequest($request, $domain, $isSsl, $timeout);
}
/**
* @param $domain
* @return array
*/
private function clear($domain): array
{
if (str_starts_with($domain, 'https://')) {
return [str_replace('https://', '', $domain), true];
} else {
return [str_replace('http://', '', $domain), false];
}
}
/**
* @param Request $request
* @param $domain
* @param $ssl
* @param $timeout
* @return mixed
* @throws Exception
*/
private function doRequest(Request $request, $domain, $ssl, $timeout): mixed
{
$client = $this->getClient($domain, $ssl, $timeout);
$client->send($request);
if (Context::getContext('http2isRev') === false) {
return null;
}
return $this->rev($client);
}
/**
* @param $client
* @return mixed
* @throws Exception
*/
private function rev($client): mixed
{
/** @var Response $response */
if (!Context::hasContext('http2timeout')) {
$response = $client->recv();
} else {
$response = $client->recv((int)Context::getContext('http2timeout'));
}
if ($response === false || $response->statusCode > 200) {
throw new Exception($client->errMsg, $client->errCode);
}
$header = $response->headers['content-type'];
if (str_starts_with($header, 'application/json;')) {
return Json::decode($response->data);
} else if (str_starts_with($header, 'application/xml;')) {
return Xml::toArray($response->data);
} else {
return $response->data;
}
}
/**
* @param $domain
* @param $path
* @param array $params
* @param int $timeout
* @return mixed
* @throws Exception
*/
public function put($domain, $path, array $params = [], int $timeout = -1): Result
{
$request = $this->dispatch($domain, $path, 'PUT', $params, $timeout);
return new Result(['code' => 0, 'data' => $request]);
}
/**
* @param $path
* @param $method
* @param $params
* @param bool $isUpload
* @return Request
* @throws Exception
*/
public function getRequest($path, $method, $params, bool $isUpload = false): Request
{
if (!str_starts_with($path, '/')) {
$path = '/' . $path;
}
$request = new Request();
$request->method = $method;
$request->path = $path;
if ($method === 'GET') {
$request->path .= '?' . http_build_query($params);
} else {
$request->data = !is_string($params) && !$isUpload ? Json::encode($params) : $params;
}
$request->headers = Context::getContext('http2Headers');
return $request;
}
/**
* @param $domain
* @param bool $isSsl
* @param int $timeout
* @return H2Client
* @throws Exception
*/
private function getClient($domain, bool $isSsl = false, int $timeout = -1): H2Client
{
if (isset($this->_clients[$domain])) {
return $this->_clients[$domain];
}
$client = $this->newRequest($domain, $isSsl, $timeout);
if ((!$client->connected || !$client->ping()) && !$client->connect()) {
throw new Exception($client->errMsg, $client->errCode);
}
return $this->_clients[$domain] = $client;
}
/**
* @param $domain
* @param $isSsl
* @param $timeout
* @return H2Client
*/
public function newRequest($domain, $isSsl, $timeout): H2Client
{
$domain = rtrim($domain, '/');
if (str_contains($domain, ':')) {
[$domain, $port] = explode(':', $domain);
} else {
$port = $isSsl === true ? 443 : 80;
}
$client = new H2Client($domain, (int)$port, $isSsl);
$client->set(['timeout' => $timeout, 'ssl_host_name' => $domain]);
return $client;
}
}
+21 -10
View File
@@ -4,13 +4,12 @@
namespace HttpServer\Client;
use Exception;
use HttpServer\Client\Client;
use HttpServer\Client\Curl;
use HttpServer\Client\IClient;
use JetBrains\PhpStorm\Pure;
use Kiri\Abstracts\Component;
use Kiri\Kiri;
use Swoole\Coroutine;
use HttpServer\Client\Help\IClient;
use HttpServer\Client\Help\Client;
use HttpServer\Client\Help\Curl;
/**
* Class ClientDriver
@@ -24,17 +23,29 @@ class HttpClient extends Component
*/
public static function NewRequest(): IClient
{
return Coroutine::getCid() > -1 ? Client::NewRequest() : Curl::NewRequest();
if (Coroutine::getCid() > -1) {
return Client::NewRequest();
}
return Curl::NewRequest();
}
/**
* @return Http2
* @throws Exception
* @return Curl
*/
public static function http2(): Http2
#[Pure] public function getCurl(): Curl
{
return Kiri::app()->get('http2');
return Curl::NewRequest();
}
/**
* @return Client
*/
#[Pure] public function getCoroutine(): Client
{
return Client::NewRequest();
}
}
@@ -1,7 +1,7 @@
<?php
namespace HttpServer\Client\Help;
namespace HttpServer\Client;
use Closure;
@@ -1,9 +1,10 @@
<?php
declare(strict_types=1);
namespace HttpServer\Client\Help;
namespace HttpServer\Client;
use Exception;
use JetBrains\PhpStorm\Pure;
/**
@@ -18,12 +19,11 @@ use Exception;
*/
class Result
{
public $code;
public $message;
public int|string $code;
public string $message;
public int $count = 0;
/** @var mixed $data */
public $data;
public mixed $data;
public ?array $header;
public int $httpStatus = 200;
@@ -133,7 +133,7 @@ class Result
* @param int $status
* @return bool
*/
public function isResultsOK($status = 0): bool
#[Pure] public function isResultsOK(int $status = 0): bool
{
if (!$this->httpIsOk()) {
return false;
@@ -158,17 +158,17 @@ class Result
}
/**
* @return mixed
* @return string
*/
public function getMessage(): mixed
public function getMessage(): string
{
return $this->message;
}
/**
* @return mixed
* @return string|int
*/
public function getCode(): mixed
public function getCode(): string|int
{
return $this->code;
}
-5
View File
@@ -13,12 +13,10 @@ namespace Kiri\Abstracts;
use Annotation\Annotation as SAnnotation;
use Database\Connection;
use Exception;
use HttpServer\Client\Http2;
use HttpServer\Http\HttpHeaders;
use HttpServer\Http\HttpParams;
use HttpServer\Http\Request;
use HttpServer\Http\Response;
use HttpServer\HttpFilter;
use HttpServer\Route\Router;
use HttpServer\Server;
use HttpServer\Shutdown;
@@ -477,9 +475,6 @@ abstract class BaseApplication extends Component
'kafka-container' => ['class' => KafkaProvider::class],
'response' => ['class' => Response::class],
'request' => ['class' => Request::class],
'rpc' => ['class' => Producer::class],
'rpc-service' => ['class' => Service::class],
'http2' => ['class' => Http2::class],
'shutdown' => ['class' => Shutdown::class],
]);
}
+4 -9
View File
@@ -6,23 +6,20 @@ namespace Kiri\Abstracts;
use Annotation\Annotation as SAnnotation;
use Database\DatabasesProviders;
use HttpServer\Client\Help\Client;
use HttpServer\Client\Help\Curl;
use HttpServer\Client\Http2;
use HttpServer\Client\Client;
use HttpServer\Client\Curl;
use HttpServer\Http\Request;
use HttpServer\Http\Response;
use HttpServer\HttpFilter;
use HttpServer\Route\Router;
use HttpServer\Server;
use HttpServer\Shutdown;
use Rpc\Producer as RPCProducer;
use Kiri\Crontab\Producer;
use Kiri\Async;
use Kiri\Cache\Redis;
use Kiri\Error\Logger;
use Kiri\Event;
use Kiri\Jwt\Jwt;
use Kiri\Pool\Connection;
use Kiri\Pool\Pool;
/**
* Trait TraitApplication
@@ -38,14 +35,12 @@ use Kiri\Pool\Pool;
* @property Logger $logger
* @property Jwt $jwt
* @property SAnnotation $annotation
* @property Http2 $http2
* @property BaseGoto $goto
* @property Client $client
* @property \Database\Connection $databases
* @property Curl $curl
* @property \Kiri\Crontab\Producer $crontab
* @property Producer $crontab
* @property HttpFilter $filter
* @property RPCProducer $rpc
* @property Shutdown $shutdown
*/
trait TraitApplication