home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2010 November / maximum-cd-2010-11.iso / DiscContents / calibre-0.7.13.msi / file_1465 (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2010-08-06  |  5.1 KB  |  159 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. import mimetypes
  5. mimetypes.init()
  6. mimetypes.types_map['.dwg'] = 'image/x-dwg'
  7. mimetypes.types_map['.ico'] = 'image/x-icon'
  8. import os
  9. import re
  10. import stat
  11. import time
  12. import urllib
  13. import cherrypy
  14. from cherrypy.lib import cptools, http, file_generator_limited
  15.  
  16. def serve_file(path, content_type = None, disposition = None, name = None):
  17.     response = cherrypy.response
  18.     if not os.path.isabs(path):
  19.         raise ValueError("'%s' is not an absolute path." % path)
  20.     os.path.isabs(path)
  21.     
  22.     try:
  23.         st = os.stat(path)
  24.     except OSError:
  25.         raise cherrypy.NotFound()
  26.  
  27.     if stat.S_ISDIR(st.st_mode):
  28.         raise cherrypy.NotFound()
  29.     stat.S_ISDIR(st.st_mode)
  30.     response.headers['Last-Modified'] = http.HTTPDate(st.st_mtime)
  31.     cptools.validate_since()
  32.     if content_type is None:
  33.         ext = ''
  34.         i = path.rfind('.')
  35.         if i != -1:
  36.             ext = path[i:].lower()
  37.         
  38.         content_type = mimetypes.types_map.get(ext, 'text/plain')
  39.     
  40.     response.headers['Content-Type'] = content_type
  41.     if disposition is not None:
  42.         if name is None:
  43.             name = os.path.basename(path)
  44.         
  45.         cd = '%s; filename="%s"' % (disposition, name)
  46.         response.headers['Content-Disposition'] = cd
  47.     
  48.     c_len = st.st_size
  49.     bodyfile = open(path, 'rb')
  50.     if cherrypy.request.protocol >= (1, 1):
  51.         response.headers['Accept-Ranges'] = 'bytes'
  52.         r = http.get_ranges(cherrypy.request.headers.get('Range'), c_len)
  53.         if r == []:
  54.             response.headers['Content-Range'] = 'bytes */%s' % c_len
  55.             message = 'Invalid Range (first-byte-pos greater than Content-Length)'
  56.             raise cherrypy.HTTPError(416, message)
  57.         r == []
  58.         if r:
  59.             if len(r) == 1:
  60.                 (start, stop) = r[0]
  61.                 if stop > c_len:
  62.                     stop = c_len
  63.                 
  64.                 r_len = stop - start
  65.                 response.status = '206 Partial Content'
  66.                 response.headers['Content-Range'] = 'bytes %s-%s/%s' % (start, stop - 1, c_len)
  67.                 response.headers['Content-Length'] = r_len
  68.                 bodyfile.seek(start)
  69.                 response.body = file_generator_limited(bodyfile, r_len)
  70.             else:
  71.                 response.status = '206 Partial Content'
  72.                 import mimetools
  73.                 boundary = mimetools.choose_boundary()
  74.                 ct = 'multipart/byteranges; boundary=%s' % boundary
  75.                 response.headers['Content-Type'] = ct
  76.                 if response.headers.has_key('Content-Length'):
  77.                     del response.headers['Content-Length']
  78.                 
  79.                 
  80.                 def file_ranges():
  81.                     yield '\r\n'
  82.                     for start, stop in r:
  83.                         yield '--' + boundary
  84.                         yield '\r\nContent-type: %s' % content_type
  85.                         yield '\r\nContent-range: bytes %s-%s/%s\r\n\r\n' % (start, stop - 1, c_len)
  86.                         bodyfile.seek(start)
  87.                         for chunk in file_generator_limited(bodyfile, stop - start):
  88.                             yield chunk
  89.                         
  90.                         yield '\r\n'
  91.                     
  92.                     yield '--' + boundary + '--'
  93.                     yield '\r\n'
  94.  
  95.                 response.body = file_ranges()
  96.         else:
  97.             response.headers['Content-Length'] = c_len
  98.             response.body = bodyfile
  99.     else:
  100.         response.headers['Content-Length'] = c_len
  101.         response.body = bodyfile
  102.     return response.body
  103.  
  104.  
  105. def serve_download(path, name = None):
  106.     return serve_file(path, 'application/x-download', 'attachment', name)
  107.  
  108.  
  109. def _attempt(filename, content_types):
  110.     
  111.     try:
  112.         content_type = None
  113.         if content_types:
  114.             (r, ext) = os.path.splitext(filename)
  115.             content_type = content_types.get(ext[1:], None)
  116.         
  117.         serve_file(filename, content_type = content_type)
  118.         return True
  119.     except cherrypy.NotFound:
  120.         return False
  121.  
  122.  
  123.  
  124. def staticdir(section, dir, root = '', match = '', content_types = None, index = ''):
  125.     if cherrypy.request.method not in ('GET', 'HEAD'):
  126.         return False
  127.     if match and not re.search(match, cherrypy.request.path_info):
  128.         return False
  129.     dir = os.path.expanduser(dir)
  130.     if section == 'global':
  131.         section = '/'
  132.     
  133.     section = section.rstrip('\\/')
  134.     branch = cherrypy.request.path_info[len(section) + 1:]
  135.     branch = urllib.unquote(branch.lstrip('\\/'))
  136.     filename = os.path.join(dir, branch)
  137.     if not os.path.normpath(filename).startswith(os.path.normpath(dir)):
  138.         raise cherrypy.HTTPError(403)
  139.     os.path.normpath(filename).startswith(os.path.normpath(dir))
  140.     handled = _attempt(filename, content_types)
  141.     if not handled:
  142.         if index:
  143.             handled = _attempt(os.path.join(filename, index), content_types)
  144.             if handled:
  145.                 cherrypy.request.is_index = filename[-1] in '\\/'
  146.             
  147.         
  148.     
  149.     return handled
  150.  
  151.  
  152. def staticfile(filename, root = None, match = '', content_types = None):
  153.     if cherrypy.request.method not in ('GET', 'HEAD'):
  154.         return False
  155.     if match and not re.search(match, cherrypy.request.path_info):
  156.         return False
  157.     return _attempt(filename, content_types)
  158.  
  159.