~loggerhead-team/loggerhead/trunk-rich

« back to all changes in this revision

Viewing changes to __init__.py

  • Committer: John Arbash Meinel
  • Date: 2011-02-10 02:33:15 UTC
  • mto: This revision was merged to the branch mainline in revision 441.
  • Revision ID: john@arbash-meinel.com-20110210023315-515pkynlfpfs3cvm
Fix bug #716201 by suppressing body content when getting a HEAD request.

This adds some WSGI middleware that suppresses returning body content if a HEAD request
is received.

Note that we don't yet pass GET down to the lower levels, so they could still
decide whether they can do less work or not. We may want to make the standard BranchWSGIApp
do less work under those circumstances.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright 2009 Canonical Ltd
 
1
# Copyright 2009, 2010, 2011 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
26
26
 
27
27
"""Loggerhead web viewer for Bazaar branches.
28
28
 
29
 
This provides a new option "--http" to the "bzr serve" command, that 
 
29
This provides a new option "--http" to the "bzr serve" command, that
30
30
starts a web server to browse the contents of a branch.
31
31
"""
32
32
 
33
 
version_info = (1, 11, 0)
 
33
from info import (
 
34
    bzr_plugin_version as version_info,
 
35
    bzr_compatible_versions,
 
36
    )
34
37
 
35
38
if __name__ == 'bzrlib.plugins.loggerhead':
36
39
    import bzrlib
37
40
    from bzrlib.api import require_any_api
38
41
 
39
 
    require_any_api(bzrlib, [(1, 13, 0), (1, 15, 0), (1, 16, 0), (1, 17, 0)])
 
42
    require_any_api(bzrlib, bzr_compatible_versions)
40
43
 
41
44
    # NB: Normally plugins should lazily load almost everything, but this
42
45
    # seems reasonable to have in-line here: bzrlib.commands and options are
56
59
    HELP = ('Loggerhead, a web-based code viewer and server. (default port: %d)' %
57
60
            (DEFAULT_PORT,))
58
61
 
59
 
    def serve_http(transport, host=None, port=None, inet=None):
 
62
    def setup_logging(config):
 
63
        import logging
 
64
        import sys
 
65
 
 
66
        logger = logging.getLogger('loggerhead')
 
67
        handler = logging.StreamHandler(sys.stderr)
 
68
        handler.setLevel(logging.DEBUG)
 
69
        logger.addHandler(handler)
 
70
        logging.getLogger('simpleTAL').addHandler(handler)
 
71
        logging.getLogger('simpleTALES').addHandler(handler)
 
72
 
 
73
 
 
74
    def _ensure_loggerhead_path():
 
75
        """Ensure that you can 'import loggerhead' and get the root."""
60
76
        # loggerhead internal code will try to 'import loggerhead', so
61
77
        # let's put it on the path if we can't find it in the existing path
62
78
        try:
63
 
            import loggerhead
 
79
            import loggerhead.apps.transport
64
80
        except ImportError:
65
81
            import os.path, sys
66
82
            sys.path.append(os.path.dirname(__file__))
67
83
 
 
84
    def serve_http(transport, host=None, port=None, inet=None):
 
85
        # TODO: if we supported inet to pass requests in and respond to them,
 
86
        #       then it would be easier to test the full stack, but it probably
 
87
        #       means routing around paste.httpserver.serve which probably
 
88
        #       isn't testing the full stack
 
89
        from paste.httpexceptions import HTTPExceptionHandler
 
90
        from paste.httpserver import serve
 
91
 
 
92
        _ensure_loggerhead_path()
 
93
 
 
94
        from loggerhead.apps.http_head import HeadMiddleware
68
95
        from loggerhead.apps.transport import BranchesFromTransportRoot
69
96
        from loggerhead.config import LoggerheadConfig
70
 
        from paste.httpexceptions import HTTPExceptionHandler
71
 
        from paste.httpserver import serve
 
97
 
72
98
        if host is None:
73
99
            host = DEFAULT_HOST
74
100
        if port is None:
77
103
        if not transport.is_readonly():
78
104
            argv.insert(0, '--allow-writes')
79
105
        config = LoggerheadConfig(argv)
80
 
        app = BranchesFromTransportRoot(transport, config)
 
106
        setup_logging(config)
 
107
        app = BranchesFromTransportRoot(transport.base, config)
 
108
        app = HeadMiddleware(app)
81
109
        app = HTTPExceptionHandler(app)
82
110
        serve(app, host=host, port=port)
83
111
 
116
144
                    super(cmd_serve, self).run(*args, **kw)
117
145
 
118
146
        register_command(cmd_serve)
 
147
 
 
148
    def load_tests(standard_tests, module, loader):
 
149
        _ensure_loggerhead_path()
 
150
        standard_tests.addTests(loader.loadTestsFromModuleNames(
 
151
            ['bzrlib.plugins.loggerhead.loggerhead.tests']))
 
152
        return standard_tests