mirror of https://github.com/YGGverse/next.git
yggverse
7 months ago
1 changed files with 267 additions and 0 deletions
@ -0,0 +1,267 @@
@@ -0,0 +1,267 @@
|
||||
<?php |
||||
|
||||
// Load dependencies |
||||
require_once __DIR__ . |
||||
DIRECTORY_SEPARATOR . '..'. |
||||
DIRECTORY_SEPARATOR . 'vendor' . |
||||
DIRECTORY_SEPARATOR . 'autoload.php'; |
||||
|
||||
// Parse requested arguments |
||||
foreach ((array) $argv as $item) |
||||
{ |
||||
if (preg_match('/^(?<key>[^=]+)=(?<value>.*)$/', $item, $argument)) |
||||
{ |
||||
switch ($argument['key']) |
||||
{ |
||||
case 'host': |
||||
|
||||
define( |
||||
'NEXT_HOST', |
||||
(string) $argument['value'] |
||||
); |
||||
|
||||
break; |
||||
|
||||
case 'port': |
||||
|
||||
define( |
||||
'NEXT_PORT', |
||||
(int) $argument['value'] |
||||
); |
||||
|
||||
break; |
||||
|
||||
case 'path': |
||||
|
||||
$path = rtrim( |
||||
$argument['value'], |
||||
DIRECTORY_SEPARATOR |
||||
) . DIRECTORY_SEPARATOR; |
||||
|
||||
if (!is_dir($path) || !is_readable($path)) |
||||
{ |
||||
print( |
||||
_('path not accessible') |
||||
) . PHP_EOL; |
||||
|
||||
exit; |
||||
} |
||||
|
||||
define( |
||||
'NEXT_PATH', |
||||
(string) $path |
||||
); |
||||
|
||||
break; |
||||
|
||||
case 'file': |
||||
|
||||
define( |
||||
'NEXT_FILE', |
||||
(string) $argument['value'] |
||||
); |
||||
|
||||
break; |
||||
|
||||
case 'fail': |
||||
|
||||
$fail = rtrim( |
||||
$argument['value'], |
||||
DIRECTORY_SEPARATOR |
||||
) . DIRECTORY_SEPARATOR; |
||||
|
||||
if (!is_file($fail) || !is_readable($fail)) |
||||
{ |
||||
print( |
||||
_('fail template not accessible') |
||||
) . PHP_EOL; |
||||
|
||||
exit; |
||||
} |
||||
|
||||
define( |
||||
'NEXT_FAIL', |
||||
(string) file_get_contents( |
||||
$fail |
||||
) |
||||
); |
||||
|
||||
break; |
||||
|
||||
case 'list': |
||||
|
||||
define( |
||||
'NEXT_LIST', |
||||
in_array( |
||||
mb_strtolower( |
||||
(string) $argument['value'] |
||||
), |
||||
[ |
||||
'true', |
||||
'yes', |
||||
'1' |
||||
] |
||||
) |
||||
); |
||||
|
||||
break; |
||||
|
||||
case 'size': |
||||
|
||||
define( |
||||
'NEXT_SIZE', |
||||
(int) $argument['value'] |
||||
); |
||||
|
||||
break; |
||||
|
||||
case 'dump': |
||||
|
||||
define( |
||||
'NEXT_DUMP', |
||||
(string) $argument['value'] |
||||
); |
||||
|
||||
break; |
||||
} |
||||
} |
||||
} |
||||
|
||||
// Validate required arguments and set optional defaults |
||||
if (!defined('NEXT_HOST')) define('NEXT_HOST', '127.0.0.1'); |
||||
|
||||
if (!defined('NEXT_PORT')) define('NEXT_PORT', 1900); |
||||
|
||||
if (!defined('NEXT_PATH')) |
||||
{ |
||||
print( |
||||
_('path required') |
||||
) . PHP_EOL; |
||||
|
||||
exit; |
||||
} |
||||
|
||||
if (!defined('NEXT_FILE')) define('NEXT_FILE', false); |
||||
|
||||
if (!defined('NEXT_LIST')) define('NEXT_LIST', true); |
||||
|
||||
if (!defined('NEXT_SIZE')) define('NEXT_SIZE', 1024); |
||||
|
||||
if (!defined('NEXT_FAIL')) define('NEXT_FAIL', 'fail'); |
||||
|
||||
if (!defined('NEXT_DUMP')) define('NEXT_DUMP', '[{time}] [{code}] {host}:{port} {path} {goal}'); |
||||
|
||||
// Init server |
||||
$server = new \Yggverse\Nex\Server( |
||||
NEXT_HOST, |
||||
NEXT_PORT, |
||||
NEXT_SIZE |
||||
); |
||||
|
||||
$server->start( |
||||
function ( |
||||
string $request, |
||||
string $connect |
||||
): ?string |
||||
{ |
||||
// Make goal request |
||||
$goal = preg_replace( |
||||
[ |
||||
'/(^|\/)[\.]+/', // hidden items started with dot |
||||
'/[\.]+\//', // relative directory paths |
||||
'/[\/]+\//', // remove extra slashes |
||||
], |
||||
'/', |
||||
NEXT_PATH . trim( |
||||
$request |
||||
) |
||||
); |
||||
|
||||
// Define response |
||||
$response = null; |
||||
|
||||
// Directory request |
||||
if (is_dir($goal)) |
||||
{ |
||||
// Try index file first on enabled |
||||
if (NEXT_FILE && is_readable($goal . NEXT_FILE)) |
||||
{ |
||||
$response = file_get_contents( |
||||
$goal . NEXT_FILE |
||||
); |
||||
} |
||||
|
||||
// Try directory listing on enabled |
||||
else if (NEXT_LIST && is_readable($goal)) |
||||
{ |
||||
$links = []; |
||||
|
||||
foreach ((array) scandir($goal) as $link) |
||||
{ |
||||
// Skip hidden entities and make sure the destination is accessible |
||||
if (!str_starts_with($link, '.') && is_readable($goal . $link)) |
||||
{ |
||||
// Directory |
||||
if (is_dir($link)) |
||||
{ |
||||
$links[] = sprintf( |
||||
'=> %s/', |
||||
$link |
||||
); |
||||
} |
||||
|
||||
// File |
||||
else |
||||
{ |
||||
$links[] = sprintf( |
||||
'=> %s', |
||||
$link |
||||
); |
||||
} |
||||
} |
||||
} |
||||
|
||||
$response = implode( |
||||
PHP_EOL, |
||||
$links |
||||
); |
||||
} |
||||
} |
||||
|
||||
// Try file |
||||
else if (is_readable($goal)) |
||||
{ |
||||
$response = file_get_contents( |
||||
$goal |
||||
); |
||||
} |
||||
|
||||
// Dump request on enabled |
||||
if (NEXT_DUMP) |
||||
{ |
||||
printf( |
||||
str_ireplace( |
||||
[ |
||||
'{time}', |
||||
'{code}', |
||||
'{host}', |
||||
'{port}', |
||||
'{path}', |
||||
'{goal}', |
||||
], |
||||
[ |
||||
date('c'), |
||||
(int) !empty($response), |
||||
parse_url($connect, PHP_URL_HOST), |
||||
parse_url($connect, PHP_URL_PORT), |
||||
empty($request) ? '/' : trim($request), |
||||
$goal |
||||
], |
||||
NEXT_DUMP |
||||
) . PHP_EOL |
||||
); |
||||
} |
||||
|
||||
return empty($response) ? NEXT_FAIL : $response; |
||||
} |
||||
); |
Loading…
Reference in new issue