aboutsummaryrefslogtreecommitdiffstats
path: root/lib/python2.7/site-packages/Twisted-12.2.0-py2.7-linux-x86_64.egg/twisted/web/resource.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/python2.7/site-packages/Twisted-12.2.0-py2.7-linux-x86_64.egg/twisted/web/resource.py')
-rwxr-xr-xlib/python2.7/site-packages/Twisted-12.2.0-py2.7-linux-x86_64.egg/twisted/web/resource.py319
1 files changed, 0 insertions, 319 deletions
diff --git a/lib/python2.7/site-packages/Twisted-12.2.0-py2.7-linux-x86_64.egg/twisted/web/resource.py b/lib/python2.7/site-packages/Twisted-12.2.0-py2.7-linux-x86_64.egg/twisted/web/resource.py
deleted file mode 100755
index bf76ce2e..00000000
--- a/lib/python2.7/site-packages/Twisted-12.2.0-py2.7-linux-x86_64.egg/twisted/web/resource.py
+++ /dev/null
@@ -1,319 +0,0 @@
-# -*- test-case-name: twisted.web.test.test_web -*-
-# Copyright (c) Twisted Matrix Laboratories.
-# See LICENSE for details.
-
-"""
-Implementation of the lowest-level Resource class.
-"""
-
-import warnings
-
-from zope.interface import Attribute, implements, Interface
-
-from twisted.python.reflect import prefixedMethodNames
-from twisted.web import http
-
-
-class IResource(Interface):
- """
- A web resource.
- """
-
- isLeaf = Attribute(
- """
- Signal if this IResource implementor is a "leaf node" or not. If True,
- getChildWithDefault will not be called on this Resource.
- """)
-
- def getChildWithDefault(name, request):
- """
- Return a child with the given name for the given request.
- This is the external interface used by the Resource publishing
- machinery. If implementing IResource without subclassing
- Resource, it must be provided. However, if subclassing Resource,
- getChild overridden instead.
- """
-
- def putChild(path, child):
- """
- Put a child IResource implementor at the given path.
- """
-
- def render(request):
- """
- Render a request. This is called on the leaf resource for
- a request. Render must return either a string, which will
- be sent to the browser as the HTML for the request, or
- server.NOT_DONE_YET. If NOT_DONE_YET is returned,
- at some point later (in a Deferred callback, usually)
- call request.write("<html>") to write data to the request,
- and request.finish() to send the data to the browser.
-
- L{twisted.web.error.UnsupportedMethod} can be raised if the
- HTTP verb requested is not supported by this resource.
- """
-
-
-
-def getChildForRequest(resource, request):
- """
- Traverse resource tree to find who will handle the request.
- """
- while request.postpath and not resource.isLeaf:
- pathElement = request.postpath.pop(0)
- request.prepath.append(pathElement)
- resource = resource.getChildWithDefault(pathElement, request)
- return resource
-
-
-
-class Resource:
- """
- I define a web-accessible resource.
-
- I serve 2 main purposes; one is to provide a standard representation for
- what HTTP specification calls an 'entity', and the other is to provide an
- abstract directory structure for URL retrieval.
- """
-
- implements(IResource)
-
- entityType = IResource
-
- server = None
-
- def __init__(self):
- """Initialize.
- """
- self.children = {}
-
- isLeaf = 0
-
- ### Abstract Collection Interface
-
- def listStaticNames(self):
- return self.children.keys()
-
- def listStaticEntities(self):
- return self.children.items()
-
- def listNames(self):
- return self.listStaticNames() + self.listDynamicNames()
-
- def listEntities(self):
- return self.listStaticEntities() + self.listDynamicEntities()
-
- def listDynamicNames(self):
- return []
-
- def listDynamicEntities(self, request=None):
- return []
-
- def getStaticEntity(self, name):
- return self.children.get(name)
-
- def getDynamicEntity(self, name, request):
- if not self.children.has_key(name):
- return self.getChild(name, request)
- else:
- return None
-
- def delEntity(self, name):
- del self.children[name]
-
- def reallyPutEntity(self, name, entity):
- self.children[name] = entity
-
- # Concrete HTTP interface
-
- def getChild(self, path, request):
- """
- Retrieve a 'child' resource from me.
-
- Implement this to create dynamic resource generation -- resources which
- are always available may be registered with self.putChild().
-
- This will not be called if the class-level variable 'isLeaf' is set in
- your subclass; instead, the 'postpath' attribute of the request will be
- left as a list of the remaining path elements.
-
- For example, the URL /foo/bar/baz will normally be::
-
- | site.resource.getChild('foo').getChild('bar').getChild('baz').
-
- However, if the resource returned by 'bar' has isLeaf set to true, then
- the getChild call will never be made on it.
-
- @param path: a string, describing the child
-
- @param request: a twisted.web.server.Request specifying meta-information
- about the request that is being made for this child.
- """
- return NoResource("No such child resource.")
-
-
- def getChildWithDefault(self, path, request):
- """
- Retrieve a static or dynamically generated child resource from me.
-
- First checks if a resource was added manually by putChild, and then
- call getChild to check for dynamic resources. Only override if you want
- to affect behaviour of all child lookups, rather than just dynamic
- ones.
-
- This will check to see if I have a pre-registered child resource of the
- given name, and call getChild if I do not.
- """
- if path in self.children:
- return self.children[path]
- return self.getChild(path, request)
-
-
- def getChildForRequest(self, request):
- warnings.warn("Please use module level getChildForRequest.", DeprecationWarning, 2)
- return getChildForRequest(self, request)
-
-
- def putChild(self, path, child):
- """
- Register a static child.
-
- You almost certainly don't want '/' in your path. If you
- intended to have the root of a folder, e.g. /foo/, you want
- path to be ''.
- """
- self.children[path] = child
- child.server = self.server
-
-
- def render(self, request):
- """
- Render a given resource. See L{IResource}'s render method.
-
- I delegate to methods of self with the form 'render_METHOD'
- where METHOD is the HTTP that was used to make the
- request. Examples: render_GET, render_HEAD, render_POST, and
- so on. Generally you should implement those methods instead of
- overriding this one.
-
- render_METHOD methods are expected to return a string which
- will be the rendered page, unless the return value is
- twisted.web.server.NOT_DONE_YET, in which case it is this
- class's responsibility to write the results to
- request.write(data), then call request.finish().
-
- Old code that overrides render() directly is likewise expected
- to return a string or NOT_DONE_YET.
- """
- m = getattr(self, 'render_' + request.method, None)
- if not m:
- # This needs to be here until the deprecated subclasses of the
- # below three error resources in twisted.web.error are removed.
- from twisted.web.error import UnsupportedMethod
- allowedMethods = (getattr(self, 'allowedMethods', 0) or
- _computeAllowedMethods(self))
- raise UnsupportedMethod(allowedMethods)
- return m(request)
-
-
- def render_HEAD(self, request):
- """
- Default handling of HEAD method.
-
- I just return self.render_GET(request). When method is HEAD,
- the framework will handle this correctly.
- """
- return self.render_GET(request)
-
-
-
-def _computeAllowedMethods(resource):
- """
- Compute the allowed methods on a C{Resource} based on defined render_FOO
- methods. Used when raising C{UnsupportedMethod} but C{Resource} does
- not define C{allowedMethods} attribute.
- """
- allowedMethods = []
- for name in prefixedMethodNames(resource.__class__, "render_"):
- allowedMethods.append(name)
- return allowedMethods
-
-
-
-class ErrorPage(Resource):
- """
- L{ErrorPage} is a resource which responds with a particular
- (parameterized) status and a body consisting of HTML containing some
- descriptive text. This is useful for rendering simple error pages.
-
- @ivar template: A C{str} which will have a dictionary interpolated into
- it to generate the response body. The dictionary has the following
- keys:
-
- - C{"code"}: The status code passed to L{ErrorPage.__init__}.
- - C{"brief"}: The brief description passed to L{ErrorPage.__init__}.
- - C{"detail"}: The detailed description passed to
- L{ErrorPage.__init__}.
-
- @ivar code: An integer status code which will be used for the response.
- @ivar brief: A short string which will be included in the response body.
- @ivar detail: A longer string which will be included in the response body.
- """
-
- template = """
-<html>
- <head><title>%(code)s - %(brief)s</title></head>
- <body>
- <h1>%(brief)s</h1>
- <p>%(detail)s</p>
- </body>
-</html>
-"""
-
- def __init__(self, status, brief, detail):
- Resource.__init__(self)
- self.code = status
- self.brief = brief
- self.detail = detail
-
-
- def render(self, request):
- request.setResponseCode(self.code)
- request.setHeader("content-type", "text/html; charset=utf-8")
- return self.template % dict(
- code=self.code,
- brief=self.brief,
- detail=self.detail)
-
-
- def getChild(self, chnam, request):
- return self
-
-
-
-class NoResource(ErrorPage):
- """
- L{NoResource} is a specialization of L{ErrorPage} which returns the HTTP
- response code I{NOT FOUND}.
- """
- def __init__(self, message="Sorry. No luck finding that resource."):
- ErrorPage.__init__(self, http.NOT_FOUND,
- "No Such Resource",
- message)
-
-
-
-class ForbiddenResource(ErrorPage):
- """
- L{ForbiddenResource} is a specialization of L{ErrorPage} which returns the
- I{FORBIDDEN} HTTP response code.
- """
- def __init__(self, message="Sorry, resource is forbidden."):
- ErrorPage.__init__(self, http.FORBIDDEN,
- "Forbidden Resource",
- message)
-
-
-__all__ = [
- 'IResource', 'getChildForRequest',
- 'Resource', 'ErrorPage', 'NoResource', 'ForbiddenResource']