Mercurial > hg
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): |