~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/transport/http/wsgi.py

  • Committer: Patch Queue Manager
  • Date: 2011-09-15 15:37:20 UTC
  • mfrom: (6140.1.3 trunk)
  • Revision ID: pqm@pqm.ubuntu.com-20110915153720-n17t6m5oh5bblqad
(vila) Open 2.5b2 for bugfixes (Vincent Ladeuil)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006 Canonical Ltd
 
1
# Copyright (C) 2006-2010 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
12
12
#
13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
 
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
16
 
17
17
"""WSGI application for bzr HTTP smart server.
18
18
 
22
22
 
23
23
from cStringIO import StringIO
24
24
 
25
 
from bzrlib.smart import protocol, medium
 
25
from bzrlib.smart import medium
26
26
from bzrlib.transport import chroot, get_transport
27
27
from bzrlib.urlutils import local_path_to_url
28
 
    
29
 
 
30
 
def make_app(root, prefix, path_var='REQUEST_URI', readonly=True):
 
28
 
 
29
 
 
30
def make_app(root, prefix, path_var='REQUEST_URI', readonly=True,
 
31
    load_plugins=True, enable_logging=True):
31
32
    """Convenience function to construct a WSGI bzr smart server.
32
 
    
 
33
 
33
34
    :param root: a local path that requests will be relative to.
34
35
    :param prefix: See RelpathSetter.
35
36
    :param path_var: See RelpathSetter.
39
40
        base_transport = get_transport('readonly+' + local_url)
40
41
    else:
41
42
        base_transport = get_transport(local_url)
 
43
    if load_plugins:
 
44
        from bzrlib.plugin import load_plugins
 
45
        load_plugins()
 
46
    if enable_logging:
 
47
        import bzrlib.trace
 
48
        bzrlib.trace.enable_default_logging()
42
49
    app = SmartWSGIApp(base_transport, prefix)
43
50
    app = RelpathSetter(app, '', path_var)
44
51
    return app
46
53
 
47
54
class RelpathSetter(object):
48
55
    """WSGI middleware to set 'bzrlib.relpath' in the environ.
49
 
    
 
56
 
50
57
    Different servers can invoke a SmartWSGIApp in different ways.  This
51
58
    middleware allows an adminstrator to configure how to the SmartWSGIApp will
52
59
    determine what path it should be serving for a given request for many common
58
65
    prefix="/some/prefix/" and path_var="REQUEST_URI" will set that request's
59
66
    'bzrlib.relpath' variable to "repo/branch".
60
67
    """
61
 
    
 
68
 
62
69
    def __init__(self, app, prefix='', path_var='REQUEST_URI'):
63
70
        """Constructor.
64
71
 
94
101
            backing_transport.  This is used to interpret relpaths received from
95
102
            the client.
96
103
        """
97
 
        # Use a ChrootTransportDecorator so that this web application won't
 
104
        # Use a ChrootServer so that this web application won't
98
105
        # accidentally let people access locations they shouldn't.
99
106
        # e.g. consider a smart server request for "get /etc/passwd" or
100
107
        # something.
101
108
        self.chroot_server = chroot.ChrootServer(backing_transport)
102
 
        self.chroot_server.setUp()
 
109
        self.chroot_server.start_server()
103
110
        self.backing_transport = get_transport(self.chroot_server.get_url())
104
111
        self.root_client_path = root_client_path
105
112
        # While the chroot server can technically be torn down at this point,
106
 
        # as all it does is remove the scheme registration from transport's 
107
 
        # protocol dictionary, we don't *just in case* there are parts of 
 
113
        # as all it does is remove the scheme registration from transport's
 
114
        # protocol dictionary, we don't *just in case* there are parts of
108
115
        # bzrlib that will invoke 'get_transport' on urls rather than cloning
109
116
        # around the existing transport.
110
 
        #self.chroot_server.tearDown()
 
117
        #self.chroot_server.stop_server()
111
118
 
112
119
    def __call__(self, environ, start_response):
113
120
        """WSGI application callable."""
169
176
    def make_request(self, transport, write_func, request_bytes, rcp):
170
177
        protocol_factory, unused_bytes = medium._get_protocol_factory_for_bytes(
171
178
            request_bytes)
172
 
        server_protocol = protocol_factory(transport, write_func, rcp)
 
179
        server_protocol = protocol_factory(
 
180
            transport, write_func, rcp, self.backing_transport)
173
181
        server_protocol.accept_bytes(unused_bytes)
174
182
        return server_protocol