summaryrefslogtreecommitdiff
path: root/app/lib/flickr_api/multipart.py
diff options
context:
space:
mode:
Diffstat (limited to 'app/lib/flickr_api/multipart.py')
-rw-r--r--app/lib/flickr_api/multipart.py79
1 files changed, 79 insertions, 0 deletions
diff --git a/app/lib/flickr_api/multipart.py b/app/lib/flickr_api/multipart.py
new file mode 100644
index 0000000..d28912c
--- /dev/null
+++ b/app/lib/flickr_api/multipart.py
@@ -0,0 +1,79 @@
+"""
+ Deals with multipart POST requests.
+
+ The code is adapted from the recipe found at :
+ http://code.activestate.com/recipes/146306/
+ No author name was given.
+
+ Author : Alexis Mignon (c)
+ email : alexis.mignon@gmail.Com
+ Date : 06/08/2011
+
+"""
+
+import http.client
+import mimetypes
+from urllib import parse as urlparse
+
+
+def posturl(url, fields, files):
+ urlparts = urlparse.urlsplit(url)
+ return post_multipart(urlparts[1], urlparts[2], fields, files)
+
+
+def post_multipart(host, selector, fields, files):
+ """
+ Post fields and files to an http host as multipart/form-data.
+ fields is a sequence of (name, value) elements for regular form fields.
+ files is a sequence of (name, filename, value) elements for data to be
+ uploaded as files.
+
+ Return the server's response page.
+ """
+ content_type, body = encode_multipart_formdata(fields, files)
+ h = http.client.HTTPSConnection(host)
+ headers = {"Content-Type": content_type, 'content-length': str(len(body))}
+ h.request("POST", selector, headers=headers)
+ h.send(body)
+ r = h.getresponse()
+ data = r.read()
+ h.close()
+ return r, data
+
+
+def encode_multipart_formdata(fields, files):
+ """
+ fields is a sequence of (name, value) elements for regular form fields.
+ files is a sequence of (name, filename, value) elements for data to be
+ uploaded as files.
+
+ Return (content_type, body) ready for httplib.HTTP instance
+ """
+ BOUNDARY = '----------ThIs_Is_tHe_bouNdaRY_$'
+ CRLF = '\r\n'
+ L = []
+ for (key, value) in fields:
+ L.append('--' + BOUNDARY)
+ L.append('Content-Disposition: form-data; name="%s"' % key)
+ L.append('')
+ L.append(value)
+ for (key, filename, value) in files:
+ filename = filename.encode("utf8")
+ L.append('--' + BOUNDARY)
+ L.append(
+ 'Content-Disposition: form-data; name="%s"; filename="%s"' % (
+ key, filename
+ )
+ )
+ L.append('Content-Type: %s' % get_content_type(filename))
+ L.append('')
+ L.append(value)
+ L.append('--' + BOUNDARY + '--')
+ L.append('')
+ body = CRLF.join(L)
+ content_type = 'multipart/form-data; boundary=%s' % BOUNDARY
+ return content_type, body
+
+
+def get_content_type(filename):
+ return mimetypes.guess_type(filename)[0] or 'application/octet-stream'