diff --git a/django_pyvows/http_helpers.py b/django_pyvows/http_helpers.py new file mode 100644 index 0000000..7218a12 --- /dev/null +++ b/django_pyvows/http_helpers.py @@ -0,0 +1,97 @@ +import urllib2 +from urllib import urlencode + +import mimetypes +import mimetools +import itertools + +class MultiPartForm(object): + """Accumulate the data to be used when posting a form.""" + + def __init__(self): + self.form_fields = [] + self.files = [] + self.boundary = mimetools.choose_boundary() + return + + def get_content_type(self): + return 'multipart/form-data; boundary=%s' % self.boundary + + def add_field(self, name, value): + """Add a simple field to the form data.""" + self.form_fields.append((name, value)) + return + + def add_file(self, fieldname, filename, fileHandle, mimetype=None): + """Add a file to be uploaded.""" + body = fileHandle.read() + if mimetype is None: + mimetype = mimetypes.guess_type(filename)[0] or 'application/octet-stream' + self.files.append((fieldname, filename, mimetype, body)) + return + + def __str__(self): + """Return a string representing the form data, including attached files.""" + # Build a list of lists, each containing "lines" of the + # request. Each part is separated by a boundary string. + # Once the list is built, return a string where each + # line is separated by '\r\n'. + parts = [] + part_boundary = '--' + self.boundary + + # Add the form fields + parts.extend( + [ part_boundary, + 'Content-Disposition: form-data; name="%s"' % name, + '', + value, + ] + for name, value in self.form_fields + ) + + # Add the files to upload + parts.extend( + [ part_boundary, + 'Content-Disposition: file; name="%s"; filename="%s"' % \ + (field_name, filename), + 'Content-Type: %s' % content_type, + '', + body, + ] + for field_name, filename, content_type, body in self.files + ) + + # Flatten the list and add closing boundary marker, + # then return CR+LF separated data + flattened = list(itertools.chain(*parts)) + flattened.append('--' + self.boundary + '--') + flattened.append('') + return '\r\n'.join(flattened) + + +def get(url): + response = urllib2.urlopen(url) + return response + +def post(url, data): + form = MultiPartForm() + + for field, value in data.iteritems(): + if isinstance(value, basestring): + form.add_field(field, value) + else: + form.add_file(field, value.name, value) + + request = urllib2.Request(url) + body = str(form) + request.add_header('Content-type', form.get_content_type()) + request.add_header('Content-length', len(body)) + request.add_data(body) + + try: + response = urllib2.urlopen(request) + except urllib2.HTTPError, err: + response = err + + return response +