X-Git-Url: https://projects.mako.cc/source/wikipedia-api-cdsw/blobdiff_plain/18035a55810c137c1e4b8d12a67afec522c94244..f2892ae64a4eb963904669373c148d9dbdfa3b1b:/mwclient/upload.py diff --git a/mwclient/upload.py b/mwclient/upload.py deleted file mode 100644 index 4d79cc2..0000000 --- a/mwclient/upload.py +++ /dev/null @@ -1,135 +0,0 @@ -import random -from cStringIO import StringIO - - -class Upload(object): - - """ - Base class for upload objects. This class should always be subclassed - by upload classes and its constructor always be called. - - Upload classes are file like object/iterators that have additional - variables length and content_type. - """ - - BLOCK_SIZE = 8192 - - def __init__(self, length, content_type): - self.length = length - self.content_type = content_type - - def __iter__(self): - return self - - def next(self): - data = self.read(self.BLOCK_SIZE) - if data == '': - raise StopIteration - return data - - @staticmethod - def encode(s): - if type(s) is str: - return s - elif type(s) is unicode: - return s.encode('utf-8') - else: - return s - - -class UploadRawData(Upload): - - """ - This upload class is simply a wrapper around StringIO - """ - - def __init__(self, data, content_type='application/x-www-form-urlencoded'): - self.fstr = StringIO(data) - Upload.__init__(self, len(data), content_type) - - def read(self, length=-1): - return self.fstr.read(length) - - -class UploadDict(UploadRawData): - - """ - This class creates an x-www-form-urlencoded representation of a dict - and then passes it through its parent UploadRawData - """ - - def __init__(self, data): - postdata = '&'.join('%s=%s' % (self.encode(i), self.encode(data[i])) for i in data) - UploadRawData.__init__(self, postdata) - - -class UploadFile(Upload): - - """ - This class accepts a file with information and a postdata dictionary - and creates a multipart/form-data representation from it. - """ - STAGE_FILEHEADER = 0 - STAGE_FILE = 1 - STAGE_POSTDATA = 2 - STAGE_FOOTER = 3 - STAGE_DONE = 4 - - def __init__(self, filefield, filename, filelength, file, data): - self.stage = self.STAGE_FILEHEADER - self.boundary = self.generate_boundary() - self.postdata = self.generate_multipart_from_dict(data) - self.footer = '\r\n--%s--\r\n' % self.boundary - self.fileheader = ('--%s\r\n' % self.boundary + - 'Content-Disposition: form-data; name="%s"; filename="%s"\r\n' % - (self.encode(filefield), self.encode(filename)) + - 'Content-Type: application/octet-stream\r\n\r\n') - self.file = file - self.length_left = filelength - self.str_data = None - - Upload.__init__(self, len(self.fileheader) + filelength + len(self.postdata) + len(self.footer) + 2, - 'multipart/form-data; boundary=' + self.boundary) - - def read(self, length): - if self.stage == self.STAGE_DONE: - return '' - elif self.stage != self.STAGE_FILE: - if self.str_data is None: - if self.stage == self.STAGE_FILEHEADER: - self.str_data = StringIO(self.fileheader) - elif self.stage == self.STAGE_POSTDATA: - self.str_data = StringIO(self.postdata) - elif self.stage == self.STAGE_FOOTER: - self.str_data = StringIO(self.footer) - data = self.str_data.read(length) - else: - if self.length_left: - if length > self.length_left: - length = self.length_left - data = self.file.read(length) - self.length_left -= len(data) - else: - self.stage += 1 - return '\r\n' - - if data == '': - self.stage += 1 - self.str_data = None - return self.read(length) - return data - - @staticmethod - def generate_boundary(): - return '----%s----' % ''.join((random.choice( - 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789') - for i in xrange(32))) - - def generate_multipart_from_dict(self, data): - postdata = [] - for i in data: - postdata.append('--' + self.boundary) - postdata.append('Content-Disposition: form-data; name="%s"' % self.encode(i)) - postdata.append('') - postdata.append(self.encode(data[i])) - return '\r\n'.join(postdata)