<?php
/**
* HttpUtils' tests
*/
require_once 'application/HttpUtils.php';
/**
* Unitary tests for server_url()
*/
class ServerUrlTest extends PHPUnit_Framework_TestCase
{
/**
* Detect if the server uses SSL
*/
public function testHttpsScheme()
{
$this->assertEquals(
'https://host.tld',
server_url(
array(
'HTTPS' => 'ON',
'SERVER_NAME' => 'host.tld',
'SERVER_PORT' => '443'
)
)
);
$this->assertEquals(
'https://host.tld:8080',
server_url(
array(
'HTTPS' => 'ON',
'SERVER_NAME' => 'host.tld',
'SERVER_PORT' => '8080'
)
)
);
}
/**
* Detect a Proxy that sets Forwarded-Host
*/
public function testHttpsProxyForwardedHost()
{
$this->assertEquals(
'https://host.tld:8080',
server_url(
array(
'HTTP_X_FORWARDED_PROTO' => 'https',
'HTTP_X_FORWARDED_PORT' => '8080',
'HTTP_X_FORWARDED_HOST' => 'host.tld'
)
)
);
$this->assertEquals(
'https://host.tld:4974',
server_url(
array(
'HTTP_X_FORWARDED_PROTO' => 'https, https',
'HTTP_X_FORWARDED_PORT' => '4974, 80',
'HTTP_X_FORWARDED_HOST' => 'host.tld, example.com'
)
)
);
}
/**
* Detect a Proxy with SSL enabled
*/
public function testHttpsProxyForward()
{
$this->assertEquals(
'https://host.tld:8080',
server_url(
array(
'HTTPS' => 'Off',
'SERVER_NAME' => 'host.tld',
'SERVER_PORT' => '80',
'HTTP_X_FORWARDED_PROTO' => 'https',
'HTTP_X_FORWARDED_PORT' => '8080'
)
)
);
$this->assertEquals(
'https://host.tld',
server_url(
array(
'HTTPS' => 'Off',
'SERVER_NAME' => 'host.tld',
'SERVER_PORT' => '80',
'HTTP_X_FORWARDED_PROTO' => 'https'
)
)
);
$this->assertEquals(
'https://host.tld',
server_url(
array(
'HTTPS' => 'Off',
'SERVER_NAME' => 'host.tld',
'SERVER_PORT' => '80',
'HTTP_X_FORWARDED_PROTO' => 'https',
'HTTP_X_FORWARDED_PORT' => '443'
)
)
);
$this->assertEquals(
'https://host.tld:4974',
server_url(
array(
'HTTPS' => 'Off',
'SERVER_NAME' => 'host.tld',
'SERVER_PORT' => '80',
'HTTP_X_FORWARDED_PROTO' => 'https, https',
'HTTP_X_FORWARDED_PORT' => '4974, 80'
)
)
);
}
/**
* Detect if the server uses a specific port (!= 80)
*/
public function testPort()
{
// HTTP
$this->assertEquals(
'http://host.tld:8080',
server_url(
array(
'HTTPS' => 'OFF',
'SERVER_NAME' => 'host.tld',
'SERVER_PORT' => '8080'
)
)
);
// HTTPS
$this->assertEquals(
'https://host.tld:8080',
server_url(
array(
'HTTPS' => 'ON',
'SERVER_NAME' => 'host.tld',
'SERVER_PORT' => '8080'
)
)
);
}
/**
* HTTP server on port 80
*/
public function testStandardHttpPort()
{
$this->assertEquals(
'http://host.tld',
server_url(
array(
'HTTPS' => 'OFF',
'SERVER_NAME' => 'host.tld',
'SERVER_PORT' => '80'
)
)
);
}
/**
* HTTPS server on port 443
*/
public function testStandardHttpsPort()
{
$this->assertEquals(
'https://host.tld',
server_url(
array(
'HTTPS' => 'ON',
'SERVER_NAME' => 'host.tld',
'SERVER_PORT' => '443'
)
)
);
}
/**
* Misconfigured server (see #1022): Proxy HTTP but 443
*/
public function testHttpWithPort433()
{
$this->assertEquals(
'https://host.tld',
server_url(
array(
'HTTPS' => 'Off',
'SERVER_NAME' => 'host.tld',
'SERVER_PORT' => '80',
'HTTP_X_FORWARDED_PROTO' => 'http',
'HTTP_X_FORWARDED_PORT' => '443'
)
)
);
$this->assertEquals(
'https://host.tld',
server_url(
array(
'HTTPS' => 'Off',
'SERVER_NAME' => 'host.tld',
'SERVER_PORT' => '80',
'HTTP_X_FORWARDED_PROTO' => 'https, http',
'HTTP_X_FORWARDED_PORT' => '443, 80'
)
)
);
}
}