# Copyright (c) 2001-2004 Twisted Matrix Laboratories. # See LICENSE for details. """Directory listing.""" # system imports import os import urllib import stat import time # twisted imports from twisted.web2 import iweb, resource, http, http_headers def formatFileSize(size): if size < 1024: return '%i' % size elif size < (1024**2): return '%iK' % (size / 1024) elif size < (1024**3): return '%iM' % (size / (1024**2)) else: return '%iG' % (size / (1024**3)) class DirectoryLister(resource.Resource): def __init__(self, pathname, dirs=None, contentTypes={}, contentEncodings={}, defaultType='text/html'): self.contentTypes = contentTypes self.contentEncodings = contentEncodings self.defaultType = defaultType # dirs allows usage of the File to specify what gets listed self.dirs = dirs self.path = pathname resource.Resource.__init__(self) def data_listing(self, request, data): if self.dirs is None: directory = os.listdir(self.path) directory.sort() else: directory = self.dirs files = [] for path in directory: url = urllib.quote(path, '/') fullpath = os.path.join(self.path, path) try: st = os.stat(fullpath) except OSError: continue if stat.S_ISDIR(st.st_mode): url = url + '/' files.append({ 'link': url, 'linktext': path + "/", 'size': '', 'type': '-', 'lastmod': time.strftime("%Y-%b-%d %H:%M", time.localtime(st.st_mtime)) }) else: from twisted.web2.static import getTypeAndEncoding mimetype, encoding = getTypeAndEncoding( path, self.contentTypes, self.contentEncodings, self.defaultType) filesize = st.st_size files.append({ 'link': url, 'linktext': path, 'size': formatFileSize(filesize), 'type': mimetype, 'lastmod': time.strftime("%Y-%b-%d %H:%M", time.localtime(st.st_mtime)) }) return files def __repr__(self): return '' % self.path __str__ = __repr__ def render(self, request): title = "Directory listing for %s" % urllib.unquote(request.path) s= """%s

%s

""" % (title,title) s+="" s+="" even = False for row in self.data_listing(request, None): s+='' % (even and 'even' or 'odd',) s+='' % row even = not even s+="
FilenameSizeLast ModifiedFile Type
%(linktext)s%(size)s%(lastmod)s%(type)s
" response = http.Response(200, {}, s) response.headers.setHeader("content-type", http_headers.MimeType('text', 'html')) return response __all__ = ['DirectoryLister']