def __init__(self, content=b'', mimetype=None, charset=b"utf-8"): self.headers = httputils.Headers() self.cookies = httputils.CookieJar() self._charset = charset if mimetype: self.headers.add_header( httputils.ContentType(mimetype, charset=self._charset)) if hasattr(content, '__iter__'): self._container = content self._is_string = False else: self._container = [content] self._is_string = True
def __init__(self, content='', mimetype=None): self.headers = httputils.Headers() self.cookies = httputils.CookieJar() self._charset = sys.getdefaultencoding() # XXX if mimetype: self.headers.add_header( httputils.ContentType(mimetype, charset=self._charset)) if hasattr(content, '__iter__'): self._container = content self._is_string = False else: self._container = [content] self._is_string = True
def get_json_poster(self): """Initialze a Curl object for a single POST request using an object that returns JSON from its "to_json" method. """ data = self._data.to_json() c = pycurl.Curl() resp = HTTPResponse(self._encoding) c.setopt(c.URL, str(self._url)) c.setopt(pycurl.POST, 1) c.setopt(pycurl.POSTFIELDS, data) c.setopt(c.WRITEFUNCTION, resp._body_callback) c.setopt(c.HEADERFUNCTION, resp._header_callback) headers = self._headers[:] headers.append(httputils.ContentType("application/json-rpc")) headers.append(httputils.ContentLength(str(len(data)))) c.setopt(c.HTTPHEADER, list(map(str, headers))) self._set_common(c) return c, resp
def get_URLencoded_poster(self): """Initialze a Curl object for a single POST request. Returns a tuple of initialized Curl and HTTPResponse objects. """ data = urlencode(self._data, True) c = pycurl.Curl() resp = HTTPResponse(self._encoding) c.setopt(c.URL, str(self._url)) c.setopt(pycurl.POST, 1) c.setopt(pycurl.POSTFIELDS, data) c.setopt(c.WRITEFUNCTION, resp._body_callback) c.setopt(c.HEADERFUNCTION, resp._header_callback) headers = self._headers[:] headers.append(httputils.ContentType("application/x-www-form-urlencoded")) headers.append(httputils.ContentLength(str(len(data)))) c.setopt(c.HTTPHEADER, list(map(str, headers))) self._set_common(c) return c, resp
def get_raw_poster(self): """Initialze a Curl object for a single POST request. This sends whatever data you give it, without specifying the content type. Returns a tuple of initialized Curl and HTTPResponse objects. """ ld = len(self._data) c = pycurl.Curl() resp = HTTPResponse(self._encoding) c.setopt(c.URL, str(self._url)) c.setopt(pycurl.POST, 1) c.setopt(c.READFUNCTION, DataWrapper(self._data).read) c.setopt(c.POSTFIELDSIZE, ld) c.setopt(c.WRITEFUNCTION, resp._body_callback) c.setopt(c.HEADERFUNCTION, resp._header_callback) headers = self._headers[:] headers.append(httputils.ContentType("")) # removes libcurl internal header headers.append(httputils.ContentLength(str(ld))) c.setopt(c.HTTPHEADER, list(map(str, headers))) self._set_common(c) return c, resp
def _parse_post_content(self): if self.method == b'POST': content_type = httputils.ContentType( self.environ.get(b'CONTENT_TYPE', '')) ctvalue = content_type.value.lower() if ctvalue == b'multipart/form-data': self._post, self._files = parse_formdata( content_type, self._get_raw_post_data()) elif ctvalue == b"application/x-www-form-urlencoded": self._post = urlparse.queryparse(self._get_raw_post_data()) self._files = None else: # some buggy clients don't set proper content-type, so # just preserve the raw data as a file. self.log_error("Bad content-type: {!s}".format(content_type)) data = self._get_raw_post_data() self._post = urlparse.queryparse(data) self._files = {} self._files["body"] = { b'content-type': content_type, b'content': data, } else: self._post = urlparse.URLQuery() self._files = None
return mod if __name__ == "__main__": DATA = b"""------WebKitFormBoundaryLHph2NIrIQTpfNKw\r Content-Disposition: form-data; name="name"\r \r myenvattr\r ------WebKitFormBoundaryLHph2NIrIQTpfNKw\r Content-Disposition: form-data; name="description"\r \r Some attr test.\r ------WebKitFormBoundaryLHph2NIrIQTpfNKw\r Content-Disposition: form-data; name="value_type"\r \r 1\r ------WebKitFormBoundaryLHph2NIrIQTpfNKw\r Content-Disposition: form-data; name="submit"\r \r submit\r ------WebKitFormBoundaryLHph2NIrIQTpfNKw--\r """ content_type = b"Multipart/form-data; boundary=----WebKitFormBoundaryLHph2NIrIQTpfNKw" content_type = httputils.ContentType(content_type) print(content_type.value) post, files = parse_formdata(content_type, DATA) print(post.items())