Created
July 22, 2012 07:56
-
-
Save chriszf/3158819 to your computer and use it in GitHub Desktop.
Multipart hack to passthrough uploads on GAE to abbyysdk
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class MultipartPostHandler(urllib2.BaseHandler): | |
handler_order = urllib2.HTTPHandler.handler_order - 10 # needs to run first | |
def http_request(self, request): | |
data = request.get_data() | |
if data is not None and type(data) != str: | |
v_files = [] | |
v_vars = [] | |
try: | |
for(key, value) in data.items(): | |
if key == "image": | |
v_files.append((key, value)) | |
else: | |
v_vars.append((key, value)) | |
except TypeError: | |
systype, value, traceback = sys.exc_info() | |
raise TypeError, "not a valid non-string sequence or mapping object", traceback | |
if len(v_files) == 0: | |
data = urllib.urlencode(v_vars, doseq) | |
else: | |
boundary, data = self.multipart_encode(v_vars, v_files) | |
contenttype = 'multipart/form-data; boundary=%s' % boundary | |
if(request.has_header('Content-Type') | |
and request.get_header('Content-Type').find('multipart/form-data') != 0): | |
print "Replacing %s with %s" % (request.get_header('content-type'), 'multipart/form-data') | |
request.add_unredirected_header('Content-Type', contenttype) | |
request.add_data(data) | |
return request | |
def multipart_encode(vars, files, boundary = None, buf = None): | |
if boundary is None: | |
boundary = mimetools.choose_boundary() | |
if buf is None: | |
buf = StringIO() | |
for(key, value) in vars: | |
buf.write('--%s\r\n' % boundary) | |
buf.write('Content-Disposition: form-data; name="%s"' % key) | |
buf.write('\r\n\r\n' + value + '\r\n') | |
for(key, filepair) in files: | |
filename, contents = filepair | |
file_size = len(contents) | |
contenttype = mimetypes.guess_type(filename)[0] or 'application/octet-stream' | |
buf.write('--%s\r\n' % boundary) | |
buf.write('Content-Disposition: form-data; name="%s"; filename="%s"\r\n' % (key, filename)) | |
buf.write('Content-Type: %s\r\n' % contenttype) | |
# buffer += 'Content-Length: %s\r\n' % file_size | |
buf.write('\r\n' + contents + '\r\n') | |
buf.write('--' + boundary + '--\r\n\r\n') | |
buf = buf.getvalue() | |
return boundary, buf | |
multipart_encode = Callable(multipart_encode) | |
https_request = http_request |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Request body should change from this:
{file: self.request.get('image')}
to this:
{"image": (image_filename, self.request.get('image'))}