comparison mercurial/byterange.py @ 9034:8429062de8d3

compat: use email in favor of mimetools
author Alejandro Santos <alejolp@alejolp.com>
date Sun, 05 Jul 2009 11:04:55 +0200
parents 59acf64995d2
children e4211db457c0
comparison
equal deleted inserted replaced
9033:98a5652bfed9 9034:8429062de8d3
206 This class handles Range headers exactly like an HTTP 206 This class handles Range headers exactly like an HTTP
207 server would. 207 server would.
208 """ 208 """
209 def open_local_file(self, req): 209 def open_local_file(self, req):
210 import mimetypes 210 import mimetypes
211 import mimetools 211 import email
212 host = req.get_host() 212 host = req.get_host()
213 file = req.get_selector() 213 file = req.get_selector()
214 localfile = urllib.url2pathname(file) 214 localfile = urllib.url2pathname(file)
215 stats = os.stat(localfile) 215 stats = os.stat(localfile)
216 size = stats[stat.ST_SIZE] 216 size = stats[stat.ST_SIZE]
230 lb = size 230 lb = size
231 if fb < 0 or fb > size or lb > size: 231 if fb < 0 or fb > size or lb > size:
232 raise RangeError('Requested Range Not Satisfiable') 232 raise RangeError('Requested Range Not Satisfiable')
233 size = (lb - fb) 233 size = (lb - fb)
234 fo = RangeableFileObject(fo, (fb, lb)) 234 fo = RangeableFileObject(fo, (fb, lb))
235 headers = mimetools.Message(StringIO( 235 headers = email.message_from_string(
236 'Content-Type: %s\nContent-Length: %d\nLast-Modified: %s\n' % 236 'Content-Type: %s\nContent-Length: %d\nLast-Modified: %s\n' %
237 (mtype or 'text/plain', size, modified))) 237 (mtype or 'text/plain', size, modified))
238 return urllib.addinfourl(fo, headers, 'file:'+file) 238 return urllib.addinfourl(fo, headers, 'file:'+file)
239 239
240 240
241 # FTP Range Support 241 # FTP Range Support
242 # Unfortunately, a large amount of base FTP code had to be copied 242 # Unfortunately, a large amount of base FTP code had to be copied
249 unquote, addclosehook, addinfourl 249 unquote, addclosehook, addinfourl
250 import ftplib 250 import ftplib
251 import socket 251 import socket
252 import sys 252 import sys
253 import mimetypes 253 import mimetypes
254 import mimetools 254 import email
255 255
256 class FTPRangeHandler(urllib2.FTPHandler): 256 class FTPRangeHandler(urllib2.FTPHandler):
257 def ftp_open(self, req): 257 def ftp_open(self, req):
258 host = req.get_host() 258 host = req.get_host()
259 if not host: 259 if not host:
323 mtype = mimetypes.guess_type(req.get_full_url())[0] 323 mtype = mimetypes.guess_type(req.get_full_url())[0]
324 if mtype: 324 if mtype:
325 headers += "Content-Type: %s\n" % mtype 325 headers += "Content-Type: %s\n" % mtype
326 if retrlen is not None and retrlen >= 0: 326 if retrlen is not None and retrlen >= 0:
327 headers += "Content-Length: %d\n" % retrlen 327 headers += "Content-Length: %d\n" % retrlen
328 sf = StringIO(headers) 328 headers = email.message_from_string(headers)
329 headers = mimetools.Message(sf)
330 return addinfourl(fp, headers, req.get_full_url()) 329 return addinfourl(fp, headers, req.get_full_url())
331 except ftplib.all_errors, msg: 330 except ftplib.all_errors, msg:
332 raise IOError('ftp error', msg), sys.exc_info()[2] 331 raise IOError('ftp error', msg), sys.exc_info()[2]
333 332
334 def connect_ftp(self, user, passwd, host, port, dirs): 333 def connect_ftp(self, user, passwd, host, port, dirs):