from ganeti import workerpool
from ganeti import http
+from ganeti import utils
HTTP_CLIENT_THREADS = 10
class HttpClientRequest(object):
def __init__(self, host, port, method, path, headers=None, post_data=None,
- ssl_params=None, ssl_verify_peer=False):
+ ssl_params=None, ssl_verify_peer=False, read_timeout=None):
"""Describes an HTTP request.
@type host: string
@type ssl_verify_peer: bool
@param ssl_verify_peer: Whether to compare our certificate with
server's certificate
+ @type read_timeout: int
+ @param read_timeout: if passed, it will be used as the read
+ timeout while reading the response from the server
"""
if post_data is not None:
self.path = path
self.headers = headers
self.post_data = post_data
+ self.read_timeout = read_timeout
self.success = None
self.error = None
self.resp_headers = None
self.resp_body = None
+ def __repr__(self):
+ status = ["%s.%s" % (self.__class__.__module__, self.__class__.__name__),
+ "%s:%s" % (self.host, self.port),
+ self.method,
+ self.path]
+
+ return "<%s at %#x>" % (" ".join(status), id(self))
+
class _HttpClientToServerMessageWriter(http.HttpMessageWriter):
pass
status = int(status)
if status < 100 or status > 999:
status = -1
- except ValueError:
+ except (TypeError, ValueError):
status = -1
if status == -1:
if not connected:
# Wait for connection
- event = http.WaitForSocketCondition(self.sock, select.POLLOUT,
- self.CONNECT_TIMEOUT)
+ event = utils.WaitForFdCondition(self.sock, select.POLLOUT,
+ self.CONNECT_TIMEOUT)
if event is None:
raise http.HttpError("Timeout while connecting to server")
"""
response_msg = http.HttpMessage()
+ if self.request.read_timeout is None:
+ timeout = self.READ_TIMEOUT
+ else:
+ timeout = self.request.read_timeout
+
try:
response_msg_reader = \
- _HttpServerToClientMessageReader(self.sock, response_msg,
- self.READ_TIMEOUT)
+ _HttpServerToClientMessageReader(self.sock, response_msg, timeout)
except http.HttpSocketTimeout:
raise http.HttpError("Timeout while reading response")
except socket.error, err:
# Thread synchronization
self.done = threading.Event()
+ def __repr__(self):
+ status = ["%s.%s" % (self.__class__.__module__, self.__class__.__name__),
+ "req=%r" % self.request]
+
+ return "<%s at %#x>" % (" ".join(status), id(self))
+
class HttpClientWorker(workerpool.BaseWorker):
"""HTTP client worker class.