Before Width: | Height: | Size: 1015 B |
Before Width: | Height: | Size: 451 B After Width: | Height: | Size: 451 B |
Before Width: | Height: | Size: 228 B After Width: | Height: | Size: 228 B |
After Width: | Height: | Size: 502 B |
After Width: | Height: | Size: 624 B |
Before Width: | Height: | Size: 159 B After Width: | Height: | Size: 159 B |
Before Width: | Height: | Size: 283 B After Width: | Height: | Size: 283 B |
After Width: | Height: | Size: 674 B |
Before Width: | Height: | Size: 726 B |
@ -0,0 +1,88 @@ |
|||
#!/usr/bin/python |
|||
|
|||
#### |
|||
# 06/2010 Nic Wolfe <nic@wolfeden.ca> |
|||
# 02/2006 Will Holcomb <wholcomb@gmail.com> |
|||
# |
|||
# This library is free software; you can redistribute it and/or |
|||
# modify it under the terms of the GNU Lesser General Public |
|||
# License as published by the Free Software Foundation; either |
|||
# version 2.1 of the License, or (at your option) any later version. |
|||
# |
|||
# This library is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
# Lesser General Public License for more details. |
|||
# |
|||
|
|||
import urllib |
|||
import urllib2 |
|||
import mimetools, mimetypes |
|||
import os, sys |
|||
|
|||
# Controls how sequences are uncoded. If true, elements may be given multiple values by |
|||
# assigning a sequence. |
|||
doseq = 1 |
|||
|
|||
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 type(value) in (file, list, tuple): |
|||
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 = MultipartPostHandler.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 |
|||
|
|||
@staticmethod |
|||
def multipart_encode(vars, files, boundary = None, buffer = None): |
|||
if boundary is None: |
|||
boundary = mimetools.choose_boundary() |
|||
if buffer is None: |
|||
buffer = '' |
|||
for(key, value) in vars: |
|||
buffer += '--%s\r\n' % boundary |
|||
buffer += 'Content-Disposition: form-data; name="%s"' % key |
|||
buffer += '\r\n\r\n' + value + '\r\n' |
|||
for(key, fd) in files: |
|||
|
|||
# allow them to pass in a file or a tuple with name & data |
|||
if type(fd) == file: |
|||
name_in = fd.name |
|||
fd.seek(0) |
|||
data_in = fd.read() |
|||
elif type(fd) in (tuple, list): |
|||
name_in, data_in = fd |
|||
|
|||
filename = os.path.basename(name_in) |
|||
contenttype = mimetypes.guess_type(filename)[0] or 'application/octet-stream' |
|||
buffer += '--%s\r\n' % boundary |
|||
buffer += 'Content-Disposition: form-data; name="%s"; filename="%s"\r\n' % (key, filename) |
|||
buffer += 'Content-Type: %s\r\n' % contenttype |
|||
# buffer += 'Content-Length: %s\r\n' % file_size |
|||
buffer += '\r\n' + data_in + '\r\n' |
|||
buffer += '--%s--\r\n\r\n' % boundary |
|||
return boundary, buffer |
|||
|
|||
https_request = http_request |