1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/yurunsoft-swoole-webhook

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
run.php 5.7 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Yurun Отправлено 10.08.2022 10:44 c9fe43f
<?php
declare(strict_types=1);
use Swoole\Coroutine;
require __DIR__ . '/vendor/autoload.php';
function getConfig()
{
return json_decode(file_get_contents(__DIR__ . '/config.json'), true);
}
class WebHook
{
/**
* 服务器.
*
* @var \Swoole\Http\Server
*/
private $server;
/**
* 服务器监听IP.
*
* @var string
*/
private $ip;
/**
* 服务器监听端口.
*
* @var int
*/
private $port;
public function __construct($ip, $port)
{
$this->ip = $ip;
$this->port = $port;
}
/**
* 运行服务
*
* @return void
*/
public function run()
{
$this->server = new \Swoole\Http\Server($this->ip, $this->port, \SWOOLE_BASE);
$config = getConfig();
if (isset($config['server']['setting']))
{
$this->server->set($config['server']['setting']);
}
$this->server->on('request', function (\Swoole\Http\Request $request, \Swoole\Http\Response $response) {
$this->onRequest($request, $response);
});
$this->server->on('WorkerStart', function () {
\Swoole\Runtime::enableCoroutine();
});
$this->server->on('task', function ($serv, $task) {
go(function () use ($serv, $task) {
$this->onTask($serv, $task);
});
});
unset($config);
$this->server->start();
}
/**
* 处理请求
*
* @return void
*/
private function onRequest(\Swoole\Http\Request $request, \Swoole\Http\Response $response)
{
try
{
switch ($request->server['request_uri'])
{
case '/gitee':
$this->server->task([
'type' => 'Gitee',
'data' => $request->rawcontent(),
'header' => $request->header,
]);
break;
case '/github':
$this->server->task([
'type' => 'Github',
'data' => $request->rawcontent(),
'header' => $request->header,
]);
break;
default:
$response->write('<p>are you ok?</p>');
break;
}
}
catch (\Throwable $ex)
{
$response->write($ex->getMessage());
}
$response->end('<p>Author: Yurun (<a href="https://gitee.com/Yurunsoft" target="_blank">Gitee</a> / <a href="https://github.com/Yurunsoft" target="_blank">Github</a>)</p>');
}
/**
* 处理码云.
*
* @param array $data
*
* @return void
*/
private function parseGitee($data)
{
$data['data'] = json_decode($data['data'], true);
$config = getConfig();
foreach ($config['sites']['gitee'] as $item)
{
if (isset($item['name']) && $item['name'] !== $data['data']['project']['path_with_namespace'])
{
continue;
}
if (isset($item['password']) && $item['password'] !== $data['data']['password'])
{
continue;
}
if (isset($item['hook_name']) && $item['hook_name'] !== $data['data']['hook_name'])
{
continue;
}
if (isset($item['ref']) && $item['ref'] !== $data['data']['ref'])
{
continue;
}
if (!isset($item['cmds']) || !is_array($item['cmds']))
{
break;
}
foreach ($item['cmds'] as $cmd)
{
Coroutine::exec($cmd);
}
echo 'gitee hook', \PHP_EOL;
return;
}
echo 'gitee no action', \PHP_EOL;
}
/**
* 处理Github.
*
* @param array $data
*
* @return void
*/
private function parseGithub($data)
{
$rawData = $data['data'];
$data['data'] = json_decode($data['data'], true);
$config = getConfig();
foreach ($config['sites']['github'] as $item)
{
if (isset($item['name']) && $item['name'] !== $data['data']['repository']['full_name'])
{
continue;
}
if (isset($item['password']))
{
list($algo, $hash) = explode('=', $data['header']['x-hub-signature']);
$myHash = hash_hmac($algo, $rawData, $item['password']);
if ($hash !== $myHash)
{
continue;
}
}
if (isset($item['hook_name']) && $item['hook_name'] !== $data['header']['x-github-event'])
{
continue;
}
if (isset($item['ref']) && $item['ref'] !== $data['data']['ref'])
{
continue;
}
if (!isset($item['cmds']) || !is_array($item['cmds']))
{
break;
}
foreach ($item['cmds'] as $cmd)
{
Coroutine::exec($cmd);
}
echo 'github hook', \PHP_EOL;
return;
}
echo 'github no action', \PHP_EOL;
}
private function onTask($serv, $task)
{
switch ($task->data['type'])
{
case 'Gitee':
$this->parseGitee($task->data);
break;
case 'Github':
$this->parseGithub($task->data);
break;
}
}
}
$config = getConfig();
$webhook = new WebHook($config['server']['host'], $config['server']['port']);
unset($config);
$webhook->run();

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/yurunsoft-swoole-webhook.git
git@api.gitlife.ru:oschina-mirror/yurunsoft-swoole-webhook.git
oschina-mirror
yurunsoft-swoole-webhook
yurunsoft-swoole-webhook
master