'104.16.1.1', 'HTTP_X_FORWARDED_FOR' => '1.2.3.4, 203.0.113.50', 'HTTP_TRUE_CLIENT_IP' => '198.51.100.9', 'HTTP_CF_CONNECTING_IP' => '203.0.113.77', ]); $this->assertSame('203.0.113.77', VisitorIp::fromRequest($request)); } #[Test] public function falls_back_to_true_client_ip_then_remote_addr(): void { $trueClient = Request::create('/', 'GET', [], [], [], [ 'REMOTE_ADDR' => '104.16.1.1', 'HTTP_X_FORWARDED_FOR' => '1.2.3.4', 'HTTP_TRUE_CLIENT_IP' => '198.51.100.9', ]); $this->assertSame('198.51.100.9', VisitorIp::fromRequest($trueClient)); $direct = Request::create('/', 'GET', [], [], [], [ 'REMOTE_ADDR' => '127.0.0.1', ]); $this->assertSame('127.0.0.1', VisitorIp::fromRequest($direct)); } #[Test] public function ignores_invalid_cf_header_and_unwraps_mapped_ipv6(): void { $invalid = Request::create('/', 'GET', [], [], [], [ 'REMOTE_ADDR' => '127.0.0.1', 'HTTP_CF_CONNECTING_IP' => 'not-an-ip', ]); $this->assertSame('127.0.0.1', VisitorIp::fromRequest($invalid)); $this->assertSame('203.0.113.9', VisitorIp::normalize('::ffff:203.0.113.9')); $this->assertSame('203.0.113.9', VisitorIp::normalize('203.0.113.9, 10.0.0.1')); $this->assertSame('', VisitorIp::normalize('unknown')); } }