}
/**
- * Test curl class.
+ * Test curl basics.
*/
- public function test_curl_class() {
+ public function test_curl_basics() {
global $CFG;
- // Test https success.
+ // Test HTTP success.
$testhtml = $this->getExternalTestFileUrl('/test.html');
$curl = new curl();
$this->assertSame($contents, file_get_contents($tofile));
@unlink($tofile);
+ // Test 404 request.
+ $curl = new curl();
+ $contents = $curl->get($this->getExternalTestFileUrl('/i.do.not.exist'));
+ $response = $curl->getResponse();
+ $this->assertSame('404 Not Found', reset($response));
+ $this->assertSame(0, $curl->get_errno());
+ }
+
+ public function test_curl_redirects() {
+ global $CFG;
+
// Test full URL redirects.
$testurl = $this->getExternalTestFileUrl('/test_redir.php');
$curl = new curl();
$contents = $curl->get("$testurl?redir=2", array(), array('CURLOPT_MAXREDIRS'=>2));
+ $response = $curl->getResponse();
+ $this->assertSame('200 OK', reset($response));
$this->assertSame(0, $curl->get_errno());
$this->assertSame(2, $curl->info['redirect_count']);
$this->assertSame('done', $contents);
$curl = new curl();
$curl->emulateredirects = true;
$contents = $curl->get("$testurl?redir=2", array(), array('CURLOPT_MAXREDIRS'=>2));
+ $response = $curl->getResponse();
+ $this->assertSame('200 OK', reset($response));
$this->assertSame(0, $curl->get_errno());
$this->assertSame(2, $curl->info['redirect_count']);
$this->assertSame('done', $contents);
$curl = new curl();
$contents = $curl->get("$testurl?redir=3", array(), array('CURLOPT_FOLLOWLOCATION'=>0));
+ $response = $curl->getResponse();
+ $this->assertSame('302 Found', reset($response));
$this->assertSame(0, $curl->get_errno());
$this->assertSame(302, $curl->info['http_code']);
$this->assertSame('', $contents);
$curl = new curl();
$curl->emulateredirects = true;
$contents = $curl->get("$testurl?redir=3", array(), array('CURLOPT_FOLLOWLOCATION'=>0));
+ $response = $curl->getResponse();
+ $this->assertSame('302 Found', reset($response));
$this->assertSame(0, $curl->get_errno());
$this->assertSame(302, $curl->info['http_code']);
$this->assertSame('', $contents);
$this->assertFileExists($tofile);
$this->assertSame('done', file_get_contents($tofile));
@unlink($tofile);
+ }
+ public function test_curl_relative_redirects() {
// Test relative location redirects.
$testurl = $this->getExternalTestFileUrl('/test_relative_redir.php');
$curl = new curl();
$contents = $curl->get($testurl);
+ $response = $curl->getResponse();
+ $this->assertSame('200 OK', reset($response));
$this->assertSame(0, $curl->get_errno());
$this->assertSame(1, $curl->info['redirect_count']);
$this->assertSame('done', $contents);
$curl = new curl();
$curl->emulateredirects = true;
$contents = $curl->get($testurl);
+ $response = $curl->getResponse();
+ $this->assertSame('200 OK', reset($response));
$this->assertSame(0, $curl->get_errno());
$this->assertSame(1, $curl->info['redirect_count']);
$this->assertSame('done', $contents);
$curl = new curl();
$contents = $curl->get("$testurl?type=301");
+ $response = $curl->getResponse();
+ $this->assertSame('200 OK', reset($response));
$this->assertSame(0, $curl->get_errno());
$this->assertSame(1, $curl->info['redirect_count']);
$this->assertSame('done', $contents);
$curl = new curl();
$curl->emulateredirects = true;
$contents = $curl->get("$testurl?type=301");
+ $response = $curl->getResponse();
+ $this->assertSame('200 OK', reset($response));
$this->assertSame(0, $curl->get_errno());
$this->assertSame(1, $curl->info['redirect_count']);
$this->assertSame('done', $contents);
$curl = new curl();
$contents = $curl->get("$testurl?type=302");
+ $response = $curl->getResponse();
+ $this->assertSame('200 OK', reset($response));
$this->assertSame(0, $curl->get_errno());
$this->assertSame(1, $curl->info['redirect_count']);
$this->assertSame('done', $contents);
$curl = new curl();
$curl->emulateredirects = true;
$contents = $curl->get("$testurl?type=302");
+ $response = $curl->getResponse();
+ $this->assertSame('200 OK', reset($response));
$this->assertSame(0, $curl->get_errno());
$this->assertSame(1, $curl->info['redirect_count']);
$this->assertSame('done', $contents);
$curl = new curl();
$contents = $curl->get("$testurl?type=303");
+ $response = $curl->getResponse();
+ $this->assertSame('200 OK', reset($response));
$this->assertSame(0, $curl->get_errno());
$this->assertSame(1, $curl->info['redirect_count']);
$this->assertSame('done', $contents);
$curl = new curl();
$curl->emulateredirects = true;
$contents = $curl->get("$testurl?type=303");
+ $response = $curl->getResponse();
+ $this->assertSame('200 OK', reset($response));
$this->assertSame(0, $curl->get_errno());
$this->assertSame(1, $curl->info['redirect_count']);
$this->assertSame('done', $contents);
$curl = new curl();
$contents = $curl->get("$testurl?type=307");
+ $response = $curl->getResponse();
+ $this->assertSame('200 OK', reset($response));
$this->assertSame(0, $curl->get_errno());
$this->assertSame(1, $curl->info['redirect_count']);
$this->assertSame('done', $contents);
$curl = new curl();
$curl->emulateredirects = true;
$contents = $curl->get("$testurl?type=307");
+ $response = $curl->getResponse();
+ $this->assertSame('200 OK', reset($response));
$this->assertSame(0, $curl->get_errno());
$this->assertSame(1, $curl->info['redirect_count']);
$this->assertSame('done', $contents);
$curl = new curl();
$contents = $curl->get("$testurl?type=308");
+ $response = $curl->getResponse();
+ $this->assertSame('200 OK', reset($response));
$this->assertSame(0, $curl->get_errno());
$this->assertSame(1, $curl->info['redirect_count']);
$this->assertSame('done', $contents);
$curl = new curl();
$curl->emulateredirects = true;
$contents = $curl->get("$testurl?type=308");
+ $response = $curl->getResponse();
+ $this->assertSame('200 OK', reset($response));
$this->assertSame(0, $curl->get_errno());
$this->assertSame(1, $curl->info['redirect_count']);
$this->assertSame('done', $contents);
+ }
+
+ public function test_curl_proxybypass() {
+ global $CFG;
+ $testurl = $this->getExternalTestFileUrl('/test.html');
+
$oldproxy = $CFG->proxyhost;
$oldproxybypass = $CFG->proxybypass;
$CFG->proxyhost = 'i.do.not.exist';
$CFG->proxybypass = '';
$curl = new curl();
- $contents = $curl->get($testhtml);
+ $contents = $curl->get($testurl);
$this->assertNotEquals(0, $curl->get_errno());
$this->assertNotEquals('47250a973d1b88d9445f94db4ef2c97a', md5($contents));
// Test with proxy bypass.
- $testhtmlhost = parse_url($testhtml, PHP_URL_HOST);
- $CFG->proxybypass = $testhtmlhost;
+ $testurlhost = parse_url($testurl, PHP_URL_HOST);
+ $CFG->proxybypass = $testurlhost;
$curl = new curl();
- $contents = $curl->get($testhtml);
+ $contents = $curl->get($testurl);
$this->assertSame(0, $curl->get_errno());
$this->assertSame('47250a973d1b88d9445f94db4ef2c97a', md5($contents));
$CFG->proxybypass = $oldproxybypass;
}
+ public function test_curl_post() {
+ $testurl = $this->getExternalTestFileUrl('/test_post.php');
+
+ // Test post request.
+ $curl = new curl();
+ $contents = $curl->post($testurl, 'data=moodletest');
+ $response = $curl->getResponse();
+ $this->assertSame('200 OK', reset($response));
+ $this->assertSame(0, $curl->get_errno());
+ $this->assertSame('OK', $contents);
+
+ // Test 100 requests.
+ $curl = new curl();
+ $curl->setHeader('Expect: 100-continue');
+ $contents = $curl->post($testurl, 'data=moodletest');
+ $response = $curl->getResponse();
+ $this->assertSame('200 OK', reset($response));
+ $this->assertSame(0, $curl->get_errno());
+ $this->assertSame('OK', $contents);
+ }
+
/**
* Testing prepare draft area
*