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 425 425 426 426 ``max_cache_age``: 427 427 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. 428 431 """ 429 432 # @@: Should URLParser subclass from this? 430 433 431 434 def __init__(self, directory, root_directory=None, 432 cache_max_age=None ):435 cache_max_age=None, index_file_name='index.html'): 433 436 if os.path.sep != '/': 434 437 directory = directory.replace(os.path.sep, '/') 435 438 self.directory = directory … … 442 445 if os.path.sep != '/': 443 446 directory = directory.replace('/', os.path.sep) 444 447 self.root_directory = self.root_directory.replace('/', os.path.sep) 448 self.index_file_name = index_file_name 445 449 446 450 def __call__(self, environ, start_response): 447 451 path_info = environ.get('PATH_INFO', '') 448 452 if not path_info: 449 453 return self.add_slash(environ, start_response) 450 454 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) 453 459 else: 454 460 filename = request.path_info_pop(environ) 455 461 full = os.path.normpath(os.path.join(self.directory, filename)) … … 465 471 child_root = self.root_directory is not None and \ 466 472 self.root_directory or self.directory 467 473 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) 470 477 if environ.get('PATH_INFO') and environ.get('PATH_INFO') != '/': 471 478 return self.error_extra_path(environ, start_response) 472 479 if_none_match = environ.get('HTTP_IF_NONE_MATCH') … … 518 525 def __repr__(self): 519 526 return '<%s %r>' % (self.__class__.__name__, self.directory) 520 527 521 def make_static(global_conf, document_root, cache_max_age=None): 528 def make_static(global_conf, document_root, cache_max_age=None, 529 index_file_name = 'index.html'): 522 530 """ 523 531 Return a WSGI application that serves a directory (configured 524 532 with document_root) … … 528 536 if cache_max_age is not None: 529 537 cache_max_age = int(cache_max_age) 530 538 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) 532 540 533 541 class PkgResourcesParser(StaticURLParser): 534 542 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'): 536 545 if pkg_resources is None: 537 546 raise NotImplementedError("This class requires pkg_resources.") 538 547 if isinstance(egg_or_spec, (str, unicode)): … … 546 555 if root_resource is None: 547 556 root_resource = resource_name 548 557 self.root_resource = os.path.normpath(root_resource) 558 self.index_file_name = index_file_name 549 559 550 560 def __repr__(self): 551 561 return '<%s for %s:%r>' % ( … … 558 568 if not path_info: 559 569 return self.add_slash(environ, start_response) 560 570 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) 563 575 else: 564 576 filename = request.path_info_pop(environ) 565 577 resource = os.path.normpath(self.resource_name + '/' + filename) … … 573 585 child_root = self.root_resource is not None and self.root_resource or \ 574 586 self.resource_name 575 587 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) 577 591 if environ.get('PATH_INFO') and environ.get('PATH_INFO') != '/': 578 592 return self.error_extra_path(environ, start_response) 579 593 … … 600 614 self.egg, self.resource_name, debug_message or '(none)')) 601 615 return exc.wsgi_application(environ, start_response) 602 616 603 def make_pkg_resources(global_conf, egg, resource_name=''): 617 def make_pkg_resources(global_conf, egg, resource_name='', 618 index_file_name = 'index.html'): 604 619 """ 605 620 A static file parser that loads data from an egg using 606 621 ``pkg_resources``. Takes a configuration value ``egg``, which is … … 609 624 """ 610 625 if pkg_resources is None: 611 626 raise NotImplementedError("This function requires pkg_resources.") 612 return PkgResourcesParser(egg, resource_name )627 return PkgResourcesParser(egg, resource_name, index_file_name) 613 628 614 629 def make_url_parser(global_conf, directory, base_python_name, 615 630 index_names=None, hide_extensions=None,
