Compare commits

...

12 Commits

Author SHA1 Message Date
as2252258 b96bd159d3 eee 2026-07-03 15:59:49 +08:00
as2252258 c31211a6fa eee 2026-07-03 15:53:55 +08:00
as2252258 45d8931267 eee 2026-07-03 15:06:12 +08:00
as2252258 7bcb789ed2 eee 2026-06-12 23:57:21 +08:00
as2252258 1d9d761798 eee 2025-12-31 00:19:30 +08:00
as2252258 22f425ceb7 ea 2025-11-28 11:43:24 +08:00
as2252258 a52610cf2a ea 2025-11-28 11:39:14 +08:00
as2252258 5697102a85 ea 2025-11-28 11:38:29 +08:00
as2252258 0c0a2fadd5 ea 2025-11-28 11:37:09 +08:00
as2252258 5061a17342 ea 2025-11-28 11:30:07 +08:00
as2252258 9c1bc63f78 ea 2025-11-26 07:52:46 +08:00
as2252258 345af9e727 eee 2025-07-14 15:35:37 +08:00
6 changed files with 786 additions and 950 deletions
+19 -187
View File
@@ -25,35 +25,35 @@ abstract class ClientAbstracts implements IClient
const string HEAD = 'head';
const string PUT = 'put';
private string $host = '';
private array $header = [];
private int $timeout = 0;
private string $method = 'get';
private bool $isSSL = FALSE;
private string $agent = '';
private string $ssl_cert_file = '';
private string $ssl_key_file = '';
private string $ca = '';
public string $host = '';
protected array $header = [];
protected int $timeout = 0;
protected string $method = 'get';
protected bool $isSSL = FALSE;
protected string $agent = '';
public string $ssl_cert_file = '';
public string $ssl_key_file = '';
public string $ca = '';
private int $port = 80;
protected int $num = 0;
private ?array $_responseHeader = [];
private int $statusCode = 200;
public int $statusCode = 200;
protected int $retryNum = 0;
protected int $retryTimeout = 0;
private bool $verifyPeer = TRUE;
private string $proxyHost = '';
private int $proxyPort = 0;
public string $proxyHost = '';
public int $proxyPort = 0;
/**
* @var string|null
*/
protected ?string $body;
public ?string $body;
private string|array|null $_data = NULL;
protected string|array|null $_data = NULL;
private int $connect_timeout = 1;
public int $connect_timeout = 1;
/**
@@ -73,24 +73,6 @@ abstract class ClientAbstracts implements IClient
}
/**
* @return string
*/
public function getProxyHost(): string
{
return $this->proxyHost;
}
/**
* @return string
*/
public function getProxyPort(): string
{
return $this->proxyPort;
}
/**
* @param string $proxy
* @return ClientAbstracts
@@ -124,24 +106,6 @@ abstract class ClientAbstracts implements IClient
}
/**
* @return int
*/
public function getRetryNum(): int
{
return $this->retryNum;
}
/**
* @return int
*/
public function getRetryTimeout(): int
{
return $this->retryTimeout;
}
/**
* @param bool $bool
* @return $this
@@ -153,24 +117,6 @@ abstract class ClientAbstracts implements IClient
}
/**
* @return bool
*/
public function getVerifyPeer(): bool
{
return $this->verifyPeer;
}
/**
* @return int
*/
public function getStatusCode(): int
{
return $this->statusCode;
}
/**
* @return array
*/
@@ -199,33 +145,6 @@ abstract class ClientAbstracts implements IClient
}
/**
* @param int $statusCode
*/
public function setStatusCode(int $statusCode): void
{
$this->statusCode = $statusCode;
}
/**
* @return string|null
*/
public function getBody(): string|null
{
return $this->body;
}
/**
* @param ?string $body
*/
public function setBody(?string $body): void
{
$this->body = $body;
}
/**
* @param string $host
* @param int $port
@@ -328,14 +247,6 @@ abstract class ClientAbstracts implements IClient
}
/**
* @return string
*/
public function getHost(): string
{
return $this->host;
}
/**
* @return int
*/
@@ -345,7 +256,8 @@ abstract class ClientAbstracts implements IClient
return $this->getPort();
}
$port = 80;
if ($this->isSSL()) $port = 443;
if ($this->isSSL)
$port = 443;
return $port;
}
@@ -360,14 +272,6 @@ abstract class ClientAbstracts implements IClient
return $this;
}
/**
* @return array
*/
public function getHeader(): array
{
return $this->header;
}
/**
* @return mixed|null
@@ -415,14 +319,6 @@ abstract class ClientAbstracts implements IClient
return $this;
}
/**
* @return int
*/
public function getTimeout(): int
{
return $this->timeout;
}
/**
* @param int $value
* @return ClientAbstracts
@@ -443,14 +339,6 @@ abstract class ClientAbstracts implements IClient
return $this;
}
/**
* @return string
*/
public function getMethod(): string
{
return $this->method;
}
/**
* @param string $value
* @return static
@@ -461,14 +349,6 @@ abstract class ClientAbstracts implements IClient
return $this;
}
/**
* @return bool
*/
public function isSSL(): bool
{
return $this->isSSL;
}
/**
* @param bool $isSSL
* @return ClientAbstracts
@@ -479,14 +359,6 @@ abstract class ClientAbstracts implements IClient
return $this;
}
/**
* @return string
*/
public function getAgent(): string
{
return $this->agent;
}
/**
* @param string $agent
* @return ClientAbstracts
@@ -498,14 +370,6 @@ abstract class ClientAbstracts implements IClient
}
/**
* @return string
*/
public function getSslCertFile(): string
{
return $this->ssl_cert_file;
}
/**
* @param string $ssl_cert_file
* @return ClientAbstracts
@@ -516,14 +380,6 @@ abstract class ClientAbstracts implements IClient
return $this;
}
/**
* @return string
*/
public function getSslKeyFile(): string
{
return $this->ssl_key_file;
}
/**
* @param string $ssl_key_file
* @return ClientAbstracts
@@ -534,14 +390,6 @@ abstract class ClientAbstracts implements IClient
return $this;
}
/**
* @return string
*/
public function getCa(): string
{
return $this->ca;
}
/**
* @param string $ssl_key_file
* @return static
@@ -557,7 +405,7 @@ abstract class ClientAbstracts implements IClient
*/
public function getPort(): int
{
if ($this->isSSL()) {
if ($this->isSSL) {
return 443;
}
if (empty($this->port)) {
@@ -577,14 +425,6 @@ abstract class ClientAbstracts implements IClient
}
/**
* @return string|null
*/
public function getData(): ?string
{
return $this->_data;
}
/**
* @param string|null $data
* @return ClientAbstracts
@@ -595,14 +435,6 @@ abstract class ClientAbstracts implements IClient
return $this;
}
/**
* @return int
*/
public function getConnectTimeout(): int
{
return $this->connect_timeout;
}
/**
* @param int $connect_timeout
* @return ClientAbstracts
@@ -728,7 +560,7 @@ abstract class ClientAbstracts implements IClient
*/
protected function matchHost(string $string): array
{
return [$this->host, $this->isSSL(), $string];
return [$this->host, $this->isSSL, $string];
}
+14 -15
View File
@@ -34,7 +34,7 @@ class CoroutineClient extends ClientAbstracts
$path = '/' . $path;
}
$host = $this->getHost();
$host = $this->host;
if (!preg_match('/(\d{1,3}\.){3}\d{1,3}/', $host)) {
$this->withAddedHeader('Host', $host);
}
@@ -62,16 +62,15 @@ class CoroutineClient extends ClientAbstracts
private function coroutine(string $url, array|string $data = []): void
{
try {
$this->generate_client($this->getHost(), $this->isSSL());
$this->generate_client($this->host, $this->isSSL);
if ($this->client->statusCode < 0) {
throw new Exception($this->client->errMsg);
}
$this->execute($url, $data);
} catch (\Throwable $exception) {
$this->setStatusCode(-1);
$this->setBody(jTraceEx($exception));
$this->statusCode = -1;
$this->body = json_encode(['code' => 500, 'message' => $exception->getMessage()]);
}
}
@@ -87,8 +86,8 @@ class CoroutineClient extends ClientAbstracts
if (in_array($this->client->getStatusCode(), [502, 404])) {
$this->retry($path, $data);
} else {
$this->setStatusCode($this->client->getStatusCode());
$this->setBody($this->client->getBody());
$this->statusCode = $this->client->getStatusCode();
$this->body = $this->client->getBody();
$this->setResponseHeader($this->client->headers);
}
}
@@ -106,8 +105,8 @@ class CoroutineClient extends ClientAbstracts
$this->execute($path, $data);
} else {
$this->setStatusCode($this->client->statusCode);
$this->setBody($this->client->errMsg);
$this->statusCode = $this->client->statusCode;
$this->body = $this->client->errMsg;
}
}
@@ -117,17 +116,17 @@ class CoroutineClient extends ClientAbstracts
*/
private function generate_client(string $host, bool $isHttps): void
{
if ($isHttps || $this->isSSL()) {
if ($isHttps || $this->isSSL) {
$this->client = new SwowClient($host, 443, true);
} else {
$this->client = new SwowClient($host, $this->getPort(), false);
}
$this->client->set($this->settings());
if (!empty($this->getAgent())) {
$this->withAddedHeader('User-Agent', $this->getAgent());
if (!empty($this->agent)) {
$this->withAddedHeader('User-Agent', $this->agent);
}
$this->client->setHeaders($this->getHeader());
$this->client->setMethod(strtoupper($this->getMethod()));
$this->client->setHeaders($this->header);
$this->client->setMethod(strtoupper($this->method));
}
@@ -138,7 +137,7 @@ class CoroutineClient extends ClientAbstracts
*/
private function setParams(string $path, mixed $data): string
{
$content = $this->getData();
$content = $this->_data;
if (!empty($content)) {
$this->client->setData($content);
}
+36 -30
View File
@@ -6,6 +6,7 @@ namespace Kiri;
/**
* Class CurlClient
*
* @package Http\Handler\Client
*/
class CurlClient extends ClientAbstracts
@@ -16,6 +17,7 @@ class CurlClient extends ClientAbstracts
* @param string $method
* @param string $path
* @param array|string $params
*
* @return void
*/
public function request(string $method, string $path, array|string $params = []): void
@@ -37,19 +39,20 @@ class CurlClient extends ClientAbstracts
* @param string $path
* @param string $method
* @param $params
*
* @return void
*/
private function getCurlHandler(string $path, string $method, $params): void
{
$host = $this->isSSL() ? 'https://' . $this->getHost() : 'http://' . $this->getHost();
$host = $this->isSSL ? 'https://' . $this->host : 'http://' . $this->host;
if ($this->getPort() != 443 && $this->getPort() != 80) {
$host .= ':' . $this->getPort();
}
$this->do(curl_init($host . $path), $host . $path, $method);
if ($this->isSSL()) {
if ($this->isSSL) {
$this->curlHandlerSslSet();
}
$contents = $this->getData();
$contents = $this->_data;
if (empty($params) && empty($contents)) {
return;
}
@@ -72,14 +75,14 @@ class CurlClient extends ClientAbstracts
*/
private function curlHandlerSslSet(): void
{
if (!empty($this->getSslKeyFile()) && file_exists($this->getSslKeyFile())) {
curl_setopt($this->client, CURLOPT_SSLKEY, $this->getSslKeyFile());
if (!empty($this->ssl_key_file) && file_exists($this->ssl_key_file)) {
curl_setopt($this->client, CURLOPT_SSLKEY, $this->ssl_key_file);
}
if (!empty($this->getSslCertFile()) && file_exists($this->getSslCertFile())) {
curl_setopt($this->client, CURLOPT_SSLCERT, $this->getSslCertFile());
if (!empty($this->ssl_cert_file) && file_exists($this->ssl_cert_file)) {
curl_setopt($this->client, CURLOPT_SSLCERT, $this->ssl_cert_file);
}
if (!empty($this->getCa()) && file_exists($this->getCa())) {
curl_setopt($this->client, CURLOPT_CAINFO, $this->getCa());
if (!empty($this->ca) && file_exists($this->ca)) {
curl_setopt($this->client, CURLOPT_CAINFO, $this->ca);
}
}
@@ -88,13 +91,14 @@ class CurlClient extends ClientAbstracts
* @param mixed $resource
* @param string $path
* @param string $method
*
* @return void
*/
private function do(mixed $resource, string $path, string $method): void
{
curl_setopt($resource, CURLOPT_URL, $path);
curl_setopt($resource, CURLOPT_TIMEOUT, $this->getTimeout()); // 超时设置
curl_setopt($resource, CURLOPT_CONNECTTIMEOUT, $this->getConnectTimeout()); // 超时设置
curl_setopt($resource, CURLOPT_TIMEOUT, $this->timeout); // 超时设置
curl_setopt($resource, CURLOPT_CONNECTTIMEOUT, $this->connect_timeout); // 超时设置
curl_setopt($resource, CURLOPT_HEADER, TRUE);
curl_setopt($resource, CURLOPT_FAILONERROR, TRUE);
curl_setopt($resource, CURLOPT_HTTPHEADER, $this->parseHeaderMat());
@@ -103,8 +107,8 @@ class CurlClient extends ClientAbstracts
}
curl_setopt($resource, CURLOPT_FORBID_REUSE, FALSE);
curl_setopt($resource, CURLOPT_FRESH_CONNECT, FALSE);
if (!empty($this->getAgent())) {
curl_setopt($resource, CURLOPT_USERAGENT, $this->getAgent());
if (!empty($this->agent)) {
curl_setopt($resource, CURLOPT_USERAGENT, $this->agent);
}
curl_setopt($resource, CURLOPT_NOBODY, FALSE);
curl_setopt($resource, CURLOPT_RETURNTRANSFER, TRUE);//返回内容
@@ -113,7 +117,7 @@ class CurlClient extends ClientAbstracts
if ($method === self::POST || $method == self::UPLOAD) {
curl_setopt($resource, CURLOPT_POST, 1);
}
[$proxy, $port] = [$this->getProxyHost(), $this->getProxyPort()];
[$proxy, $port] = [$this->proxyHost, $this->proxyPort];
if (!empty($proxy) && $port > 0) {
curl_setopt($resource, CURLOPT_PROXYPORT, $port);
curl_setopt($resource, CURLOPT_PROXY, $proxy);
@@ -134,6 +138,7 @@ class CurlClient extends ClientAbstracts
/**
* @param string $path
*
* @return $this
*/
public function withCAInfo(string $path): static
@@ -152,9 +157,10 @@ class CurlClient extends ClientAbstracts
if ($output !== FALSE) {
$this->explode($output);
} else {
$this->setStatusCode(curl_errno($this->client));
$this->setBody(curl_error($this->client));
$this->statusCode = curl_errno($this->client);
$this->body = curl_error($this->client);
}
$this->close();
}
@@ -169,8 +175,8 @@ class CurlClient extends ClientAbstracts
$this->execute();
} else {
$this->setStatusCode(curl_errno($this->client));
$this->setBody(curl_error($this->client));
$this->statusCode = curl_errno($this->client);
$this->body = curl_error($this->client);
}
}
@@ -180,32 +186,32 @@ class CurlClient extends ClientAbstracts
*/
public function close(): void
{
if (PHP_VERSION < '8.0') {
curl_close($this->client);
}
}
/**
* @param string $output
*
* @return void
* @throws
*/
private function explode(string $output): void
{
[$header, $body] = explode("\r\n\r\n", $output, 2);
if ($header == 'HTTP/1.1 100 Continue') {
[$header, $body] = explode("\r\n\r\n", $body, 2);
}
// 获取 HTTP 状态码
$statusCode = +curl_getinfo($this->client, CURLINFO_HTTP_CODE);
$header = explode("\r\n", $header);
$status = explode(' ', array_shift($header));
$statusCode = intval($status[1]);
// 获取 header 的大小(不包括最后的 \r\n\r\n 分隔符)
$headerSize = curl_getinfo($this->client, CURLINFO_HEADER_SIZE);
$header = substr($output, 0, $headerSize);
if (in_array($statusCode, [502, 404])) {
$this->retry();
} else {
$this->setStatusCode($statusCode);
$this->setBody($body);
$this->setResponseHeader($header);
$this->statusCode = $statusCode;
$this->body = substr($output, $headerSize);
$this->setResponseHeader(explode("\r\n", $header));
}
}
@@ -216,7 +222,7 @@ class CurlClient extends ClientAbstracts
private function parseHeaderMat(): array
{
$headers = [];
foreach ($this->getHeader() as $key => $val) {
foreach ($this->header as $key => $val) {
$headers[$key] = $key . ': ' . $val;
}
return array_values($headers);
+3 -4
View File
@@ -172,8 +172,7 @@ interface IClient
public function withContentType(string $contentType): static;
/**
* @return mixed
*/
public function getBody(): mixed;
public null|string $body {
get;
}
}
+9 -9
View File
@@ -11,16 +11,16 @@ trait TSwooleClient
*/
private function settings(): array
{
$sslCert = $this->getSslCertFile();
$sslKey = $this->getSslKeyFile();
$sslCa = $this->getCa();
$sslCert = $this->ssl_cert_file;
$sslKey = $this->ssl_key_file;
$sslCa = $this->ca;
$params = [];
if ($this->getConnectTimeout() > 0) {
$params['timeout'] = $this->getConnectTimeout();
if ($this->connect_timeout > 0) {
$params['timeout'] = $this->connect_timeout;
}
[$proxy, $port] = [$this->getProxyHost(), $this->getProxyPort()];
[$proxy, $port] = [$this->proxyHost, $this->proxyPort];
if (!empty($proxy) && $port > 0) {
$params['http_proxy_host'] = $proxy;
$params['http_proxy_port'] = $port;
@@ -29,9 +29,9 @@ trait TSwooleClient
return $params;
}
$params['ssl_host_name'] = $this->getHost();
$params['ssl_cert_file'] = $this->getSslCertFile();
$params['ssl_key_file'] = $this->getSslKeyFile();
$params['ssl_host_name'] = $this->host;
$params['ssl_cert_file'] = $this->ssl_cert_file;
$params['ssl_key_file'] = $this->ssl_key_file;
$params['ssl_verify_peer'] = TRUE;
$params['ssl_cafile'] = $sslCa;
+1 -1
View File
@@ -9,7 +9,7 @@
],
"license": "MIT",
"require": {
"php": ">=8.0",
"php": ">=8.5",
"ext-json": "*",
"ext-swoole": "*"
},