Skip to content

Commit

Permalink
Issue #5977 do not force Cache-Control header if already set (#5978)
Browse files Browse the repository at this point in the history
* Issue #5977 do not force Cache-Control header if already set

Signed-off-by: olivier lamy <oliver.lamy@gmail.com>
  • Loading branch information
olamy committed Feb 17, 2021
1 parent a8b4927 commit addfbe8
Show file tree
Hide file tree
Showing 3 changed files with 162 additions and 5 deletions.
Expand Up @@ -829,19 +829,19 @@ protected void putHeaders(HttpServletResponse response, HttpContent content, lon
Response r = (Response)response;
r.putHeaders(content, contentLength, _etags);
HttpFields f = r.getHttpFields();
if (_acceptRanges)
if (_acceptRanges && !response.containsHeader(HttpHeader.ACCEPT_RANGES.asString()))
f.put(ACCEPT_RANGES);

if (_cacheControl != null)
if (_cacheControl != null && !response.containsHeader(HttpHeader.CACHE_CONTROL.asString()))
f.put(_cacheControl);
}
else
{
Response.putHeaders(response, content, contentLength, _etags);
if (_acceptRanges)
if (_acceptRanges && !response.containsHeader(HttpHeader.ACCEPT_RANGES.name()))
response.setHeader(ACCEPT_RANGES.getName(), ACCEPT_RANGES.getValue());

if (_cacheControl != null)
if (_cacheControl != null && !response.containsHeader(HttpHeader.CACHE_CONTROL.name()))
response.setHeader(_cacheControl.getName(), _cacheControl.getValue());
}
}
Expand Down
Expand Up @@ -283,7 +283,7 @@ public void init()
_resourceService.setContentFactory(contentFactory);
_resourceService.setWelcomeFactory(this);

List<String> gzipEquivalentFileExtensions = new ArrayList<String>();
List<String> gzipEquivalentFileExtensions = new ArrayList<>();
String otherGzipExtensions = getInitParameter("otherGzipFileExtensions");
if (otherGzipExtensions != null)
{
Expand Down
@@ -0,0 +1,157 @@
//
// ========================================================================
// Copyright (c) 1995-2021 Mort Bay Consulting Pty Ltd and others.
// ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// and Apache License v2.0 which accompanies this distribution.
//
// The Eclipse Public License is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// The Apache License v2.0 is available at
// http://www.opensource.org/licenses/apache2.0.php
//
// You may elect to redistribute this code under either of these licenses.
// ========================================================================
//

package org.eclipse.jetty.servlet;

import java.io.IOException;
import java.nio.file.Path;
import java.util.EnumSet;
import javax.servlet.DispatcherType;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;

import org.eclipse.jetty.http.HttpHeader;
import org.eclipse.jetty.server.HttpConfiguration;
import org.eclipse.jetty.server.HttpConnectionFactory;
import org.eclipse.jetty.server.LocalConnector;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
import org.junit.jupiter.api.Test;

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;

public class CacheControlHeaderTest
{
private Server server;
private LocalConnector connector;

public static class ForceCacheControlFilter implements Filter
{
@Override
public void init(FilterConfig filterConfig) throws ServletException
{
}

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
{
HttpServletResponse httpResponse = (HttpServletResponse)response;
httpResponse.setHeader(HttpHeader.CACHE_CONTROL.asString(), "max-age=0,private");
chain.doFilter(request, response);
}

@Override
public void destroy()
{
}
}

public void startServer(boolean forceFilter) throws Exception
{
server = new Server();

HttpConnectionFactory httpConnectionFactory = new HttpConnectionFactory(new HttpConfiguration());
connector = new LocalConnector(server, null, null, null, -1, httpConnectionFactory);

ServletContextHandler context = new ServletContextHandler();

ServletHolder servletHolder = new ServletHolder();
servletHolder.setServlet(new DefaultServlet());
servletHolder.setInitParameter("cacheControl", "max-age=3600,public");
Path resBase = MavenTestingUtils.getTestResourcePathDir("contextResources");
servletHolder.setInitParameter("resourceBase", resBase.toFile().toURI().toASCIIString());
context.addServlet(servletHolder, "/*");
if (forceFilter)
{
context.addFilter(ForceCacheControlFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST));
}
server.setHandler(context);
server.addConnector(connector);

server.start();
}

public void stopServer() throws Exception
{
if (server != null && server.isRunning())
{
server.stop();
}
}

@Test
public void testCacheControlFilterOverride() throws Exception
{
try
{
startServer(true);
StringBuffer req1 = new StringBuffer();
req1.append("GET /content.txt HTTP/1.1\r\n");
req1.append("Host: local\r\n");
req1.append("Accept: */*\r\n");
req1.append("Connection: close\r\n");
req1.append("\r\n");

String response = connector.getResponse(req1.toString());
assertThat("Response status",
response,
containsString("HTTP/1.1 200 OK"));
assertThat("Response headers",
response,
containsString(HttpHeader.CACHE_CONTROL.asString() + ": max-age=0,private"));
}
finally
{
stopServer();
}
}

@Test
public void testCacheControlDefaultServlet() throws Exception
{
try
{
startServer(false);
StringBuffer req1 = new StringBuffer();
req1.append("GET /content.txt HTTP/1.1\r\n");
req1.append("Host: local\r\n");
req1.append("Accept: */*\r\n");
req1.append("Connection: close\r\n");
req1.append("\r\n");

String response = connector.getResponse(req1.toString());
assertThat("Response status",
response,
containsString("HTTP/1.1 200 OK"));
assertThat("Response headers",
response,
containsString(HttpHeader.CACHE_CONTROL.asString() + ": max-age=3600,public"));
}
finally
{
stopServer();
}
}

}

0 comments on commit addfbe8

Please sign in to comment.