diff --git a/src/Environment/Helpers/server.php b/src/Environment/Helpers/server.php index 677b9d4d9..d907e1447 100644 --- a/src/Environment/Helpers/server.php +++ b/src/Environment/Helpers/server.php @@ -9,22 +9,27 @@ * @author Arman Ag. * @copyright Copyright (c) 2018 Softberg LLC (https://softberg.org) * @link http://quantum.softberg.org/ - * @since 2.9.7 + * @since 2.9.9 */ use Quantum\Environment\Server; +/** + * Gets Server instance + * @return Server + */ +function server(): Server +{ + return Server::getInstance(); +} + /** * Gets user IP * @return string|null */ function get_user_ip(): ?string { - $server = Server::getInstance(); - - return $server->get('HTTP_CLIENT_IP') - ?? $server->get('HTTP_X_FORWARDED_FOR') - ?? $server->get('REMOTE_ADDR'); + return Server::getInstance()->ip(); } if (!function_exists('getallheaders')) { @@ -37,19 +42,6 @@ function get_user_ip(): ?string */ function getallheaders(): array { - $server = Server::getInstance(); - $data = $server->all(); - - if (empty($data)) { - return []; - } - - return array_reduce(array_keys($data), function ($headers, $key) use ($data) { - if (strpos($key, 'HTTP_') === 0) { - $formattedKey = strtolower(str_replace('_', '-', substr($key, 5))); - $headers[$formattedKey] = $data[$key]; - } - return $headers; - }, []); + return Server::getInstance()->getAllHeaders(); } } \ No newline at end of file diff --git a/src/Environment/Server.php b/src/Environment/Server.php index 16e6c28e7..1cb120658 100644 --- a/src/Environment/Server.php +++ b/src/Environment/Server.php @@ -9,7 +9,7 @@ * @author Arman Ag. * @copyright Copyright (c) 2018 Softberg LLC (https://softberg.org) * @link http://quantum.softberg.org/ - * @since 2.9.8 + * @since 2.9.9 */ namespace Quantum\Environment; @@ -174,4 +174,50 @@ public function ajax(): bool { return strtolower($this->get('HTTP_X_REQUESTED_WITH') ?? '') === 'xmlhttprequest'; } + + /** + * @return string|null + */ + public function ip(): ?string + { + return $this->get('HTTP_CLIENT_IP') + ?? $this->get('HTTP_X_FORWARDED_FOR') + ?? $this->get('REMOTE_ADDR'); + } + + /** + * @return array + */ + function getAllHeaders(): array + { + $data = $this->all(); + + if (empty($data)) { + return []; + } + + return array_reduce(array_keys($data), function ($headers, $key) use ($data) { + if (strpos($key, 'HTTP_') === 0) { + $formattedKey = strtolower(str_replace('_', '-', substr($key, 5))); + $headers[$formattedKey] = $data[$key]; + } + return $headers; + }, []); + } + + /** + * @return string|null + */ + public function acceptedLang(): ?string + { + $accept = $this->get('HTTP_ACCEPT_LANGUAGE'); + + if (!$accept) { + return null; + } + + $first = explode(',', $accept)[0]; + + return strtolower(substr(trim($first), 0, 2)); + } } \ No newline at end of file diff --git a/tests/Unit/Environment/ServerTest.php b/tests/Unit/Environment/ServerTest.php index 46165c6fb..e743c1966 100644 --- a/tests/Unit/Environment/ServerTest.php +++ b/tests/Unit/Environment/ServerTest.php @@ -136,4 +136,71 @@ public function testServerAjax() $this->assertFalse($server->ajax()); } + public function testServerGetUserIpFromRemoteAddr() + { + $server = Server::getInstance(); + + $server->set('HTTP_CLIENT_IP', '192.168.1.1'); + $server->set('HTTP_X_FORWARDED_FOR', null); + $server->set('REMOTE_ADDR', null); + $this->assertEquals('192.168.1.1', $server->ip()); + + $server->set('HTTP_CLIENT_IP', null); + $server->set('HTTP_X_FORWARDED_FOR', '203.0.113.5'); + $server->set('REMOTE_ADDR', null); + $this->assertEquals('203.0.113.5', $server->ip()); + + $server->set('HTTP_CLIENT_IP', null); + $server->set('HTTP_X_FORWARDED_FOR', null); + $server->set('REMOTE_ADDR', '198.51.100.1'); + $this->assertEquals('198.51.100.1', $server->ip()); + + $server->set('HTTP_CLIENT_IP', null); + $server->set('HTTP_X_FORWARDED_FOR', null); + $server->set('REMOTE_ADDR', null); + $this->assertNull($server->ip()); + } + + public function testServerGetAllHeadersFromServerClass() + { + $server = Server::getInstance(); + + $server->set('HTTP_USER_AGENT', 'Mozilla/5.0'); + $server->set('HTTP_ACCEPT', 'text/html'); + $server->set('HTTP_X_CUSTOM_HEADER', 'CustomValue'); + $server->set('SERVER_NAME', 'example.com'); + + $headers = $server->getAllHeaders(); + + $this->assertArrayHasKey('user-agent', $headers); + $this->assertArrayHasKey('accept', $headers); + $this->assertArrayHasKey('x-custom-header', $headers); + + $this->assertEquals('Mozilla/5.0', $headers['user-agent']); + $this->assertEquals('text/html', $headers['accept']); + $this->assertEquals('CustomValue', $headers['x-custom-header']); + + $this->assertArrayNotHasKey('SERVER_NAME', $headers); + } + + public function testServerAcceptedLang() + { + $server = Server::getInstance(); + + $server->set('HTTP_ACCEPT_LANGUAGE', null); + $this->assertNull($server->acceptedLang()); + + $server->set('HTTP_ACCEPT_LANGUAGE', 'en-US'); + $this->assertEquals('en', $server->acceptedLang()); + + $server->set('HTTP_ACCEPT_LANGUAGE', 'fr-CA,fr;q=0.8,en-US;q=0.6,en;q=0.4'); + $this->assertEquals('fr', $server->acceptedLang()); + + $server->set('HTTP_ACCEPT_LANGUAGE', ' de-DE , en-US '); + $this->assertEquals('de', $server->acceptedLang()); + + $server->set('HTTP_ACCEPT_LANGUAGE', 'ES-ES'); + $this->assertEquals('es', $server->acceptedLang()); + } + } \ No newline at end of file