Compare commits

..

No commits in common. "b0c3eca177c9a7521991d92896776606ba754111" and "1ace4c95b52c822c4c21631700ea7f2f945095d3" have entirely different histories.

5 changed files with 45 additions and 58 deletions

View file

@ -40,27 +40,7 @@ class Subnet
throw new Exception("CIDR must be between 0 and 32."); throw new Exception("CIDR must be between 0 and 32.");
} }
if ($cidr === 32) { $hosts = (1 << (32 - $cidr)) - 2; // Excludes network and broadcast
return [
'network' => $ip,
'first' => $ip,
'last' => $ip,
'hosts' => 1,
];
}
if ($cidr === 31) {
$ipLong = ip2long($ip);
$network = $ipLong & (-1 << (32 - $cidr));
return [
'network' => long2ip($network),
'first' => long2ip($network),
'last' => long2ip($network + 1),
'hosts' => 2,
];
}
$hosts = (1 << (32 - $cidr)) - 2;
$ipLong = ip2long($ip); $ipLong = ip2long($ip);
$mask = -1 << (32 - $cidr); $mask = -1 << (32 - $cidr);
$network = $ipLong & $mask; $network = $ipLong & $mask;
@ -76,7 +56,6 @@ class Subnet
]; ];
} }
/** /**
* Calculate IPv6 * Calculate IPv6
* *
@ -91,50 +70,35 @@ class Subnet
throw new Exception("CIDR must be between 0 and 128."); throw new Exception("CIDR must be between 0 and 128.");
} }
if ($cidr === 128) { // Convert IP to binary representation
return [ $binaryIP = inet_pton($ip);
'network' => $ip, if ($binaryIP === false) {
'first' => $ip, throw new Exception("Failed to parse IPv6 address.");
'last' => $ip,
'hosts' => 1,
];
} }
if ($cidr === 127) { // Calculate network address
$binaryIP = inet_pton($ip);
$network = substr($binaryIP, 0, intval($cidr / 8));
$firstHost = inet_ntop($network);
$lastHost = inet_ntop($binaryIP);
return [
'network' => $firstHost,
'first' => $firstHost,
'last' => $lastHost,
'hosts' => 2,
];
}
// General case for other IPv6 subnets
$totalHosts = bcpow(2, 128 - $cidr); // Number of total IPs
$binaryIP = inet_pton($ip);
// Calculate the network address
$network = substr($binaryIP, 0, intval($cidr / 8)); $network = substr($binaryIP, 0, intval($cidr / 8));
$remainder = $cidr % 8; $remainder = $cidr % 8;
if ($remainder > 0) { if ($remainder > 0) {
$lastByte = ord($binaryIP[intval($cidr / 8)]) & (0xFF << (8 - $remainder)); $lastByte = ord($binaryIP[$cidr / 8]) & (0xFF << (8 - $remainder));
$network .= chr($lastByte); $network .= chr($lastByte);
} }
// Pad the rest with zeros
$network = str_pad($network, 16, "\0"); $network = str_pad($network, 16, "\0");
// Calculate first and last addresses
$networkAddress = inet_ntop($network); $networkAddress = inet_ntop($network);
$totalHosts = $cidr == 128 ? 1 : bcpow(2, 128 - $cidr);
$firstHost = ($cidr == 128) ? $networkAddress : inet_ntop($network);
$lastHost = inet_ntop(pack("H*", str_repeat("F", 32)));
return [ return [
'network' => $networkAddress, 'network' => $networkAddress,
'first' => $cidr == 128 ? $networkAddress : inet_ntop($network), 'first' => $firstHost,
'last' => $cidr == 128 ? $networkAddress : inet_ntop($network), // Adjusted for simplicity 'last' => $lastHost,
'hosts' => $totalHosts, 'hosts' => $totalHosts,
]; ];
} }
} }

View file

@ -10,8 +10,7 @@
"require": { "require": {
"php": ">=8.3.0", "php": ">=8.3.0",
"filp/whoops": "^2.16", "filp/whoops": "^2.16",
"vlucas/phpdotenv": "^5.6", "vlucas/phpdotenv": "^5.6"
"ext-bcmath": "*"
}, },
"require-dev": { "require-dev": {
"symfony/var-dumper": "^7.1", "symfony/var-dumper": "^7.1",

View file

@ -15,11 +15,14 @@ class HtmlEngine extends Render
$basePath = $_SERVER['DOCUMENT_ROOT']; $basePath = $_SERVER['DOCUMENT_ROOT'];
$viewsPath = app()->resourcePath('views/' . str_replace('.', '/', $this->view) . '.php'); $viewsPath = app()->resourcePath('views/' . str_replace('.', '/', $this->view) . '.php');
if (!file_exists($viewsPath)) { if (file_exists($viewsPath)) {
throw new \Exception('View not found'); extract($this->data);
include $viewsPath;
return;
} }
extract($this->data); throw new \Exception('View not found');
include $viewsPath;
} }
} }

View file

@ -71,7 +71,6 @@ class RouteCollection
fn($key) => !is_numeric($key), fn($key) => !is_numeric($key),
ARRAY_FILTER_USE_KEY ARRAY_FILTER_USE_KEY
); );
return $route; return $route;
} }
} }

22
src/Routing/Router.php Normal file
View file

@ -0,0 +1,22 @@
<?php
namespace Core\Routing;
use Core\Http\Request;
class Router
{
/**
* Dispatch router and run application
*
* @return void
*/
public static function dispatch(): void
{
// Create request
$request = new Request($_POST + $_FILES);
// Dispatch router
RouteDispatcher::dispatch($request, RouteCollection::retrieve());
}
}