~ubuntu-branches/ubuntu/natty/flup/natty

« back to all changes in this revision

Viewing changes to flup/resolver/resolver.py

  • Committer: Bazaar Package Importer
  • Author(s): Kai Hendry
  • Date: 2007-09-12 20:22:04 UTC
  • mfrom: (1.2.1 upstream) (4 gutsy)
  • mto: This revision was merged to the branch mainline in revision 5.
  • Revision ID: james.westby@ubuntu.com-20070912202204-fg63etr9vzaf8hea
* New upstream release
* http://www.saddi.com/software/news/archives/58-flup-1.0-released.html
* Added a note in the description that people should probably start thinking
  of moving to modwsgi.org

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (c) 2002, 2005 Allan Saddi <allan@saddi.com>
2
 
# All rights reserved.
3
 
#
4
 
# Redistribution and use in source and binary forms, with or without
5
 
# modification, are permitted provided that the following conditions
6
 
# are met:
7
 
# 1. Redistributions of source code must retain the above copyright
8
 
#    notice, this list of conditions and the following disclaimer.
9
 
# 2. Redistributions in binary form must reproduce the above copyright
10
 
#    notice, this list of conditions and the following disclaimer in the
11
 
#    documentation and/or other materials provided with the distribution.
12
 
#
13
 
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14
 
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15
 
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16
 
# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17
 
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18
 
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19
 
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20
 
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21
 
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22
 
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23
 
# SUCH DAMAGE.
24
 
#
25
 
# $Id: resolver.py 1833 2005-12-17 00:58:10Z asaddi $
26
 
 
27
 
__author__ = 'Allan Saddi <allan@saddi.com>'
28
 
__version__ = '$Revision: 1833 $'
29
 
 
30
 
__all__ = ['Resolver']
31
 
 
32
 
class Resolver(object):
33
 
    """
34
 
    Abstract base class for 'Resolver' objects. (An instance of which is
35
 
    passed to Publisher's constructor.)
36
 
 
37
 
    Given a Request, either return a callable (Publisher expects it to
38
 
    be a function, method, class, or callable instance), or return None.
39
 
    Typically Request.pathInfo is used to resolve the function.
40
 
    Request.environ may be modified by the Resolver, for example, to re-adjust
41
 
    SCRIPT_NAME/PATH_INFO after successful resolution. It is NOT recommended
42
 
    that it be modified if resolution fails.
43
 
 
44
 
    When resolving an InternalRedirect, redirect will be True.
45
 
    """
46
 
    def resolve(self, request, redirect=False):
47
 
        raise NotImplementedError, self.__class__.__name__ + '.resolve'
48
 
 
49
 
    def _updatePath(self, request, num):
50
 
        """
51
 
        Utility function to update SCRIPT_NAME and PATH_INFO in a sane
52
 
        manner. Transfers num components from PATH_INFO to SCRIPT_NAME.
53
 
        Keeps URL path parameters intact.
54
 
        """
55
 
        assert num >= 0
56
 
        if not num:
57
 
            return # Nothing to do
58
 
        numScriptName = len(request.scriptName.split('/'))
59
 
        totalPath = request.scriptName + request.pathInfo
60
 
        if __debug__:
61
 
            origTotalPath = totalPath
62
 
        # Extract and save params
63
 
        i = totalPath.find(';')
64
 
        if i >= 0:
65
 
            params = totalPath[i:]
66
 
            totalPath = totalPath[:i]
67
 
        else:
68
 
            params = ''
69
 
        totalPath = totalPath.split('/')
70
 
        scriptName = '/'.join(totalPath[:numScriptName + num])
71
 
        pathInfo = '/'.join([''] + totalPath[numScriptName + num:])
72
 
        # SCRIPT_NAME shouldn't have trailing slash
73
 
        if scriptName.endswith('/'):
74
 
            scriptName = scriptName[:-1]
75
 
            # Transfer to PATH_INFO (most likely empty, but just to be safe...)
76
 
            pathInfo = '/' + pathInfo
77
 
        request.environ['SCRIPT_NAME'] = scriptName
78
 
        request.environ['PATH_INFO'] = pathInfo + params
79
 
        assert request.scriptName + request.pathInfo == origTotalPath