From dff361dc5ce4501396974785b2be22287b15b895 Mon Sep 17 00:00:00 2001
From: Lukas Reschke <lukas@owncloud.com>
Date: Tue, 26 May 2015 11:22:50 +0200
Subject: [PATCH] Add connection timeout to default POST options

Fixes https://github.com/owncloud/core/issues/16560
---
 lib/private/httphelper.php |  8 +++-
 tests/lib/httphelper.php   | 75 +++++++++++++++++++++++++++++++++++++-
 2 files changed, 80 insertions(+), 3 deletions(-)

diff --git a/lib/private/httphelper.php b/lib/private/httphelper.php
index f7984a72ebb..9d9edb6a351 100644
--- a/lib/private/httphelper.php
+++ b/lib/private/httphelper.php
@@ -102,7 +102,13 @@ class HTTPHelper {
 		$client = $this->clientService->newClient();
 
 		try {
-			$response = $client->post($url, ['body' => $fields]);
+			$response = $client->post(
+				$url,
+				[
+					'body' => $fields,
+					'connect_timeout' => 10,
+				]
+			);
 		} catch (\Exception $e) {
 			return ['success' => false, 'result' => $e->getMessage()];
 		}
diff --git a/tests/lib/httphelper.php b/tests/lib/httphelper.php
index e8472ab553a..1d0981ba51b 100644
--- a/tests/lib/httphelper.php
+++ b/tests/lib/httphelper.php
@@ -12,15 +12,17 @@ class TestHTTPHelper extends \Test\TestCase {
 	private $config;
 	/** @var \OC\HTTPHelper */
 	private $httpHelperMock;
+	/** @var \OCP\Http\Client\IClientService */
+	private $clientService;
 
 	protected function setUp() {
 		parent::setUp();
 
 		$this->config = $this->getMockBuilder('\OCP\IConfig')
 			->disableOriginalConstructor()->getMock();
-		$clientService = $this->getMock('\OCP\Http\Client\IClientService');
+		$this->clientService = $this->getMock('\OCP\Http\Client\IClientService');
 		$this->httpHelperMock = $this->getMockBuilder('\OC\HTTPHelper')
-			->setConstructorArgs(array($this->config, $clientService))
+			->setConstructorArgs(array($this->config, $this->clientService))
 			->setMethods(array('getHeaders'))
 			->getMock();
 	}
@@ -44,4 +46,73 @@ class TestHTTPHelper extends \Test\TestCase {
 	public function testIsHTTP($url, $expected) {
 			$this->assertSame($expected, $this->httpHelperMock->isHTTPURL($url));
 	}
+
+	public function testPostSuccess() {
+		$client = $this->getMockBuilder('\OCP\Http\Client\IClient')
+			->disableOriginalConstructor()->getMock();
+		$this->clientService
+			->expects($this->once())
+			->method('newClient')
+			->will($this->returnValue($client));
+		$response = $this->getMockBuilder('\OCP\Http\Client\IResponse')
+			->disableOriginalConstructor()->getMock();
+		$client
+			->expects($this->once())
+			->method('post')
+			->with(
+				'https://owncloud.org',
+				[
+					'body' => [
+						'Foo' => 'Bar',
+					],
+					'connect_timeout' => 10,
+
+				]
+			)
+			->will($this->returnValue($response));
+		$response
+			->expects($this->once())
+			->method('getBody')
+			->will($this->returnValue('Body of the requested page'));
+
+
+		$response = $this->httpHelperMock->post('https://owncloud.org', ['Foo' => 'Bar']);
+		$expected = [
+			'success' => true,
+			'result' => 'Body of the requested page'
+		];
+		$this->assertSame($expected, $response);
+	}
+
+	public function testPostException() {
+		$client = $this->getMockBuilder('\OCP\Http\Client\IClient')
+			->disableOriginalConstructor()->getMock();
+		$this->clientService
+			->expects($this->once())
+			->method('newClient')
+			->will($this->returnValue($client));
+		$client
+			->expects($this->once())
+			->method('post')
+			->with(
+				'https://owncloud.org',
+				[
+					'body' => [
+						'Foo' => 'Bar',
+					],
+					'connect_timeout' => 10,
+
+				]
+			)
+			->will($this->throwException(new \Exception('Something failed')));
+
+
+		$response = $this->httpHelperMock->post('https://owncloud.org', ['Foo' => 'Bar']);
+		$expected = [
+			'success' => false,
+			'result' => 'Something failed'
+		];
+		$this->assertSame($expected, $response);
+	}
+
 }
-- 
GitLab