diff --git a/lib/filelib.php b/lib/filelib.php index b90f4063db2..bf8a5d957e2 100644 --- a/lib/filelib.php +++ b/lib/filelib.php @@ -3759,6 +3759,16 @@ class curl { return $this->error; } + // If the response body is written to a seekable stream resource, reset the stream pointer to avoid + // appending multiple response bodies to the same resource. + if (!empty($this->options['CURLOPT_FILE'])) { + $streammetadata = stream_get_meta_data($this->options['CURLOPT_FILE']); + if ($streammetadata['seekable']) { + ftruncate($this->options['CURLOPT_FILE'], 0); + rewind($this->options['CURLOPT_FILE']); + } + } + curl_setopt($curl, CURLOPT_URL, $redirecturl); $ret = curl_exec($curl); diff --git a/lib/tests/filelib_test.php b/lib/tests/filelib_test.php index 8b2cb5ea182..3c23cdfd51f 100644 --- a/lib/tests/filelib_test.php +++ b/lib/tests/filelib_test.php @@ -145,6 +145,9 @@ class core_filelib_testcase extends advanced_testcase { $contents = download_file_content("$testurl?redir=2"); $this->assertSame('done', $contents); + $contents = download_file_content("$testurl?redir=2&verbose=1"); + $this->assertSame('done', $contents); + $response = download_file_content("$testurl?redir=2", null, null, true); $this->assertInstanceOf('stdClass', $response); $this->assertSame('200', $response->status); @@ -153,6 +156,14 @@ class core_filelib_testcase extends advanced_testcase { $this->assertSame('done', $response->results); $this->assertSame('', $response->error); + $response = download_file_content("$testurl?redir=2&verbose=1", null, null, true); + $this->assertInstanceOf('stdClass', $response); + $this->assertSame('200', $response->status); + $this->assertTrue(is_array($response->headers)); + $this->assertMatchesRegularExpression('|^HTTP/1\.[01] 200 OK$|', rtrim($response->response_code)); + $this->assertSame('done', $response->results); + $this->assertSame('', $response->error); + // Commented out this block if there are performance problems. /* $contents = download_file_content("$testurl?redir=6"); @@ -327,6 +338,17 @@ class core_filelib_testcase extends advanced_testcase { $this->assertSame('done', file_get_contents($tofile)); @unlink($tofile); + $curl = new curl(); + $tofile = "$CFG->tempdir/test.html"; + @unlink($tofile); + $fp = fopen($tofile, 'w'); + $result = $curl->get("$testurl?redir=1&verbose=1", array(), array('CURLOPT_FILE' => $fp)); + $this->assertTrue($result); + fclose($fp); + $this->assertFileExists($tofile); + $this->assertSame('done', file_get_contents($tofile)); + @unlink($tofile); + $curl = new curl(); $tofile = "$CFG->tempdir/test.html"; @unlink($tofile); @@ -335,6 +357,15 @@ class core_filelib_testcase extends advanced_testcase { $this->assertFileExists($tofile); $this->assertSame('done', file_get_contents($tofile)); @unlink($tofile); + + $curl = new curl(); + $tofile = "$CFG->tempdir/test.html"; + @unlink($tofile); + $result = $curl->download_one("$testurl?redir=1&verbose=1", array(), array('filepath' => $tofile)); + $this->assertTrue($result); + $this->assertFileExists($tofile); + $this->assertSame('done', file_get_contents($tofile)); + @unlink($tofile); } /**