From e4bbb2277e44d7ca2cc1ed4bd0d7804bfb587b41 Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Sun, 24 Apr 2016 21:01:44 +0200 Subject: [PATCH] Backport of #246 Improve encoding detection adjust unit test --- controller/lib/bookmarks.php | 11 ++++++-- tests/lib_bookmark_test.php | 55 +++++++++++++++++++++++++++--------- 2 files changed, 49 insertions(+), 17 deletions(-) diff --git a/controller/lib/bookmarks.php b/controller/lib/bookmarks.php index d58ab1d1..f3283939 100644 --- a/controller/lib/bookmarks.php +++ b/controller/lib/bookmarks.php @@ -553,7 +553,9 @@ class Bookmarks { $page = ""; try { - $page = \OC::$server->getHTTPHelper()->getUrlContent($url); + $request = \OC::$server->getHTTPClientService()->newClient()->get($url); + $page = $request->getBody(); + $contentType = $request->getHeader('Content-Type'); } catch (\Exception $e) { throw $e; } @@ -561,8 +563,11 @@ class Bookmarks { //Check for encoding of site. //If not UTF-8 convert it. $encoding = array(); - preg_match('/charset="?(.*?)["|;]/i', $page, $encoding); - + preg_match('#.+?/.+?;\\s?charset\\s?=\\s?(.+)#i', $contentType, $encoding); + if(empty($encoding)) { + preg_match('/charset="?(.*?)["|;]/i', $page, $encoding); + } + if (isset($encoding[1])) { $decodeFrom = strtoupper($encoding[1]); } else { diff --git a/tests/lib_bookmark_test.php b/tests/lib_bookmark_test.php index 0135b043..66f30236 100644 --- a/tests/lib_bookmark_test.php +++ b/tests/lib_bookmark_test.php @@ -96,14 +96,41 @@ class Test_LibBookmarks_Bookmarks extends PHPUnit_Framework_TestCase { $config = $this->getMockBuilder('\OCP\IConfig') ->disableOriginalConstructor()->getMock(); - $clientService = $this->getMock('OCP\Http\Client\IClientService'); - $httpHelperMock = $this->getMockBuilder('\OC\HTTPHelper') - ->setConstructorArgs(array($config, $clientService)) - ->getMock(); - $returnAmazonDe = file_get_contents(__DIR__ . '/res/amazonHtml.file'); - $returnGolemDe = file_get_contents(__DIR__ . '/res/golemHtml.file'); - $httpHelperMock->expects($this->any())->method('getUrlContent')->with($this->anything())->will($this->onConsecutiveCalls($returnAmazonDe, $returnGolemDe)); - $this->registerHttpHelper($httpHelperMock); + $amazonResponse = $this->getMock('OCP\Http\Client\IResponse'); + $amazonResponse->expects($this->once()) + ->method('getBody') + ->will($this->returnValue(file_get_contents(__DIR__ . '/res/amazonHtml.file'))); + $amazonResponse->expects($this->once()) + ->method('getHeader') + ->with('Content-Type') + ->will($this->returnValue('')); + + $golemResponse = $this->getMock('OCP\Http\Client\IResponse'); + $golemResponse->expects($this->once()) + ->method('getBody') + ->will($this->returnValue(file_get_contents(__DIR__ . '/res/golemHtml.file'))); + $golemResponse->expects($this->once()) + ->method('getHeader') + ->with('Content-Type') + ->will($this->returnValue('text/html; charset=UTF-8')); + + $clientMock = $this->getMock('OCP\Http\Client\IClient'); + $clientMock->expects($this->exactly(2)) + ->method('get') + ->will($this->returnCallback(function ($page) use($amazonResponse, $golemResponse) { + if($page === 'amazonHtml') { + return $amazonResponse; + } else if($page === 'golemHtml') { + return $golemResponse; + } + })); + + $clientServiceMock = $this->getMock('OCP\Http\Client\IClientService'); + $clientServiceMock->expects($this->any()) + ->method('newClient') + ->will($this->returnValue($clientMock)); + + $this->registerHttpService($clientServiceMock); $metadataAmazon = Bookmarks::getURLMetadata('amazonHtml'); $this->assertTrue($metadataAmazon['url'] == 'amazonHtml'); @@ -126,13 +153,13 @@ class Test_LibBookmarks_Bookmarks extends PHPUnit_Framework_TestCase { } /** - * Register an http helper mock for testing purposes. - * @param $httpHelper http helper mock + * Register an http service mock for testing purposes. + * + * @param \OCP\Http\Client\IClientService $service */ - private function registerHttpHelper($httpHelper) { - $this->oldHttpHelper = \OC::$server->query('HTTPHelper'); - \OC::$server->registerService('HTTPHelper', function () use ($httpHelper) { - return $httpHelper; + private function registerHttpService($service) { + \OC::$server->registerService('HttpClientService', function () use ($service) { + return $service; }); }