From e9f04bedd4d57ffd47d9b6e25041da191aaac1e7 Mon Sep 17 00:00:00 2001
From: Frank Karlitschek <frank@owncloud.org>
Date: Mon, 8 Oct 2012 12:00:29 +0200
Subject: [PATCH] add a sane socket timeout so that the interface stays
 responsive with a slow or not working internet connection

---
 lib/ocsclient.php | 55 ++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 50 insertions(+), 5 deletions(-)

diff --git a/lib/ocsclient.php b/lib/ocsclient.php
index 6428a88367..fc2095f5c1 100644
--- a/lib/ocsclient.php
+++ b/lib/ocsclient.php
@@ -62,7 +62,15 @@ class OC_OCSClient{
 		}
 		$url=OC_OCSClient::getAppStoreURL().'/content/categories';
 
-		$xml=@file_get_contents($url);
+                // set a sensible timeout of 10 sec to stay responsive even if the server is down.
+                $ctx = stream_context_create(
+                        array(
+                                'http' => array(
+                                        'timeout' => 10
+                                )
+                        )
+                );      
+                $xml=@file_get_contents($url, 0, $ctx); 
 		if($xml==FALSE) {
 			return NULL;
 		}
@@ -103,7 +111,17 @@ class OC_OCSClient{
 		$filterurl='&filter='.urlencode($filter);
 		$url=OC_OCSClient::getAppStoreURL().'/content/data?categories='.urlencode($categoriesstring).'&sortmode=new&page='.urlencode($page).'&pagesize=100'.$filterurl.$version;
 		$apps=array();
-		$xml=@file_get_contents($url);
+
+                // set a sensible timeout of 10 sec to stay responsive even if the server is down.
+                $ctx = stream_context_create(
+                        array(
+                                'http' => array(
+                                        'timeout' => 10
+                                )
+                        )
+                );      
+                $xml=@file_get_contents($url, 0, $ctx);
+
 		if($xml==FALSE) {
 			return NULL;
 		}
@@ -141,7 +159,15 @@ class OC_OCSClient{
 		}
 		$url=OC_OCSClient::getAppStoreURL().'/content/data/'.urlencode($id);
 
-		$xml=@file_get_contents($url);
+                // set a sensible timeout of 10 sec to stay responsive even if the server is down.
+                $ctx = stream_context_create(
+                        array(
+                                'http' => array(
+                                        'timeout' => 10
+                                )
+                        )
+                );      
+                $xml=@file_get_contents($url, 0, $ctx);
 		if($xml==FALSE) {
 			OC_Log::write('core','Unable to parse OCS content',OC_Log::FATAL);
 			return NULL;
@@ -178,7 +204,16 @@ class OC_OCSClient{
 		}
 		$url=OC_OCSClient::getAppStoreURL().'/content/download/'.urlencode($id).'/'.urlencode($item);
 
-		$xml=@file_get_contents($url);
+                // set a sensible timeout of 10 sec to stay responsive even if the server is down.
+                $ctx = stream_context_create(
+                        array(
+                                'http' => array(
+                                        'timeout' => 10
+                                )
+                        )
+                );      
+                $xml=@file_get_contents($url, 0, $ctx);
+
 		if($xml==FALSE) {
 			OC_Log::write('core','Unable to parse OCS content',OC_Log::FATAL);
 			return NULL;
@@ -215,7 +250,17 @@ class OC_OCSClient{
 		$url=OC_OCSClient::getKBURL().'/knowledgebase/data?type=150&page='.$p.'&pagesize='.$s.$searchcmd;
 
 		$kbe=array();
-		$xml=@file_get_contents($url);
+
+                // set a sensible timeout of 10 sec to stay responsive even if the server is down.
+                $ctx = stream_context_create(
+                        array(
+                                'http' => array(
+                                        'timeout' => 10
+                                )
+                        )
+                );      
+                $xml=@file_get_contents($url, 0, $ctx);
+
 		if($xml==FALSE) {
 			OC_Log::write('core','Unable to parse knowledgebase content',OC_Log::FATAL);
 			return NULL;
-- 
GitLab