~loggerhead-team/loggerhead/trunk-rich

« back to all changes in this revision

Viewing changes to loggerhead/apps/http_head.py

  • Committer: William Grant
  • Date: 2011-03-24 23:02:29 UTC
  • mfrom: (441.1.7 xss-fix)
  • Revision ID: william.grant@canonical.com-20110324230229-zq85fy6aqvlyylbu
Improve escaping of filenames in revision views. Fixes a couple of XSS holes.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright (C) 2011 Canonical Ltd.
 
2
#
 
3
# This program is free software; you can redistribute it and/or modify
 
4
# it under the terms of the GNU General Public License as published by
 
5
# the Free Software Foundation; either version 2 of the License, or
 
6
# (at your option) any later version.
 
7
#
 
8
# This program is distributed in the hope that it will be useful,
 
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
11
# GNU General Public License for more details.
 
12
#
 
13
# You should have received a copy of the GNU General Public License
 
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
 
16
#
 
17
"""WSGI apps tend to return body content as part of a HEAD request.
 
18
 
 
19
We should definitely not do that.
 
20
"""
 
21
 
 
22
class HeadMiddleware(object):
 
23
    """When we get a HEAD request, we should not return body content.
 
24
 
 
25
    WSGI defaults to just generating everything, and not paying attention to
 
26
    whether it is a GET or a HEAD request. It does that because of potential
 
27
    issues getting the Headers correct.
 
28
 
 
29
    This middleware works by just omitting the body if the request method is
 
30
    HEAD.
 
31
    """
 
32
 
 
33
    def __init__(self, app):
 
34
        self._wrapped_app = app
 
35
        self._real_environ = None
 
36
        self._real_start_response = None
 
37
        self._real_writer = None
 
38
 
 
39
    def noop_write(self, chunk):
 
40
        """We intentionally ignore all body content that is returned."""
 
41
        pass
 
42
 
 
43
    def start_response(self, status, response_headers, exc_info=None):
 
44
        if exc_info is None:
 
45
            self._real_writer = self._real_start_response(status,
 
46
                response_headers)
 
47
        else:
 
48
            self._real_writer = self._real_start_response(status,
 
49
                response_headers, exc_info)
 
50
        return self.noop_write
 
51
 
 
52
    def __call__(self, environ, start_response):
 
53
        self._real_environ = environ
 
54
        self._real_start_response = start_response
 
55
        if environ.get('REQUEST_METHOD', 'GET') == 'HEAD':
 
56
            result = self._wrapped_app(environ, self.start_response)
 
57
            for chunk in result:
 
58
                pass
 
59
        else:
 
60
            result = self._wrapped_app(environ, start_response)
 
61
            for chunk in result:
 
62
                yield chunk