From 1033633c5d16a737f3f465f648448ff6cb3f2256 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pavel=20K=C3=A1cha?= <ph@cesnet.cz>
Date: Wed, 18 Feb 2015 11:00:01 +0100
Subject: [PATCH] - Apache times out connection, but httplib does not signal
 that   consistently. Possible keeping and reopening where possible will need
 more   work and testing, I'm not keen to try to clench in now. So - changed
 to   reopening connection each time, which will possibly affect performance
 (on   small queries). - Both server and client library now defaults to
 get_events_limit instead of 1

---
 warden3/warden_client/warden_client.py | 41 ++++++++++++++++----------
 warden3/warden_server/warden_server.py |  2 +-
 2 files changed, 26 insertions(+), 17 deletions(-)

diff --git a/warden3/warden_client/warden_client.py b/warden3/warden_client/warden_client.py
index d01d347..b1a9951 100644
--- a/warden3/warden_client/warden_client.py
+++ b/warden3/warden_client/warden_client.py
@@ -226,8 +226,9 @@ class Client(object):
 
         try:
             if self.url.scheme=="https":
-                self.conn = HTTPSConnection(
+                conn = HTTPSConnection(
                     self.url.netloc,
+                    strict = False,
                     key_file = self.keyfile,
                     cert_file = self.certfile,
                     timeout = self.timeout,
@@ -235,8 +236,9 @@ class Client(object):
                     ca_certs = self.cafile,
                     ssl_version = self.sslversion)
             elif self.url.scheme=="http":
-                self.conn = httplib.HTTPConnection(
+                conn = httplib.HTTPConnection(
                     self.url.netloc,
+                    strict = False,
                     timeout = self.timeout)
             else:
                 return Error("Don't know how to connect to \"%s\"" % self.url.scheme, self.logger,
@@ -252,7 +254,7 @@ class Client(object):
                     "ciphers": self.ciphers,
                     "ssl_version": self.sslversion})
 
-        return True
+        return conn
 
 
     def sendRequest(self, func="", payload=None, **kwargs):
@@ -285,19 +287,16 @@ class Client(object):
             "Content-Length": str(len(data))
         }
 
-        # We are connecting here at first use instead of in
-        # constructor, because constructor cannot return data/errors
-        # and we don't want to spit exceptions into user's face
-        # And maaaybee sometime we will implement reconnection on errors
-        if self.conn is None:
-            err = self.connect()
-            if not err:
-                return err  # either False of Error instance
+        # HTTP(S)Connection is oneshot object (and we don't speak "pipelining")
+        conn = self.connect()
+        if not conn:
+            return conn  # either False of Error instance
 
         loc = '%s/%s%s' % (self.url.path, func, argurl)
         try:
-            self.conn.request("POST", loc, data, self.headers)
+            conn.request("POST", loc, data, self.headers)
         except:
+            conn.close()
             return Error("Sending of request to server failed", self.logger,
                 exc=exc_info(), method=func, detail={
                     "loc": loc,
@@ -305,14 +304,24 @@ class Client(object):
                     "data": data})
 
         try:
-            res = self.conn.getresponse()
+            res = conn.getresponse()
         except:
-            return Error("HTTP reply failed", self.logger, method=func, exc=exc_info())
+            conn.close()
+            return Error("HTTP reply failed", self.logger, method=func, exc=exc_info(), detail={
+                "loc": loc,
+                "headers": self.headers,
+                "data": data})
 
         try:
             response_data = res.read()
         except:
-            return Error("Fetching HTTP data from server failed", self.logger, method=func, exc=exc_info())
+            conn.close()
+            return Error("Fetching HTTP data from server failed", self.logger, method=func, exc=exc_info(), detail={
+                "loc": loc,
+                "headers": self.headers,
+                "data": data})
+
+        conn.close()
 
         if res.status==httplib.OK:
             try:
@@ -382,7 +391,7 @@ class Client(object):
         return res
 
 
-    def getEvents(self, id=None, idstore=None, count=1,
+    def getEvents(self, id=None, idstore=None, count=None,
             cat=None, nocat=None,
             tag=None, notag=None,
             group=None, nogroup=None):
diff --git a/warden3/warden_server/warden_server.py b/warden3/warden_server/warden_server.py
index 5cff2b0..1caa425 100755
--- a/warden3/warden_server/warden_server.py
+++ b/warden3/warden_server/warden_server.py
@@ -794,7 +794,7 @@ class WardenHandler(ObjectReq):
         try:
             count = int(count[0])
         except (ValueError, TypeError, IndexError):
-            count = 1
+            count = self.get_events_limit
 
         if self.get_events_limit:
             count = min(count, self.get_events_limit)
-- 
GitLab