[svn r20] Refactor the httpc API to return more information.
Reviewed by Ryan.
This commit is contained in:
@@ -31,7 +31,7 @@ import time
|
||||
import urlparse
|
||||
|
||||
|
||||
#from mx.DateTime import Parser
|
||||
from mx.DateTime import Parser
|
||||
|
||||
|
||||
_old_HTTPConnection = httplib.HTTPConnection
|
||||
@@ -113,6 +113,7 @@ class FileScheme(object):
|
||||
|
||||
def request(self, method, fullpath, body='', headers=None):
|
||||
self.status = 200
|
||||
self.msg = ''
|
||||
self.path = fullpath.split('?')[0]
|
||||
self.method = method = method.lower()
|
||||
assert method in ('get', 'put', 'delete')
|
||||
@@ -280,22 +281,7 @@ def connect(url, use_proxy=False):
|
||||
return make_connection(scheme, location, use_proxy)
|
||||
|
||||
|
||||
def make_safe_loader(loader):
|
||||
def safe_loader(what):
|
||||
try:
|
||||
return loader(what)
|
||||
except Exception, e:
|
||||
return None
|
||||
return safe_loader
|
||||
|
||||
|
||||
class HttpSuite(object):
|
||||
def __init__(self, dumper, loader, fallback_content_type):
|
||||
self.dumper = dumper
|
||||
self.loader = loader
|
||||
self.fallback_content_type = fallback_content_type
|
||||
|
||||
def request(self, connection, method, url, body='', headers=None, dumper=None, loader=None, use_proxy=False, verbose=False, ok=None, **kwargs):
|
||||
def request_(connection, method, url, body='', headers=None, dumper=None, loader=None, use_proxy=False, ok=None):
|
||||
"""Make an http request to a url, for internal use mostly.
|
||||
|
||||
@param connection The connection (as returned by make_connection) to use for the request.
|
||||
@@ -306,7 +292,6 @@ class HttpSuite(object):
|
||||
@param dumper Method that formats the body as a string.
|
||||
@param loader Method that converts the response body into an object.
|
||||
@param use_proxy Set to True if the connection is to a proxy.
|
||||
@param verbose Set to true to change the return value of the function to: status, status_message, body
|
||||
@param ok Set of valid response statuses. If the returned status is not in this list, an exception is thrown.
|
||||
"""
|
||||
if ok is None:
|
||||
@@ -331,19 +316,6 @@ class HttpSuite(object):
|
||||
else:
|
||||
body = ''
|
||||
|
||||
response, body = self._get_response_body(connection, method, url, body, headers, ok, **kwargs)
|
||||
|
||||
if loader is not None:
|
||||
try:
|
||||
body = loader(body)
|
||||
except Exception, e:
|
||||
raise UnparseableResponse(loader, body)
|
||||
|
||||
if verbose:
|
||||
return response.status, response.msg, body
|
||||
return body
|
||||
|
||||
def _get_response_body(self, connection, method, url, body, headers, ok, **kwargs):
|
||||
connection.request(method, url, body, headers)
|
||||
response = connection.getresponse()
|
||||
if (response.status not in ok):
|
||||
@@ -353,43 +325,86 @@ class HttpSuite(object):
|
||||
connection.path, response.status, response.reason, response.read())
|
||||
|
||||
body = response.read()
|
||||
return response, body
|
||||
|
||||
def head(self, url, headers=None, use_proxy=False, verbose=False, ok=None, **kwargs):
|
||||
if headers is None:
|
||||
headers = {}
|
||||
connection = connect(url)
|
||||
return self.request(connection, 'HEAD', url, '', headers, None, None, use_proxy, verbose, ok, **kwargs)
|
||||
if loader is not None:
|
||||
try:
|
||||
body = loader(body)
|
||||
except Exception, e:
|
||||
raise UnparseableResponse(loader, body)
|
||||
|
||||
def get(self, url, headers=None, use_proxy=False, verbose=False, ok=None, **kwargs):
|
||||
return response.status, response.msg, body
|
||||
|
||||
def request(*args, **kwargs):
|
||||
return request_(*args, **kwargs)[-1]
|
||||
|
||||
def make_safe_loader(loader):
|
||||
def safe_loader(what):
|
||||
try:
|
||||
return loader(what)
|
||||
except Exception, e:
|
||||
return None
|
||||
return safe_loader
|
||||
|
||||
|
||||
class HttpSuite(object):
|
||||
def __init__(self, dumper, loader, fallback_content_type):
|
||||
self.dumper = dumper
|
||||
self.loader = loader
|
||||
self.fallback_content_type = fallback_content_type
|
||||
|
||||
def head_(self, url, headers=None, use_proxy=False, ok=None):
|
||||
return request_(connect(url, use_proxy), method='HEAD', url=url,
|
||||
body='', headers=headers, use_proxy=use_proxy,
|
||||
ok=ok)
|
||||
|
||||
def head(self, *args, **kwargs):
|
||||
return self.head_(*args, **kwargs)[-1]
|
||||
|
||||
def get_(self, url, headers=None, use_proxy=False, ok=None):
|
||||
#import pdb; pdb.Pdb().set_trace()
|
||||
if headers is None:
|
||||
headers = {}
|
||||
connection = connect(url, use_proxy)
|
||||
return self.request(connection, 'GET', url, '', headers, None, self.loader, use_proxy, verbose, ok, **kwargs)
|
||||
return request_(connect(url, use_proxy), method='GET', url=url,
|
||||
body='', headers=headers, loader=self.loader,
|
||||
use_proxy=use_proxy, ok=ok)
|
||||
|
||||
def put(self, url, data, headers=None, content_type=None, verbose=False, ok=None, **kwargs):
|
||||
def get(self, *args, **kwargs):
|
||||
return self.get_(*args, **kwargs)[-1]
|
||||
|
||||
def put_(self, url, data, headers=None, content_type=None, ok=None):
|
||||
if headers is None:
|
||||
headers = {}
|
||||
if content_type is not None:
|
||||
headers['content-type'] = content_type
|
||||
else:
|
||||
if content_type is None:
|
||||
headers['content-type'] = self.fallback_content_type
|
||||
connection = connect(url)
|
||||
return self.request(connection, 'PUT', url, data, headers, self.dumper, make_safe_loader(self.loader), verbose=verbose, ok=ok, **kwargs)
|
||||
else:
|
||||
headers['content-type'] = content_type
|
||||
return request_(connect(url), method='PUT', url=url, body=data,
|
||||
headers=headers, dumper=self.dumper,
|
||||
loader=make_safe_loader(self.loader), ok=ok)
|
||||
|
||||
def delete(self, url, verbose=False, ok=None, **kwargs):
|
||||
return request(connect(url), 'DELETE', url, verbose=verbose, ok=ok, **kwargs)
|
||||
def put(self, *args, **kwargs):
|
||||
return self.put_(*args, **kwargs)[-1]
|
||||
|
||||
def post(self, url, data='', headers=None, content_type=None, verbose=False, ok=None, **kwargs):
|
||||
def delete_(self, url, ok=None):
|
||||
return request_(connect(url), method='DELETE', url=url, ok=ok)
|
||||
|
||||
def delete(self, *args, **kwargs):
|
||||
return self.delete_(*args, **kwargs)[-1]
|
||||
|
||||
def post_(self, url, data='', headers=None, content_type=None, ok=None):
|
||||
if headers is None:
|
||||
headers = {}
|
||||
if 'content-type' not in headers:
|
||||
if content_type is not None:
|
||||
headers['content-type'] = content_type
|
||||
else:
|
||||
if 'content-type' in headers:
|
||||
if content_type is None:
|
||||
headers['content-type'] = self.fallback_content_type
|
||||
return self.request(connect(url), 'POST', url, data, headers, self.dumper, self.loader, verbose=verbose, ok=ok, **kwargs)
|
||||
else:
|
||||
headers['content-type'] = content_type
|
||||
return request_(connect(url), method='POST', url=url, body=data,
|
||||
headers=headers, dumper=self.dumper,
|
||||
loader=self.loader, ok=ok)
|
||||
|
||||
def post(self, *args, **kwargs):
|
||||
return self.post_(*args, **kwargs)[-1]
|
||||
|
||||
|
||||
def make_suite(dumper, loader, fallback_content_type):
|
||||
@@ -399,7 +414,7 @@ def make_suite(dumper, loader, fallback_content_type):
|
||||
|
||||
|
||||
suite = HttpSuite(str, None, 'text/plain')
|
||||
head, get, put, delete, post, request = (
|
||||
suite.head, suite.get, suite.put, suite.delete, suite.post, suite.request)
|
||||
head, get, put, delete, post = (
|
||||
suite.head, suite.get, suite.put, suite.delete, suite.post)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user