diff options
| author | Sébastien Theys <seb@odoo.com> | 2019-04-26 10:55:32 +0000 |
|---|---|---|
| committer | Sébastien Theys <seb@odoo.com> | 2019-04-29 13:45:34 +0000 |
| commit | 7d3fe51100302f2c1af00a343c17940e530b4dbf (patch) | |
| tree | fa0d7650e503394b1627ec2124bb80385ee4daf3 /odoo/http.py | |
| parent | 09ff05ba45d08f980f1b55c23b24420f78e9a943 (diff) | |
[FIX] http,web,website_*: return the correct Content-Type for images
* = website_profile, website_slides
Before this commit, the returned Content-Type was not always correct, for
example if the image tool was changing the format, which happens when given
a BMP (converted to PNG), or other types being converted to JPEG.
The previous method `force_contenttype` was too specific and it wasn't available
in every controller. It didn't even need to be a controller method because it
didn't use self.
Now we create a generic helper to ease updating headers.
The Content-Type is only updated when it is safe to do. It is especially unsafe
for example for SVG files.
task-1958000
PR: #31811
Diffstat (limited to 'odoo/http.py')
| -rw-r--r-- | odoo/http.py | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/odoo/http.py b/odoo/http.py index ddb18eb1048..750c0b3c0d5 100644 --- a/odoo/http.py +++ b/odoo/http.py @@ -50,6 +50,7 @@ from .service.server import memory_info from .service import security, model as service_model from .tools.func import lazy_property from .tools import ustr, consteq, frozendict, pycompat, unique, date_utils +from .tools.mimetypes import guess_mimetype from .modules.module import module_manifest @@ -1617,5 +1618,39 @@ def content_disposition(filename): return "attachment; filename*=UTF-8''%s" % escaped + +def set_safe_image_headers(headers, content): + """Return new headers based on `headers` but with `Content-Length` and + `Content-Type` set appropriately depending on the given `content` only if it + is safe to do.""" + content_type = guess_mimetype(content) + safe_types = ['image/jpeg', 'image/png', 'image/gif', 'image/x-icon'] + if content_type in safe_types: + headers = set_header_field(headers, 'Content-Type', content_type) + set_header_field(headers, 'Content-Length', len(content)) + return headers + + +def set_header_field(headers, name, value): + """ Return new headers based on `headers` but with `value` set for the + header field `name`. + + :param headers: the existing headers + :type headers: list of tuples (name, value) + + :param name: the header field name + :type name: string + + :param value: the value to set for the `name` header + :type value: string + + :return: the updated headers + :rtype: list of tuples (name, value) + """ + dictheaders = dict(headers) + dictheaders[name] = value + return list(dictheaders.items()) + + # main wsgi handler root = Root() |
