Commit 7187fb69 authored by Kazuhiko Shiozaki's avatar Kazuhiko Shiozaki

patch : Caching Policy Manager should not override existing response headers.

parent 0e43f1f9
......@@ -82,6 +82,7 @@ from Products.ERP5Type.patches import ExceptionFormatter
from Products.ERP5Type.patches import WebDAV
from Products.ERP5Type.patches import DTMLMethod
from Products.ERP5Type.patches import DTMLDocument
from Products.ERP5Type.patches import CMFCoreUtils
# These symbols are required for backward compatibility
from Products.ERP5Type.patches.PropertyManager import ERP5PropertyManager
......
##############################################################################
#
# Copyright (c) 2001 Zope Foundation and Contributors.
# Copyright (c) 2015 Nexedi SA and Contributors. All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
#
##############################################################################
from Acquisition import aq_parent
from Products.CMFCore.utils import getToolByName, SUBTEMPLATE
# patch _setCacheHeaders so that existing headers are not overridden
def _setCacheHeaders(obj, extra_context):
"""Set cache headers according to cache policy manager for the obj."""
REQUEST = getattr(obj, 'REQUEST', None)
if REQUEST is not None:
call_count = getattr(REQUEST, SUBTEMPLATE, 1) - 1
setattr(REQUEST, SUBTEMPLATE, call_count)
if call_count != 0:
return
# cleanup
delattr(REQUEST, SUBTEMPLATE)
content = aq_parent(obj)
manager = getToolByName(obj, 'caching_policy_manager', None)
if manager is None:
return
view_name = obj.getId()
headers = manager.getHTTPCachingHeaders(
content, view_name, extra_context
)
RESPONSE = REQUEST['RESPONSE']
# PATCH BEGIN: do not override existing headers
ignore_list = [y[0].lower() for y in RESPONSE.headers.iteritems()]
headers = [x for x in headers if x[0].lower() not in ignore_list]
# PATCH END
for key, value in headers:
if key == 'ETag':
RESPONSE.setHeader(key, value, literal=1)
else:
RESPONSE.setHeader(key, value)
if headers:
RESPONSE.setHeader('X-Cache-Headers-Set-By',
'CachingPolicyManager: %s' %
'/'.join(manager.getPhysicalPath()))
import Products.CMFCore.utils
Products.CMFCore.utils._setCacheHeaders = _setCacheHeaders
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment