blob: f23c51d846269ee37f077f357e0aa10f3221df1f [file] [log] [blame]
<?php
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* ProxyHandler test case.
*/
class ProxyHandlerTest extends PHPUnit_Framework_TestCase {
/**
* @var ProxyHandler
*/
private $ProxyHandler;
/**
* @var context
*/
private $context;
/**
* @var signingFetcherFactory
*/
private $signingFetcherFactory;
/**
* @var signingFetcherFactory
*/
private $url;
/**
* @var original_content
*/
private $original_content;
/**
* @var proxy
*/
private $proxy;
/**
* Prepares the environment before running a test.
*/
protected function setUp() {
parent::setUp();
$this->context = new GadgetContext('GADGET');
$this->url = 'http://' . $_SERVER["HTTP_HOST"] . Config::get('web_prefix') . '/test/gadgets/example.xml';
$this->proxy = 'http://' . $_SERVER["HTTP_HOST"] . Config::get('web_prefix') . '/gadgets/proxy/';
$this->original_content = file_get_contents($this->url);
$this->ProxyHandler = new ProxyHandler($this->context);
}
/**
* Cleans up the environment after running a test.
*/
protected function tearDown() {
$this->ProxyHandler = null;
parent::tearDown();
}
private function getRemoteFile($url, $IfNoneMatch = null, $IfModifiedSince = null) {
// get the host name and url path
$parsedUrl = parse_url($url);
$host = $parsedUrl['host'];
if (isset($parsedUrl['path'])) {
$path = $parsedUrl['path'];
} else {
// the url is pointing to the host like http://www.mysite.com
$path = '/';
}
if (isset($parsedUrl['query'])) {
$path .= '?' . $parsedUrl['query'];
}
if (isset($parsedUrl['port'])) {
$port = $parsedUrl['port'];
} else {
$port = 80;
}
$timeout = 5;
$response = '';
// connect to the remote server
$fp = @fsockopen($host, $port, $errno, $errstr, $timeout);
if (! $fp) {
echo "Cannot retrieve $url";
} else {
// send the necessary headers to get the file
fputs($fp, "GET $path HTTP/1.0\r\n" . "Host: $host\r\n" . "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.3) Gecko/20060426 Firefox/1.5.0.3\r\n" . "Accept: */*\r\n" . ($IfNoneMatch !== null ? "If-None-Match: $IfNoneMatch\r\n" : '') . ($IfNoneMatch !== null ? "If-Modified-Since: $IfModifiedSince\r\n" : '') . "Keep-Alive: 300\r\n" . "Connection: keep-alive\r\n" . "Referer: http://$host\r\n\r\n");
// retrieve the response from the remote server
while ($line = fread($fp, 4096)) {
$response .= $line;
}
fclose($fp);
}
// return the file content
return $response;
}
private function getHTTPStatus($strHeaders) {
return intval(substr($strHeaders, 8, 5));
}
/**
* Tests ProxyHandler->fetch()
*/
public function testFetch() {
$out = file_get_contents($this->proxy . '?url=' . $this->url . '');
$this->assertEquals($out, $this->original_content);
$this->assertNotEquals($this->getHTTPStatus($this->getRemoteFile($this->proxy . '?url=' . $this->url . '')), $this->getHTTPStatus($this->getRemoteFile($this->proxy . '?url=' . $this->url . '', 'd9e124952eee27820768b8fadb0f0b78', gmdate("D, d M Y H:i:s", time() + 10000) . " GMT")), 'Checking HTTP 304 support');
}
/**
* Tests ProxyHandler->fetchJson()
*/
public function testFetchJson() {
// FIXME we need a better test here
$out = file_get_contents($this->proxy . '?url=' . $this->url . '&output=js');
$this->assertTrue(strpos($out, UNPARSEABLE_CRUFT) == 0);
}
}