def connect(self, host, port, scheme='http', timeout=None): if timeout is not None: # this parameter is deprecated self.timeout = None if self.client and not self.client.is_closed(): self.client.close() if scheme == 'http': self.client = Client() elif scheme == 'https': self.client = SSLClient() else: raise HttpException('unsupported url scheme %s' % scheme) self.scheme = scheme self.host = host self.port = port self.client.timeout = self._timeout yield self.client.connect(self.host, self.port)
class HttpClient(object): DEFAULT_PORTS = {'http': 80, 'https': 443} def __init__(self): self.client = None self.scheme = None self.host = None self.port = None self._timeout = None @property def timeout(self): return self._timeout @timeout.setter def timeout(self, value): self._timeout = value if self.client: self.client.timeout = value @_o def connect(self, host, port, scheme='http', timeout=None): if timeout is not None: # this parameter is deprecated self.timeout = None if self.client and not self.client.is_closed(): self.client.close() if scheme == 'http': self.client = Client() elif scheme == 'https': self.client = SSLClient() else: raise HttpException('unsupported url scheme %s' % scheme) self.scheme = scheme self.host = host self.port = port self.client.timeout = self._timeout yield self.client.connect(self.host, self.port) @_o def request(self, url, headers=None, method='GET', body=None): parts = urlparse.urlsplit(url) scheme = parts.scheme or self.scheme if parts.scheme and parts.scheme not in ['http', 'https']: raise HttpException('unsupported url scheme %s' % parts.scheme) host = parts.hostname or self.host path = parts.path if parts.query: path += '?' + parts.query if scheme != self.scheme: raise HttpException("URL is %s but connection is %s" % (scheme, self.scheme)) if not headers: headers = HttpHeaders() headers.setdefault('User-Agent', 'monocle/%s' % VERSION) headers.setdefault('Host', host) if body is not None: headers['Content-Length'] = str(len(body)) yield write_request(self.client, method, path, headers, body) response = yield read_response(self.client) yield Return(response) def close(self): self.client.close() def is_closed(self): return self.client is None or self.client.is_closed() @classmethod @_o def query(cls, url, headers=None, method='GET', body=None): self = cls() parts = urlparse.urlsplit(url) host = parts.hostname port = parts.port or self.DEFAULT_PORTS[parts.scheme] if not self.client or self.client.is_closed(): yield self.connect(host, port, scheme=parts.scheme) elif not (self.host, self.port) == (host, port): self.client.close() yield self.connect(host, port, scheme=parts.scheme) result = yield self.request(url, headers, method, body) self.close() yield Return(result)