This commit is contained in:
2021-12-24 14:13:34 +08:00
parent 4856e76e6f
commit f5ae86c3d2
+119 -112
View File
@@ -23,136 +23,143 @@ class AsyncClient extends ClientAbstracts
{ {
use TSwooleClient; use TSwooleClient;
/** /**
* @param string $method * @param string $method
* @param $path * @param $path
* @param array $params * @param array $params
* @return void * @return void
* @throws Exception * @throws Exception
*/ */
public function request(string $method, $path, array $params = []): void public function request(string $method, $path, array $params = []): void
{ {
$this->withMethod($method) $this->withMethod($method)
->coroutine( ->coroutine(
$this->matchHost($path), $this->matchHost($path),
$this->paramEncode($params) $this->paramEncode($params)
); );
} }
/** /**
* @param $path * @param $path
* @return $this * @return $this
*/ */
public function withCAInfo($path): static public function withCAInfo($path): static
{ {
return $this; return $this;
} }
/** /**
* @param $url * @param $url
* @param array|string $data * @param array|string $data
* @throws Exception 使用swoole协程方式请求 * @throws Exception 使用swoole协程方式请求
*/ */
private function coroutine($url, array|string $data = []): void private function coroutine($url, array|string $data = []): void
{ {
try { try {
$this->generate_client($data, ...$url); $this->generate_client($data, ...$url);
} catch (\Throwable $exception) { } catch (\Throwable $exception) {
Kiri::getDi()->get(Logger::class)->error('rpc', [$exception]); Kiri::getDi()->get(Logger::class)->error('rpc', [$exception]);
$this->setStatusCode(-1); $this->setStatusCode(-1);
$this->setBody(jTraceEx($exception)); $this->setBody(jTraceEx($exception));
} }
} }
/** /**
* @param $data * @param $data
* @param $host * @param $host
* @param $isHttps * @param $isHttps
* @param $path * @param $path
* @throws Exception * @throws Exception
*/ */
private function generate_client($data, $host, $isHttps, $path): void private function generate_client($data, $host, $isHttps, $path): void
{ {
$this->client = new SwowClient(SWOOLE_TCP, FALSE); $this->client = new SwowClient(SWOOLE_TCP, FALSE);
if (!$this->client->connect($host, $this->getPort())) { if (!$this->client->connect($host, $this->getPort())) {
throw new Exception('链接失败'); throw new Exception('链接失败');
} }
if ($isHttps || $this->isSSL()) { if ($isHttps || $this->isSSL()) {
$this->client->enableSSL(); $this->client->enableSSL();
} }
$this->client->set($this->settings()); $this->client->set($this->settings());
if (!empty($this->getAgent())) { if (!empty($this->getAgent())) {
$this->withAddedHeader('User-Agent', $this->getAgent()); $this->withAddedHeader('User-Agent', $this->getAgent());
} }
$path = $this->setParams($path, $data); $path = $this->setParams($path, $data);
$this->withAddedHeader('Accept', ' text/html,application/xhtml+xml,application/json,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9'); $this->withAddedHeader('Accept', ' text/html,application/xhtml+xml,application/json,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9');
// $this->withAddedHeader('Accept-Encoding', 'gzip'); // $this->withAddedHeader('Accept-Encoding', 'gzip');
$this->withAddedHeader('Content-Length', $this->getData()->getSize()); $this->withAddedHeader('Content-Length', $this->getData()->getSize());
$this->execute($path, $this->getData()->getContents()); $this->execute($path, $this->getData()->getContents());
} }
/** /**
* @param string $path * @param string $path
* @param string $content * @param string $content
* @return void * @return void
*/ */
private function execute(string $path, string $content) private function execute(string $path, string $content)
{ {
$array = []; $array = [];
$array[] = strtoupper($this->getMethod()) . ' ' . $path . ' HTTP/1.1'; $array[] = strtoupper($this->getMethod()) . ' ' . $path . ' HTTP/1.1';
if (!empty($this->getHeader())) { if (!empty($this->getHeader())) {
foreach ($this->getHeader() as $key => $value) { foreach ($this->getHeader() as $key => $value) {
$array[] = sprintf('%s: %s', $key, $value); $array[] = sprintf('%s: %s', $key, $value);
} }
} }
$this->client->send(implode("\r\n", $array) . "\r\n\r\n" . $content); $this->client->send(implode("\r\n", $array) . "\r\n\r\n" . $content);
$revice = $this->client->recv(); $revice = $this->client->recv();
var_dump($revice); [$header, $body] = explode("\r\n\r\n", $revice);
[$header, $body] = explode("\r\n\r\n", $revice); $header = explode("\r\n", $header);
$status = array_shift($header);
$header = explode("\r\n", $header); $this->setStatusCode(intval(explode(' ', $status)[1]));
$status = array_shift($header); $this->setResponseHeader($header);
$this->setBody($body); if ($this->getResponseHeader('Transfer-Encoding') == 'chunked') {
$this->setStatusCode(intval(explode(' ', $status)[1])); $explode = explode("\r\n\r\n", str_replace("0\r\n\r\n", '', $body));
$this->setResponseHeader($header); $string = [];
} foreach ($explode as $value) {
$string[] = explode("\r\n", $value)[1];
}
$body = implode($string);
}
$this->setBody($body);
}
/** /**
* @param $path * @param $path
* @param $data * @param $data
* @return string * @return string
*/ */
private function setParams($path, $data): string private function setParams($path, $data): string
{ {
if ($this->isGet()) { if ($this->isGet()) {
if (!empty($data)) $path .= '?' . $data; if (!empty($data)) $path .= '?' . $data;
} else { } else {
$data = $this->mergeParams($data); $data = $this->mergeParams($data);
if (!empty($data)) { if (!empty($data)) {
$this->withBody(new Stream($data)); $this->withBody(new Stream($data));
} }
} }
return $path; return $path;
} }
/** /**
* *
*/ */
public function close(): void public function close(): void
{ {
$this->client->close(); $this->client->close();
} }
} }