"review=test" ); function setUp() { putenv( "http_proxy" ); /* Remove any proxy env var, so curl doesn't get confused */ if ( is_array( self::$content ) ) { return; } self::$has_curl = function_exists( 'curl_init' ); self::$has_fopen = wfIniGetBool( 'allow_url_fopen' ); if ( !file_exists( "/usr/bin/curl" ) ) { $this->markTestIncomplete( "This test requires the curl binary at /usr/bin/curl. If you have curl, please file a bug on this test, or, better yet, provide a patch." ); } $content = tempnam( wfTempDir(), "" ); $headers = tempnam( wfTempDir(), "" ); if ( !$content && !$headers ) { die( "Couldn't create temp file!" ); } // This probably isn't the best test for a proxy, but it works on my system! system( "curl -0 -o $content -s " . self::$proxy ); $out = file_get_contents( $content ); if ( $out ) { self::$has_proxy = true; } /* Maybe use wget instead of curl here ... just to use a different codebase? */ foreach ( $this->test_geturl as $u ) { system( "curl -0 -s -D $headers '$u' -o $content" ); self::$content["GET $u"] = file_get_contents( $content ); self::$headers["GET $u"] = file_get_contents( $headers ); } foreach ( $this->test_requesturl as $u ) { system( "curl -0 -s -X POST -H 'Content-Length: 0' -D $headers '$u' -o $content" ); self::$content["POST $u"] = file_get_contents( $content ); self::$headers["POST $u"] = file_get_contents( $headers ); } foreach ( $this->test_posturl as $u => $postData ) { system( "curl -0 -s -X POST -d '$postData' -D $headers '$u' -o $content" ); self::$content["POST $u => $postData"] = file_get_contents( $content ); self::$headers["POST $u => $postData"] = file_get_contents( $headers ); } unlink( $content ); unlink( $headers ); } function testInstantiation() { Http::$httpEngine = false; $r = MWHttpRequest::factory( "http://www.example.com/" ); if ( self::$has_curl ) { $this->assertThat( $r, $this->isInstanceOf( 'CurlHttpRequest' ) ); } else { $this->assertThat( $r, $this->isInstanceOf( 'PhpHttpRequest' ) ); } unset( $r ); if ( !self::$has_fopen ) { $this->setExpectedException( 'MWException' ); } Http::$httpEngine = 'php'; $r = MWHttpRequest::factory( "http://www.example.com/" ); $this->assertThat( $r, $this->isInstanceOf( 'PhpHttpRequest' ) ); unset( $r ); if ( !self::$has_curl ) { $this->setExpectedException( 'MWException' ); } Http::$httpEngine = 'curl'; $r = MWHttpRequest::factory( "http://www.example.com/" ); if ( self::$has_curl ) { $this->assertThat( $r, $this->isInstanceOf( 'CurlHttpRequest' ) ); } } function runHTTPFailureChecks() { // Each of the following requests should result in a failure. $timeout = 1; $start_time = time(); $r = Http::get( "http://www.example.com:1/", $timeout ); $end_time = time(); $this->assertLessThan( $timeout + 2, $end_time - $start_time, "Request took less than {$timeout}s via " . Http::$httpEngine ); $this->assertEquals( $r, false, "false -- what we get on error from Http::get()" ); $r = Http::get( "http://www.example.com/this-file-does-not-exist", $timeout ); $this->assertFalse( $r, "False on 404s" ); $r = MWHttpRequest::factory( "http://www.example.com/this-file-does-not-exist" ); $er = $r->execute(); if ( $r instanceof PhpHttpRequest && version_compare( '5.2.10', phpversion(), '>' ) ) { $this->assertRegexp( "/HTTP request failed/", $er->getWikiText() ); } else { $this->assertRegexp( "/404 Not Found/", $er->getWikiText() ); } } function testFailureDefault() { Http::$httpEngine = false; $this->runHTTPFailureChecks(); } function testFailurePhp() { if ( !self::$has_fopen ) { $this->markTestIncomplete( "This test requires allow_url_fopen=true." ); } Http::$httpEngine = "php"; $this->runHTTPFailureChecks(); } function testFailureCurl() { if ( !self::$has_curl ) { $this->markTestIncomplete( "This test requires curl." ); } Http::$httpEngine = "curl"; $this->runHTTPFailureChecks(); } /* ./phase3/includes/Import.php:1108: $data = Http::request( $method, $url ); */ /* ./includes/Import.php:1124: $link = Title::newFromText( "$interwiki:Special:Export/$page" ); */ /* ./includes/Import.php:1134: return ImportStreamSource::newFromURL( $url, "POST" ); */ function runHTTPRequests( $proxy = null ) { $opt = array(); if ( $proxy ) { $opt['proxy'] = $proxy; } elseif ( $proxy === false ) { $opt['noProxy'] = true; } /* no postData here because the only request I could find in code so far didn't have any */ foreach ( $this->test_requesturl as $u ) { $r = Http::request( "POST", $u, $opt ); $this->assertEquals( self::$content["POST $u"], "$r", "POST $u with " . Http::$httpEngine ); } } function testRequestDefault() { Http::$httpEngine = false; $this->runHTTPRequests(); } function testRequestPhp() { if ( !self::$has_fopen ) { $this->markTestIncomplete( "This test requires allow_url_fopen=true." ); } Http::$httpEngine = "php"; $this->runHTTPRequests(); } function testRequestCurl() { if ( !self::$has_curl ) { $this->markTestIncomplete( "This test requires curl." ); } Http::$httpEngine = "curl"; $this->runHTTPRequests(); } function runHTTPGets( $proxy = null ) { $opt = array(); if ( $proxy ) { $opt['proxy'] = $proxy; } elseif ( $proxy === false ) { $opt['noProxy'] = true; } foreach ( $this->test_geturl as $u ) { $r = Http::get( $u, 30, $opt ); /* timeout of 30s */ $this->assertEquals( self::$content["GET $u"], "$r", "Get $u with " . Http::$httpEngine ); } } function testGetDefault() { Http::$httpEngine = false; $this->runHTTPGets(); } function testGetPhp() { if ( !self::$has_fopen ) { $this->markTestIncomplete( "This test requires allow_url_fopen=true." ); } Http::$httpEngine = "php"; $this->runHTTPGets(); } function testGetCurl() { if ( !self::$has_curl ) { $this->markTestIncomplete( "This test requires curl." ); } Http::$httpEngine = "curl"; $this->runHTTPGets(); } function runHTTPPosts( $proxy = null ) { $opt = array(); if ( $proxy ) { $opt['proxy'] = $proxy; } elseif ( $proxy === false ) { $opt['noProxy'] = true; } foreach ( $this->test_posturl as $u => $postData ) { $opt['postData'] = $postData; $r = Http::post( $u, $opt ); $this->assertEquals( self::$content["POST $u => $postData"], "$r", "POST $u (postData=$postData) with " . Http::$httpEngine ); } } function testPostDefault() { Http::$httpEngine = false; $this->runHTTPPosts(); } function testPostPhp() { if ( !self::$has_fopen ) { $this->markTestIncomplete( "This test requires allow_url_fopen=true." ); } Http::$httpEngine = "php"; $this->runHTTPPosts(); } function testPostCurl() { if ( !self::$has_curl ) { $this->markTestIncomplete( "This test requires curl." ); } Http::$httpEngine = "curl"; $this->runHTTPPosts(); } function runProxyRequests() { if ( !self::$has_proxy ) { $this->markTestIncomplete( "This test requires a proxy." ); } $this->runHTTPGets( self::$proxy ); $this->runHTTPPosts( self::$proxy ); $this->runHTTPRequests( self::$proxy ); // Set false here to do noProxy $this->runHTTPGets( false ); $this->runHTTPPosts( false ); $this->runHTTPRequests( false ); } function testProxyDefault() { Http::$httpEngine = false; $this->runProxyRequests(); } function testProxyPhp() { if ( !self::$has_fopen ) { $this->markTestIncomplete( "This test requires allow_url_fopen=true." ); } Http::$httpEngine = 'php'; $this->runProxyRequests(); } function testProxyCurl() { if ( !self::$has_curl ) { $this->markTestIncomplete( "This test requires curl." ); } Http::$httpEngine = 'curl'; $this->runProxyRequests(); } function testIsLocalUrl() { } /* ./extensions/DonationInterface/payflowpro_gateway/payflowpro_gateway.body.php:559: $user_agent = Http::userAgent(); */ function testUserAgent() { } function testIsValidUrl() { } function testValidateCookieDomain() { $this->assertFalse( Cookie::validateCookieDomain( "co.uk" ) ); $this->assertFalse( Cookie::validateCookieDomain( ".co.uk" ) ); $this->assertFalse( Cookie::validateCookieDomain( "gov.uk" ) ); $this->assertFalse( Cookie::validateCookieDomain( ".gov.uk" ) ); $this->assertTrue( Cookie::validateCookieDomain( "supermarket.uk" ) ); $this->assertFalse( Cookie::validateCookieDomain( "uk" ) ); $this->assertFalse( Cookie::validateCookieDomain( ".uk" ) ); $this->assertFalse( Cookie::validateCookieDomain( "127.0.0." ) ); $this->assertFalse( Cookie::validateCookieDomain( "127." ) ); $this->assertFalse( Cookie::validateCookieDomain( "127.0.0.1." ) ); $this->assertTrue( Cookie::validateCookieDomain( "127.0.0.1" ) ); $this->assertFalse( Cookie::validateCookieDomain( "333.0.0.1" ) ); $this->assertTrue( Cookie::validateCookieDomain( "example.com" ) ); $this->assertFalse( Cookie::validateCookieDomain( "example.com." ) ); $this->assertTrue( Cookie::validateCookieDomain( ".example.com" ) ); $this->assertTrue( Cookie::validateCookieDomain( ".example.com", "www.example.com" ) ); $this->assertFalse( Cookie::validateCookieDomain( "example.com", "www.example.com" ) ); $this->assertTrue( Cookie::validateCookieDomain( "127.0.0.1", "127.0.0.1" ) ); $this->assertFalse( Cookie::validateCookieDomain( "127.0.0.1", "localhost" ) ); } function testSetCooke() { $c = new MockCookie( "name", "value", array( "domain" => "ac.th", "path" => "/path/", ) ); $this->assertFalse( $c->canServeDomain( "ac.th" ) ); $c = new MockCookie( "name", "value", array( "domain" => "example.com", "path" => "/path/", ) ); $this->assertTrue( $c->canServeDomain( "example.com" ) ); $this->assertFalse( $c->canServeDomain( "www.example.com" ) ); $c = new MockCookie( "name", "value", array( "domain" => ".example.com", "path" => "/path/", ) ); $this->assertFalse( $c->canServeDomain( "www.example.net" ) ); $this->assertFalse( $c->canServeDomain( "example.com" ) ); $this->assertTrue( $c->canServeDomain( "www.example.com" ) ); $this->assertFalse( $c->canServePath( "/" ) ); $this->assertFalse( $c->canServePath( "/bogus/path/" ) ); $this->assertFalse( $c->canServePath( "/path" ) ); $this->assertTrue( $c->canServePath( "/path/" ) ); $this->assertTrue( $c->isUnExpired() ); $this->assertEquals( "", $c->serializeToHttpRequest( "/path/", "www.example.net" ) ); $this->assertEquals( "", $c->serializeToHttpRequest( "/", "www.example.com" ) ); $this->assertEquals( "name=value", $c->serializeToHttpRequest( "/path/", "www.example.com" ) ); $c = new MockCookie( "name", "value", array( "domain" => "www.example.com", "path" => "/path/", ) ); $this->assertFalse( $c->canServeDomain( "example.com" ) ); $this->assertFalse( $c->canServeDomain( "www.example.net" ) ); $this->assertTrue( $c->canServeDomain( "www.example.com" ) ); $c = new MockCookie( "name", "value", array( "domain" => ".example.com", "path" => "/path/", "expires" => "-1 day", ) ); $this->assertFalse( $c->isUnExpired() ); $this->assertEquals( "", $c->serializeToHttpRequest( "/path/", "www.example.com" ) ); $c = new MockCookie( "name", "value", array( "domain" => ".example.com", "path" => "/path/", "expires" => "+1 day", ) ); $this->assertTrue( $c->isUnExpired() ); $this->assertEquals( "name=value", $c->serializeToHttpRequest( "/path/", "www.example.com" ) ); } function testCookieJarSetCookie() { $cj = new CookieJar; $cj->setCookie( "name", "value", array( "domain" => ".example.com", "path" => "/path/", ) ); $cj->setCookie( "name2", "value", array( "domain" => ".example.com", "path" => "/path/sub", ) ); $cj->setCookie( "name3", "value", array( "domain" => ".example.com", "path" => "/", ) ); $cj->setCookie( "name4", "value", array( "domain" => ".example.net", "path" => "/path/", ) ); $cj->setCookie( "name5", "value", array( "domain" => ".example.net", "path" => "/path/", "expires" => "-1 day", ) ); $this->assertEquals( "name4=value", $cj->serializeToHttpRequest( "/path/", "www.example.net" ) ); $this->assertEquals( "name3=value", $cj->serializeToHttpRequest( "/", "www.example.com" ) ); $this->assertEquals( "name=value; name3=value", $cj->serializeToHttpRequest( "/path/", "www.example.com" ) ); $cj->setCookie( "name5", "value", array( "domain" => ".example.net", "path" => "/path/", "expires" => "+1 day", ) ); $this->assertEquals( "name4=value; name5=value", $cj->serializeToHttpRequest( "/path/", "www.example.net" ) ); $cj->setCookie( "name4", "value", array( "domain" => ".example.net", "path" => "/path/", "expires" => "-1 day", ) ); $this->assertEquals( "name5=value", $cj->serializeToHttpRequest( "/path/", "www.example.net" ) ); } function testParseResponseHeader() { $cj = new CookieJar; $h[] = "Set-Cookie: name4=value; domain=.example.com; path=/; expires=Mon, 09-Dec-2029 13:46:00 GMT"; $cj->parseCookieResponseHeader( $h[0], "www.example.com" ); $this->assertEquals( "name4=value", $cj->serializeToHttpRequest( "/", "www.example.com" ) ); $h[] = "name4=value2; domain=.example.com; path=/path/; expires=Mon, 09-Dec-2029 13:46:00 GMT"; $cj->parseCookieResponseHeader( $h[1], "www.example.com" ); $this->assertEquals( "", $cj->serializeToHttpRequest( "/", "www.example.com" ) ); $this->assertEquals( "name4=value2", $cj->serializeToHttpRequest( "/path/", "www.example.com" ) ); $h[] = "name5=value3; domain=.example.com; path=/path/; expires=Mon, 09-Dec-2029 13:46:00 GMT"; $cj->parseCookieResponseHeader( $h[2], "www.example.com" ); $this->assertEquals( "name4=value2; name5=value3", $cj->serializeToHttpRequest( "/path/", "www.example.com" ) ); $h[] = "name6=value3; domain=.example.net; path=/path/; expires=Mon, 09-Dec-2029 13:46:00 GMT"; $cj->parseCookieResponseHeader( $h[3], "www.example.com" ); $this->assertEquals( "", $cj->serializeToHttpRequest( "/path/", "www.example.net" ) ); $h[] = "name6=value0; domain=.example.net; path=/path/; expires=Mon, 09-Dec-1999 13:46:00 GMT"; $cj->parseCookieResponseHeader( $h[4], "www.example.net" ); $this->assertEquals( "", $cj->serializeToHttpRequest( "/path/", "www.example.net" ) ); $h[] = "name6=value4; domain=.example.net; path=/path/; expires=Mon, 09-Dec-2029 13:46:00 GMT"; $cj->parseCookieResponseHeader( $h[5], "www.example.net" ); $this->assertEquals( "name6=value4", $cj->serializeToHttpRequest( "/path/", "www.example.net" ) ); } function runCookieRequests() { $r = MWHttpRequest::factory( "http://www.php.net/manual", array( 'followRedirects' => true ) ); $r->execute(); $jar = $r->getCookieJar(); $this->assertThat( $jar, $this->isInstanceOf( 'CookieJar' ) ); if ( $r instanceof PhpHttpRequest && version_compare( '5.1.7', phpversion(), '>' ) ) { $this->markTestSkipped( 'Redirection fails or crashes PHP on 5.1.6 and prior' ); } $serialized = $jar->serializeToHttpRequest( "/search?q=test", "www.php.net" ); $this->assertRegExp( '/\bCOUNTRY=[^=;]+/', $serialized ); $this->assertRegExp( '/\bLAST_LANG=[^=;]+/', $serialized ); $this->assertEquals( '', $jar->serializeToHttpRequest( "/search?q=test", "www.php.com" ) ); } function testCookieRequestDefault() { Http::$httpEngine = false; $this->runCookieRequests(); } function testCookieRequestPhp() { if ( !self::$has_fopen ) { $this->markTestIncomplete( "This test requires allow_url_fopen=true." ); } Http::$httpEngine = 'php'; $this->runCookieRequests(); } function testCookieRequestCurl() { if ( !self::$has_curl ) { $this->markTestIncomplete( "This test requires curl." ); } Http::$httpEngine = 'curl'; $this->runCookieRequests(); } }