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 |