def __init__(self, http=None, persistent=True, **kw): if http is not None and not isinstance(http, type) and not callable(http): raise TypeError, 'Bolacha takes a class or callable as parameter, ' \ 'got %s' % repr(http) if http is not None: self.http = http(**kw) else: self.http = HTTPClass(**kw) self.persistent = persistent self.headers = {}
class Bolacha(object): headers = None def __init__(self, http=None, persistent=True, **kw): if http is not None and not isinstance(http, type) and not callable(http): raise TypeError, 'Bolacha takes a class or callable as parameter, ' \ 'got %s' % repr(http) if http is not None: self.http = http(**kw) else: self.http = HTTPClass(**kw) self.persistent = persistent self.headers = {} def post(self, url, body=None, headers=None): return self.request(url, 'POST', body=body, headers=headers) def get(self, url, body=None, headers=None): return self.request(url, 'GET', body=body, headers=headers) def put(self, url, body=None, headers=None): return self.request(url, 'PUT', body=body, headers=headers) def delete(self, url, body=None, headers=None): return self.request(url, 'DELETE', body=body, headers=headers) def head(self, url, body=None, headers=None): return self.request(url, 'HEAD', body=body, headers=headers) def request(self, url, method, body=None, headers=None): if not isinstance(url, basestring): raise TypeError, 'Bolacha.request, parameter url must be ' \ 'a string. Got %s' % repr(url) if not isinstance(method, basestring): raise TypeError, 'Bolacha.request, parameter method must be ' \ 'a string. Got %s' % repr(method) if method not in HTTP_METHODS: raise TypeError, 'Bolacha.request, parameter method must be ' \ 'a valid HTTP method. Got %s. %s' % (method, RFC_LOCATION) if body is None: body = '' if not isinstance(body, (basestring, dict)): raise TypeError, 'Bolacha.request, parameter body must be ' \ 'a string or dict. Got %s.' % (repr(body)) is_urlencoded = False body_has_file = isinstance(body, dict) and any([is_file(fobj) for fobj in body.values()]) if isinstance(body, dict): if body_has_file: rbody = encode_multipart(BOUNDARY, body) else: rbody = urlencode(body) is_urlencoded = True else: rbody = body if headers is None: headers = {} if not isinstance(headers, dict): raise TypeError, 'Bolacha.request, parameter headers must be ' \ 'a dict or NoneType. Got %s' % repr(headers) rheaders = self.headers.copy() rheaders.update(headers) if self.persistent: if 'set-cookie' in self.headers: rheaders['Cookie'] = self.headers['set-cookie'] if 'set-cookie' in rheaders: del rheaders['set-cookie'] if is_urlencoded and not 'Content-type' in rheaders: rheaders['Content-type'] = 'application/x-www-form-urlencoded' elif body_has_file: rheaders['Content-type'] = 'multipart/form-data; boundary=%s' % BOUNDARY rheaders['content-length'] = '%d' % len(rbody) response, content = self.http.request(url, method, rbody, rheaders) if self.persistent and 'set-cookie' in response: self.headers['set-cookie'] = response['set-cookie'] if not self.persistent: if 'connection' in response: self.headers['connection'] = response['connection'] return response, content