~landscape/zope3/newer-from-ztk

« back to all changes in this revision

Viewing changes to src/twisted/web/vhost.py

  • Committer: Thomas Hervé
  • Date: 2009-07-08 13:52:04 UTC
  • Revision ID: thomas@canonical.com-20090708135204-df5eesrthifpylf8
Remove twisted copy

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
 
2
 
# Copyright (c) 2001-2004 Twisted Matrix Laboratories.
3
 
# See LICENSE for details.
4
 
 
5
 
 
6
 
"""I am a virtual hosts implementation.
7
 
"""
8
 
 
9
 
# System Imports
10
 
import string
11
 
 
12
 
# Twisted Imports
13
 
from twisted.python import roots
14
 
 
15
 
# Sibling Imports
16
 
import resource
17
 
import error
18
 
 
19
 
class VirtualHostCollection(roots.Homogenous):
20
 
    """Wrapper for virtual hosts collection.
21
 
 
22
 
    This exists for configuration purposes.
23
 
    """
24
 
    entityType = resource.Resource
25
 
 
26
 
    def __init__(self, nvh):
27
 
        self.nvh = nvh
28
 
    
29
 
    def listStaticEntities(self):
30
 
        return self.nvh.hosts.items()
31
 
    
32
 
    def getStaticEntity(self, name):
33
 
        return self.nvh.hosts.get(self)
34
 
    
35
 
    def reallyPutEntity(self, name, entity):
36
 
        self.nvh.addHost(name, entity)
37
 
 
38
 
    def delEntity(self, name):
39
 
        self.nvh.removeHost(name)
40
 
 
41
 
 
42
 
class NameVirtualHost(resource.Resource):
43
 
    """I am a resource which represents named virtual hosts.
44
 
    """
45
 
 
46
 
    default = None
47
 
 
48
 
    def __init__(self):
49
 
        """Initialize.
50
 
        """
51
 
        resource.Resource.__init__(self)
52
 
        self.hosts = {}
53
 
 
54
 
    def listStaticEntities(self):
55
 
        return resource.Resource.listStaticEntities(self) + [("Virtual Hosts", VirtualHostCollection(self))]
56
 
 
57
 
    def getStaticEntity(self, name):
58
 
        if name == "Virtual Hosts":
59
 
            return VirtualHostCollection(self)
60
 
        else:
61
 
            return resource.Resource.getStaticEntity(self, name)
62
 
 
63
 
    def addHost(self, name, resrc):
64
 
        """Add a host to this virtual host.
65
 
 
66
 
        This will take a host named `name', and map it to a resource
67
 
        `resrc'.  For example, a setup for our virtual hosts would be::
68
 
 
69
 
            nvh.addHost('divunal.com', divunalDirectory)
70
 
            nvh.addHost('www.divunal.com', divunalDirectory)
71
 
            nvh.addHost('twistedmatrix.com', twistedMatrixDirectory)
72
 
            nvh.addHost('www.twistedmatrix.com', twistedMatrixDirectory)
73
 
        """
74
 
        self.hosts[name] = resrc
75
 
 
76
 
    def removeHost(self, name):
77
 
        """Remove a host."""
78
 
        del self.hosts[name]
79
 
    
80
 
    def _getResourceForRequest(self, request):
81
 
        """(Internal) Get the appropriate resource for the given host.
82
 
        """
83
 
        hostHeader = request.getHeader('host')
84
 
        if hostHeader == None:
85
 
            return self.default or error.NoResource()
86
 
        else:
87
 
            host = string.split(string.lower(hostHeader),':')[0]
88
 
        return (self.hosts.get(host, self.default)
89
 
                or error.NoResource("host %s not in vhost map" % repr(host)))
90
 
 
91
 
    def render(self, request):
92
 
        """Implementation of resource.Resource's render method.
93
 
        """
94
 
        resrc = self._getResourceForRequest(request)
95
 
        return resrc.render(request)
96
 
 
97
 
    def getChild(self, path, request):
98
 
        """Implementation of resource.Resource's getChild method.
99
 
        """
100
 
        resrc = self._getResourceForRequest(request)
101
 
        if resrc.isLeaf:
102
 
            request.postpath.insert(0,request.prepath.pop(-1))
103
 
            return resrc
104
 
        else:
105
 
            return resrc.getChildWithDefault(path, request)
106
 
 
107
 
class _HostResource(resource.Resource):
108
 
 
109
 
    def getChild(self, path, request):
110
 
        if ':' in path:
111
 
            host, port = path.split(':', 1)
112
 
            port = int(port)
113
 
        else:
114
 
            host, port = path, 80
115
 
        request.setHost(host, port)
116
 
        prefixLen = 3+request.isSecure()+4+len(path)+len(request.prepath[-3])
117
 
        request.path = '/'+'/'.join(request.postpath)
118
 
        request.uri = request.uri[prefixLen:]
119
 
        del request.prepath[:3]
120
 
        return request.site.getResourceFor(request)
121
 
 
122
 
 
123
 
class VHostMonsterResource(resource.Resource):
124
 
 
125
 
    """
126
 
    Use this to be able to record the hostname and method (http vs. https)
127
 
    in the URL without disturbing your web site. If you put this resource
128
 
    in a URL http://foo.com/bar then requests to
129
 
    http://foo.com/bar/http/baz.com/something will be equivalent to
130
 
    http://foo.com/something, except that the hostname the request will
131
 
    appear to be accessing will be "baz.com". So if "baz.com" is redirecting
132
 
    all requests for to foo.com, while foo.com is inaccessible from the outside,
133
 
    then redirect and url generation will work correctly
134
 
    """
135
 
    def getChild(self, path, request):
136
 
        if path == 'http':
137
 
            request.isSecure = lambda: 0
138
 
        elif path == 'https':
139
 
            request.isSecure = lambda: 1
140
 
        return _HostResource()
141