Changeset 2:e30d192e9031
- Timestamp:
- 09/01/13 08:12:43 (8 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pyweek_upload.py
r0 r2 4 4 Handles authentication and gives upload progress feedback. 5 5 ''' 6 import sys, os, httplib, cStringIO, socket, time, getopt 7 8 class Upload: 6 import sys 7 import os 8 import httplib 9 import cStringIO 10 import socket 11 import time 12 import getopt 13 14 15 class Upload(object): 9 16 def __init__(self, filename): 10 17 self.filename = filename … … 13 20 sep_boundary = '\n--' + boundary 14 21 end_boundary = sep_boundary + '--' 22 15 23 16 24 def mimeEncode(data, sep_boundary=sep_boundary, end_boundary=end_boundary): … … 21 29 for key, value in data.items(): 22 30 # handle multiple entries for the same name 23 if type(value) != type([]): value = [value] 31 if not isinstance(value, list): 32 value = [value] 24 33 for value in value: 25 34 ret.write(sep_boundary) 26 35 if isinstance(value, Upload): 27 ret.write('\nContent-Disposition: form-data; name="%s"' %key)36 ret.write('\nContent-Disposition: form-data; name="%s"' % key) 28 37 filename = os.path.basename(value.filename) 29 ret.write('; filename="%s"\n\n' %filename)38 ret.write('; filename="%s"\n\n' % filename) 30 39 value = open(os.path.join(value.filename), "rb").read() 31 40 else: 32 ret.write('\nContent-Disposition: form-data; name="%s"' %key)41 ret.write('\nContent-Disposition: form-data; name="%s"' % key) 33 42 ret.write("\n\n") 34 43 value = str(value) … … 39 48 return ret.getvalue() 40 49 41 class Progress: 50 51 class Progress(object): 42 52 def __init__(self, info, data): 43 53 self.info = info 44 54 self.tosend = len(data) 45 self.total = self.tosend /102455 self.total = self.tosend / 1024 46 56 self.data = cStringIO.StringIO(data) 47 57 self.start = self.now = time.time() … … 52 62 self.display() 53 63 54 def __iter__(self): return self 64 def __iter__(self): 65 return self 55 66 56 67 def next(self): 57 68 self.num += 1 58 69 if self.sent >= self.tosend: 59 print self.info, 'done', ' ' *(75-len(self.info)-6)70 print self.info, 'done', ' ' * (75 - len(self.info) - 6) 60 71 sys.stdout.flush() 61 72 raise StopIteration … … 79 90 steptime = sum(self.steptimes) / len(self.steptimes) 80 91 self.now = now 81 eta = steptime * ((self.total - self.num) /self.stepsize)92 eta = steptime * ((self.total - self.num) / self.stepsize) 82 93 83 94 # tell it like it is (or might be) … … 88 99 S = eta % 60 89 100 if self.total: 90 s = '%s %2d%% (ETA %02d:%02d:%02d)' %(self.info,101 s = '%s %2d%% (ETA %02d:%02d:%02d)' % (self.info, 91 102 self.num * 100. / self.total, H, M, S) 92 103 else: 93 s = '%s 0%% (ETA %02d:%02d:%02d)' %(self.info, H, M, S)104 s = '%s 0%% (ETA %02d:%02d:%02d)' % (self.info, H, M, S) 94 105 elif self.total: 95 s = '%s %2d%%' %(self.info, self.num * 100. / self.total)106 s = '%s %2d%%' % (self.info, self.num * 100. / self.total) 96 107 else: 97 s = '%s %d done' %(self.info, self.num)98 sys.stdout.write(s + ' ' *(75-len(s)) + '\r')108 s = '%s %d done' % (self.info, self.num) 109 sys.stdout.write(s + ' ' * (75 - len(s)) + '\r') 99 110 sys.stdout.flush() 111 100 112 101 113 class progressHTTPConnection(httplib.HTTPConnection): … … 117 129 p.display() 118 130 131 119 132 class progressHTTP(httplib.HTTP): 120 133 _connection_class = progressHTTPConnection 134 121 135 def _setup(self, conn): 122 136 httplib.HTTP._setup(self, conn) 123 137 self.progress_send = self._conn.progress_send 124 138 139 125 140 def http_request(data, server, port, url): 126 141 h = progressHTTP(server, port) … … 128 143 data = mimeEncode(data) 129 144 h.putrequest('POST', url) 130 h.putheader('Content-type', 'multipart/form-data; boundary=%s' %boundary)145 h.putheader('Content-type', 'multipart/form-data; boundary=%s' % boundary) 131 146 h.putheader('Content-length', str(len(data))) 132 147 h.putheader('Host', server) … … 141 156 f.close() 142 157 143 print '%s %s'%(errcode, errmsg) 144 if response: print response 158 print '%s %s' % (errcode, errmsg) 159 if response: 160 print response 161 145 162 146 163 def usage(): … … 179 196 url = None 180 197 for opt, arg in optlist: 181 if opt == '-u': data['user'] = arg 182 elif opt == '-p': data['password'] = arg 183 elif opt == '-s': optional['is_screenshot'] = 'yes' 184 elif opt == '-f': optional['is_final'] = 'yes' 185 elif opt == '-d': data['description'] = arg 186 elif opt == '-c': data['content_file'] = Upload(arg) 187 elif opt == '-e': url = '/e/%s/oup/'%arg 188 elif opt == '-h': host = arg 189 elif opt == '-P': port = int(arg) 198 if opt == '-u': 199 data['user'] = arg 200 elif opt == '-p': 201 data['password'] = arg 202 elif opt == '-s': 203 optional['is_screenshot'] = 'yes' 204 elif opt == '-f': 205 optional['is_final'] = 'yes' 206 elif opt == '-d': 207 data['description'] = arg 208 elif opt == '-c': 209 data['content_file'] = Upload(arg) 210 elif opt == '-e': 211 url = '/e/%s/oup/' % arg 212 elif opt == '-h': 213 host = arg 214 elif opt == '-P': 215 port = int(arg) 190 216 191 217 if len(data) < 4 or url is None: … … 196 222 data.update(optional) 197 223 http_request(data, host, port, url) 198
Note:
See TracChangeset
for help on using the changeset viewer.