diff options
Diffstat (limited to 'app/lib/flickr_api/multipart.py')
-rw-r--r-- | app/lib/flickr_api/multipart.py | 79 |
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' |