Beispiel #1
0
    def test_non_utf8_url_image(self):
        response = []

        def mock_start_response(status, headers, exc_info=None):
            response.extend((status, headers))

        def mock_app(environ, start_response):
            self.failIf('bitblt' in environ.get('PATH_INFO'))
            response = webob.Response(jpeg_image_data,
                                      content_type='image/jpeg')
            return response(environ, start_response)

        middleware = self._makeOne(mock_app)

        width = height = "32"
        signature = transform.compute_signature(width, height,
                                                middleware.secret)

        request = webob.Request.blank(
            'not-utf-8-\xfe/bitblt-%sx%s-%s/foo.jpg' %
            (width, height, signature))

        result = middleware(request.environ, mock_start_response)
        status, headers = response

        self.assertEqual(status, '200 OK')
        self.assertNotEqual(''.join(result), jpeg_image_data)
Beispiel #2
0
    def test_call_no_transform_on_HEAD_removes_content_length(self):
        response = []

        def mock_start_response(status, headers, exc_info=None):
            response.extend((status, headers))

        def mock_app(environ, start_response):
            self.failIf('bitblt' in environ.get('PATH_INFO'))
            response = webob.Response(jpeg_image_data,
                                      content_type='image/jpeg')
            return response(environ, start_response)

        middleware = self._makeOne(mock_app)

        width = height = "32"
        signature = transform.compute_signature(width, height,
                                                middleware.secret)

        request = webob.Request.blank('bitblt-%sx%s-%s/foo.jpg' %
                                      (width, height, signature),
                                      method='HEAD')

        result = middleware(request.environ, mock_start_response)
        response_length = len("".join(result))
        status, headers = response

        headers = ResponseHeaders(headers)
        self.assertEqual(status, '200 OK')
        self.assertEqual(headers['content-type'], 'image/jpeg')
        self.assertTrue('content-length' not in headers)
Beispiel #3
0
    def test_call_content_type_is_image(self):
        response = []

        def mock_start_response(status, headers, exc_info=None):
            response.extend((status, headers))
            
        def mock_app(environ, start_response):
            self.failIf('bitblt' in environ.get('PATH_INFO'))
            response = webob.Response(jpeg_image_data, content_type='image/jpeg')
            response(environ, start_response)
            return (response.body,)

        middleware = self._makeOne(mock_app)

        width = height = "32"
        signature = transform.compute_signature(width, height, middleware.secret)
        
        request = webob.Request.blank('bitblt-%sx%s-%s/foo.jpg' % (
            width, height, signature))

        result = middleware(request.environ, mock_start_response)
        self.assertEqual(len("".join(result)), 1050)
        status, headers = response
        headers = webob.HeaderDict(headers)
        self.assertEqual(status, '200 OK')
        self.assertEqual(headers['content-type'], 'image/jpeg')
        self.assertEqual(headers['content-length'], '1050')
Beispiel #4
0
    def test_rewrite_html_ns(self):
        body = '''\
        <html xmlns="http://www.w3.org/1999/xhtml"
              xmlns:esi="http://www.edge-delivery.org/esi/1.0">
          <body>
            <img src="foo.png" width="640" height="480" />
            <esi:include src="somehwere" />
          </body>
        </html>'''
        request = webob.Request.blank("")

        def mock_app(environ, start_response):
            response = webob.Response(body, content_type='text/html')
            return response(environ, start_response)

        response = []

        def start_response(*args):
            response.extend(args)

        middleware = self._makeOne(mock_app, try_xhtml=True)
        result = middleware(request.environ, start_response)
        width = "640"
        height = "480"
        signature = transform.compute_signature(width, height,
                                                middleware.secret)
        directive = "bitblt-%sx%s-%s" % (width, height, signature)
        body = "".join(result)
        self.failUnless("%s/foo.png" % directive in body)
        self.failUnless('<esi:include src="somehwere"' in body)
        self.assertEqual(response, [
            '200 OK',
            [('Content-Type', 'text/html; charset=UTF-8'),
             ('Content-Length', str(len(body)))]
        ])
Beispiel #5
0
    def test_rewrite_html_ns(self):
        body = '''\
        <html xmlns="http://www.w3.org/1999/xhtml"
              xmlns:esi="http://www.edge-delivery.org/esi/1.0">
          <body>
            <img src="foo.png" width="640" height="480" />
            <esi:include src="somehwere" />
          </body>
        </html>'''
        request = webob.Request.blank("")
        
        def mock_app(environ, start_response):
            response = webob.Response(body, content_type='text/html')
            response(environ, start_response)
            return (response.body,)
            
        response = []
        def start_response(*args):
            response.extend(args)

        middleware = self._makeOne(mock_app, try_xhtml=True)
        result = middleware(request.environ, start_response)
        width = "640"
        height = "480"
        signature = transform.compute_signature(width, height, middleware.secret)
        directive = "bitblt-%sx%s-%s" % (width, height, signature)
        body = "".join(result)
        self.failUnless("%s/foo.png" % directive in body)
        self.failUnless('<esi:include src="somehwere"' in body)
        self.assertEqual(response, [
            '200 OK', [('Content-Type', 'text/html; charset=UTF-8'),
                       ('Content-Length', '300')]])
Beispiel #6
0
    def test_call_no_transform_on_HEAD_removes_content_length(self):
        response = []

        def mock_start_response(status, headers, exc_info=None):
            response.extend((status, headers))

        def mock_app(environ, start_response):
            self.failIf('bitblt' in environ.get('PATH_INFO'))
            response = webob.Response(jpeg_image_data, content_type='image/jpeg')
            return response(environ, start_response)

        middleware = self._makeOne(mock_app)

        width = height = "32"
        signature = transform.compute_signature(width, height, middleware.secret)

        request = webob.Request.blank(
                'bitblt-%sx%s-%s/foo.jpg' % (width, height, signature),
                method='HEAD')

        result = middleware(request.environ, mock_start_response)
        response_length = len("".join(result))
        status, headers = response

        headers = ResponseHeaders(headers)
        self.assertEqual(status, '200 OK')
        self.assertEqual(headers['content-type'], 'image/jpeg')
        self.assertTrue('content-length' not in headers)
Beispiel #7
0
    def test_rewrite_html_limited_to_application_url(self):
        body = '''\
        <html>
          <body>
            <img src="foo.png" width="640" height="480" />
            <img src="http://host/bar.png" width="640" height="480" />
            <img src="http://host/path/hat.png" width="640" height="480" />
            <img src="blubb.png" />
            <img src="blah.png" width="640" />
          </body>
        </html>'''

        request = webob.Request.blank("")

        def mock_app(environ, start_response):
            response = webob.Response(body, content_type='text/html')
            return response(environ, start_response)

        response = []

        def start_response(*args):
            response.extend(args)

        middleware = self._makeOne(mock_app, limit_to_application_url=True)
        result = middleware(request.environ, start_response)
        width = "640"
        height = "480"
        signature = transform.compute_signature(width, height,
                                                middleware.secret)
        directive = "bitblt-%sx%s-%s" % (width, height, signature)
        body = "".join(result)
        self.failUnless('DOCTYPE' not in body, body)
        self.failUnless("%s/foo.png" % directive in body)
        self.failUnless("http://host/bar.png" in body)
        self.failUnless("http://host/path/hat.png" in body)
        self.failUnless('<img src="blubb.png" />' in body)
        height = None
        signature = transform.compute_signature(width, height,
                                                middleware.secret)
        directive = "bitblt-%sx%s-%s" % (width, height, signature)
        self.failUnless("%s/blah.png" % directive in body)
        self.assertEqual(response, [
            '200 OK',
            [('Content-Type', 'text/html; charset=UTF-8'),
             ('Content-Length', str(len(body)))]
        ])
Beispiel #8
0
    def test_rewrite_html(self):
        body = '''\
        <html>
          <body>
            <img src="foo.png" width="640" height="480" />
            <img src="http://host/bar.png" width="640" height="480" />
            <img src="http://host/path/hat.png" width="640" height="480" />
            <img src="blubb.png" />
            <img src="blah.png" width="640" />
          </body>
        </html>'''

        request = webob.Request.blank("")
        
        def mock_app(environ, start_response):
            response = webob.Response(body, content_type='text/html')
            response(environ, start_response)
            return (response.body,)
            
        response = []
        def start_response(*args):
            response.extend(args)

        middleware = self._makeOne(mock_app)
        result = middleware(request.environ, start_response)
        width = "640"
        height = "480"
        signature = transform.compute_signature(width, height, middleware.secret)
        directive = "bitblt-%sx%s-%s" % (width, height, signature)
        body = "".join(result)
        self.failUnless("%s/foo.png" % directive in body)
        self.failUnless("http://host/%s/bar.png" % directive in body)
        self.failUnless("http://host/path/%s/hat.png" % directive in body)
        self.failUnless('<img src="blubb.png">' in body)
        height = None
        signature = transform.compute_signature(width, height, middleware.secret)
        directive = "bitblt-%sx%s-%s" % (width, height, signature)
        self.failUnless("%s/blah.png" % directive in body)
        self.assertEqual(response, [
            '200 OK', [('Content-Type', 'text/html; charset=UTF-8'),
                       ('Content-Length', '478')]])
Beispiel #9
0
    def test_non_utf8_url_image(self):
        response = []

        def mock_start_response(status, headers, exc_info=None):
            response.extend((status, headers))

        def mock_app(environ, start_response):
            self.failIf('bitblt' in environ.get('PATH_INFO'))
            response = webob.Response(jpeg_image_data, content_type='image/jpeg')
            return response(environ, start_response)

        middleware = self._makeOne(mock_app)

        width = height = "32"
        signature = transform.compute_signature(width, height, middleware.secret)

        request = webob.Request.blank('not-utf-8-\xfe/bitblt-%sx%s-%s/foo.jpg' % (
            width, height, signature))

        result = middleware(request.environ, mock_start_response)
        status, headers = response

        self.assertEqual(status, '200 OK')
        self.assertNotEqual(''.join(result), jpeg_image_data)
Beispiel #10
0
    def test_rewrite_html(self):
        body = '''<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
        <html>
          <body>
            <img src="foo.png" width="640" height="480" />
            <img src="/fob.png" width="640" height="480" />
            <img src="path/foc.png" width="640" height="480" />
            <img src="/path/fod.png" width="640" height="480" />
            <img src="http://host/bar.png" width="640" height="480" />
            <img src="http://host/path/hat.png" width="640" height="480" />
            <img src="blubb.png" />
            <img src="blah.png" width="640" />

            Images with % sizes should not be rewritten, only the browser knows
            how big the images should be. They are based on available space, not
            original image dimensions.
            See http://www.w3.org/TR/html4/types.html#h-6.6.
                <img src="percentage.png" width="100%" />
                <img src="percentage.png" width="50%" height="50%"/>
                <img src="percentage.png" height="20%" />

            Image tags with px are used in the real world, we should rewrite them:
                <img src="pixels.png" width="640px" height="480px"/>
                <img src="pixels.png" width="640px" />
          </body>
        </html>'''

        request = webob.Request.blank("")

        def mock_app(environ, start_response):
            response = webob.Response(body, content_type='text/html')
            return response(environ, start_response)

        response = []

        def start_response(*args):
            response.extend(args)

        middleware = self._makeOne(mock_app)
        result = middleware(request.environ, start_response)
        width = "640"
        height = "480"
        signature = transform.compute_signature(width, height,
                                                middleware.secret)
        directive = "bitblt-%sx%s-%s" % (width, height, signature)
        body = "".join(result)
        self.failUnless(body.startswith('<!DOCTYPE'))
        self.failUnless('src="%s/foo.png"' % directive in body)
        self.failUnless('src="/%s/fob.png"' % directive in body)
        self.failUnless('src="path/%s/foc.png"' % directive in body)
        self.failUnless('src="/path/%s/fod.png"' % directive in body)
        self.failUnless('src="http://host/%s/bar.png"' % directive in body)
        self.failUnless('src="http://host/path/%s/hat.png"' %
                        directive in body)
        self.failUnless('src="blubb.png" />' in body)
        self.failUnless('src="percentage.png" width="100%"' in body)
        self.failUnless(
            'src="percentage.png" width="50%" height="50%"' in body)
        self.failUnless('src="percentage.png" height="20%"' in body)
        self.failUnless('src="%s/pixels.png" width="640px" height="480px"' %
                        directive in body)
        height = None
        signature = transform.compute_signature(width, height,
                                                middleware.secret)
        directive = "bitblt-%sx%s-%s" % (width, height, signature)
        self.failUnless("%s/blah.png" % directive in body)
        self.failUnless('src="%s/pixels.png" width="640px"' %
                        directive in body)
        self.assertEqual(response, [
            '200 OK',
            [('Content-Type', 'text/html; charset=UTF-8'),
             ('Content-Length', str(len(body)))]
        ])
Beispiel #11
0
 def make_request(secret):
     width = height = 100
     signature = transform.compute_signature(width, height, secret)
     return webob.Request.blank('bitblt-%sx%s-%s/foo.jpg' %
                                (width, height, signature))
Beispiel #12
0
    def test_rewrite_html(self):
        body = '''<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
        <html>
          <body>
            <img src="foo.png" width="640" height="480" />
            <img src="/fob.png" width="640" height="480" />
            <img src="path/foc.png" width="640" height="480" />
            <img src="/path/fod.png" width="640" height="480" />
            <img src="http://host/bar.png" width="640" height="480" />
            <img src="http://host/path/hat.png" width="640" height="480" />
            <img src="blubb.png" />
            <img src="blah.png" width="640" />

            Images with % sizes should not be rewritten, only the browser knows
            how big the images should be. They are based on available space, not
            original image dimensions.
            See http://www.w3.org/TR/html4/types.html#h-6.6.
                <img src="percentage.png" width="100%" />
                <img src="percentage.png" width="50%" height="50%"/>
                <img src="percentage.png" height="20%" />

            Image tags with px are used in the real world, we should rewrite them:
                <img src="pixels.png" width="640px" height="480px"/>
                <img src="pixels.png" width="640px" />
          </body>
        </html>'''

        request = webob.Request.blank("")

        def mock_app(environ, start_response):
            response = webob.Response(body, content_type='text/html')
            return response(environ, start_response)

        response = []
        def start_response(*args):
            response.extend(args)

        middleware = self._makeOne(mock_app)
        result = middleware(request.environ, start_response)
        width = "640"
        height = "480"
        signature = transform.compute_signature(width, height, middleware.secret)
        directive = "bitblt-%sx%s-%s" % (width, height, signature)
        body = "".join(result)
        self.failUnless(body.startswith('<!DOCTYPE'))
        self.failUnless('src="%s/foo.png"' % directive in body)
        self.failUnless('src="/%s/fob.png"' % directive in body)
        self.failUnless('src="path/%s/foc.png"' % directive in body)
        self.failUnless('src="/path/%s/fod.png"' % directive in body)
        self.failUnless('src="http://host/%s/bar.png"' % directive in body)
        self.failUnless('src="http://host/path/%s/hat.png"' % directive in body)
        self.failUnless('src="blubb.png" />' in body)
        self.failUnless('src="percentage.png" width="100%"' in body)
        self.failUnless('src="percentage.png" width="50%" height="50%"' in body)
        self.failUnless('src="percentage.png" height="20%"' in body)
        self.failUnless('src="%s/pixels.png" width="640px" height="480px"' % directive in body)
        height = None
        signature = transform.compute_signature(width, height, middleware.secret)
        directive = "bitblt-%sx%s-%s" % (width, height, signature)
        self.failUnless("%s/blah.png" % directive in body)
        self.failUnless('src="%s/pixels.png" width="640px"' % directive in body)
        self.assertEqual(response, [
            '200 OK', [('Content-Type', 'text/html; charset=UTF-8'),
                       ('Content-Length', str(len(body)))]])
Beispiel #13
0
 def make_request(secret):
     width = height = 100
     signature = transform.compute_signature(
         width, height, secret)
     return webob.Request.blank('bitblt-%sx%s-%s/foo.jpg' % (
             width, height, signature))