Ticket #163: add-configurable-directory-index.patch

File add-configurable-directory-index.patch, 5.7 KB (added by dottedmag, 5 years ago)
  • urlparser.py

    old new  
    425425 
    426426    ``max_cache_age``: 
    427427      integer specifies Cache-Control max_age in seconds 
     428 
     429    ``index_file_name``: 
     430      string specifies name of directory index file. None disables directory indexing. 
    428431    """ 
    429432    # @@: Should URLParser subclass from this? 
    430433 
    431434    def __init__(self, directory, root_directory=None, 
    432                  cache_max_age=None): 
     435                 cache_max_age=None, index_file_name='index.html'): 
    433436        if os.path.sep != '/': 
    434437            directory = directory.replace(os.path.sep, '/') 
    435438        self.directory = directory 
     
    442445        if os.path.sep != '/': 
    443446            directory = directory.replace('/', os.path.sep) 
    444447            self.root_directory = self.root_directory.replace('/', os.path.sep) 
     448        self.index_file_name = index_file_name 
    445449 
    446450    def __call__(self, environ, start_response): 
    447451        path_info = environ.get('PATH_INFO', '') 
    448452        if not path_info: 
    449453            return self.add_slash(environ, start_response) 
    450454        if path_info == '/': 
    451             # @@: This should obviously be configurable 
    452             filename = 'index.html' 
     455            if self.index_file_name: 
     456                filename = self.index_file_name 
     457            else: 
     458                return self.not_found(environ, start_response) 
    453459        else: 
    454460            filename = request.path_info_pop(environ) 
    455461        full = os.path.normpath(os.path.join(self.directory, filename)) 
     
    465471            child_root = self.root_directory is not None and \ 
    466472                self.root_directory or self.directory 
    467473            return self.__class__(full, root_directory=child_root,  
    468                                   cache_max_age=self.cache_max_age)(environ, 
    469                                                                    start_response) 
     474                                  cache_max_age=self.cache_max_age, 
     475                                  index_file_name=self.index_file_name)(environ, 
     476                                                                        start_response) 
    470477        if environ.get('PATH_INFO') and environ.get('PATH_INFO') != '/': 
    471478            return self.error_extra_path(environ, start_response) 
    472479        if_none_match = environ.get('HTTP_IF_NONE_MATCH') 
     
    518525    def __repr__(self): 
    519526        return '<%s %r>' % (self.__class__.__name__, self.directory) 
    520527 
    521 def make_static(global_conf, document_root, cache_max_age=None): 
     528def make_static(global_conf, document_root, cache_max_age=None, 
     529                index_file_name = 'index.html'): 
    522530    """ 
    523531    Return a WSGI application that serves a directory (configured 
    524532    with document_root) 
     
    528536    if cache_max_age is not None: 
    529537        cache_max_age = int(cache_max_age) 
    530538    return StaticURLParser( 
    531         document_root, cache_max_age=cache_max_age) 
     539        document_root, cache_max_age=cache_max_age, index_file_name=index_file_name) 
    532540 
    533541class PkgResourcesParser(StaticURLParser): 
    534542 
    535     def __init__(self, egg_or_spec, resource_name, manager=None, root_resource=None): 
     543    def __init__(self, egg_or_spec, resource_name, manager=None, root_resource=None, 
     544                 index_file_name = 'index.html'): 
    536545        if pkg_resources is None: 
    537546            raise NotImplementedError("This class requires pkg_resources.") 
    538547        if isinstance(egg_or_spec, (str, unicode)): 
     
    546555        if root_resource is None: 
    547556            root_resource = resource_name 
    548557        self.root_resource = os.path.normpath(root_resource) 
     558        self.index_file_name = index_file_name 
    549559 
    550560    def __repr__(self): 
    551561        return '<%s for %s:%r>' % ( 
     
    558568        if not path_info: 
    559569            return self.add_slash(environ, start_response) 
    560570        if path_info == '/': 
    561             # @@: This should obviously be configurable 
    562             filename = 'index.html' 
     571            if self.index_file_name: 
     572                filename = self.index_file_name 
     573            else: 
     574                return self.not_found(environ, start_response) 
    563575        else: 
    564576            filename = request.path_info_pop(environ) 
    565577        resource = os.path.normpath(self.resource_name + '/' + filename) 
     
    573585            child_root = self.root_resource is not None and self.root_resource or \ 
    574586                self.resource_name 
    575587            return self.__class__(self.egg, resource, self.manager, 
    576                                   root_resource=child_root)(environ, start_response) 
     588                                  root_resource=child_root, 
     589                                  index_file_name=self.index_file_name)(environ, 
     590                                                                        start_response) 
    577591        if environ.get('PATH_INFO') and environ.get('PATH_INFO') != '/': 
    578592            return self.error_extra_path(environ, start_response) 
    579593         
     
    600614               self.egg, self.resource_name, debug_message or '(none)')) 
    601615        return exc.wsgi_application(environ, start_response) 
    602616 
    603 def make_pkg_resources(global_conf, egg, resource_name=''): 
     617def make_pkg_resources(global_conf, egg, resource_name='', 
     618                       index_file_name = 'index.html'): 
    604619    """ 
    605620    A static file parser that loads data from an egg using 
    606621    ``pkg_resources``.  Takes a configuration value ``egg``, which is 
     
    609624    """ 
    610625    if pkg_resources is None: 
    611626        raise NotImplementedError("This function requires pkg_resources.") 
    612     return PkgResourcesParser(egg, resource_name) 
     627    return PkgResourcesParser(egg, resource_name, index_file_name) 
    613628 
    614629def make_url_parser(global_conf, directory, base_python_name, 
    615630                    index_names=None, hide_extensions=None,