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)
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)
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')
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)))] ])
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')]])
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)
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)))] ])
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')]])
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)
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)))] ])
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))
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)))]])
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))