324679 Don't set content length if filter has written content.
git-svn-id: svn+ssh://dev.eclipse.org/svnroot/rt/org.eclipse.jetty/jetty/trunk@2265 7e9141cc-0065-0410-87d8-b60c137991c4
This commit is contained in:
parent
2c16ef1fc1
commit
51d5da4bbc
|
@ -28,6 +28,7 @@ jetty-7.2-SNAPSHOT
|
||||||
+ 324379 Change content type after getWriter
|
+ 324379 Change content type after getWriter
|
||||||
+ 324501 Fire RequestListener.requestDestroyed in last-to-first order.
|
+ 324501 Fire RequestListener.requestDestroyed in last-to-first order.
|
||||||
+ 324601 Check session expiry on access
|
+ 324601 Check session expiry on access
|
||||||
|
+ 324679 Allow filter to write before static content
|
||||||
+ 324811 NPE in Server.dump
|
+ 324811 NPE in Server.dump
|
||||||
+ 324812 restore WebAppContext constructor used by geronimo integration
|
+ 324812 restore WebAppContext constructor used by geronimo integration
|
||||||
+ JETTY-912 added per exchange timeout api
|
+ JETTY-912 added per exchange timeout api
|
||||||
|
|
|
@ -1162,7 +1162,7 @@ public class HttpConnection implements Connection
|
||||||
if (_closed)
|
if (_closed)
|
||||||
throw new IOException("Closed");
|
throw new IOException("Closed");
|
||||||
|
|
||||||
if (super._generator.getContentWritten() > 0)
|
if (super._generator.isContentWritten())
|
||||||
throw new IllegalStateException("!empty");
|
throw new IllegalStateException("!empty");
|
||||||
|
|
||||||
// Convert HTTP content to contentl
|
// Convert HTTP content to contentl
|
||||||
|
|
|
@ -54,6 +54,12 @@ public class HttpOutput extends ServletOutputStream
|
||||||
_generator=generator;
|
_generator=generator;
|
||||||
_maxIdleTime=maxIdleTime;
|
_maxIdleTime=maxIdleTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------ */
|
||||||
|
public boolean isWritten()
|
||||||
|
{
|
||||||
|
return _generator.isContentWritten();
|
||||||
|
}
|
||||||
|
|
||||||
/* ------------------------------------------------------------ */
|
/* ------------------------------------------------------------ */
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -41,6 +41,7 @@ import org.eclipse.jetty.io.WriterOutputStream;
|
||||||
import org.eclipse.jetty.server.Connector;
|
import org.eclipse.jetty.server.Connector;
|
||||||
import org.eclipse.jetty.server.Dispatcher;
|
import org.eclipse.jetty.server.Dispatcher;
|
||||||
import org.eclipse.jetty.server.HttpConnection;
|
import org.eclipse.jetty.server.HttpConnection;
|
||||||
|
import org.eclipse.jetty.server.HttpOutput;
|
||||||
import org.eclipse.jetty.server.InclusiveByteRange;
|
import org.eclipse.jetty.server.InclusiveByteRange;
|
||||||
import org.eclipse.jetty.server.ResourceCache;
|
import org.eclipse.jetty.server.ResourceCache;
|
||||||
import org.eclipse.jetty.server.Response;
|
import org.eclipse.jetty.server.Response;
|
||||||
|
@ -772,8 +773,13 @@ public class DefaultServlet extends HttpServlet implements ResourceFactory
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
// has a filter already written to the response?
|
||||||
|
boolean written = out instanceof HttpOutput
|
||||||
|
? !((HttpOutput)out).isWritten()
|
||||||
|
: HttpConnection.getCurrentConnection().getGenerator().isContentWritten();
|
||||||
|
|
||||||
// See if a direct methods can be used?
|
// See if a direct methods can be used?
|
||||||
if (out instanceof HttpConnection.Output && content!=null)
|
if (content!=null && !written && out instanceof HttpOutput)
|
||||||
{
|
{
|
||||||
if (response instanceof Response)
|
if (response instanceof Response)
|
||||||
{
|
{
|
||||||
|
@ -798,7 +804,7 @@ public class DefaultServlet extends HttpServlet implements ResourceFactory
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Write headers normally
|
// Write headers normally
|
||||||
writeHeaders(response,content,content_length);
|
writeHeaders(response,content,written?-1:content_length);
|
||||||
|
|
||||||
// Write content normally
|
// Write content normally
|
||||||
Buffer buffer = (content==null)?null:content.getIndirectBuffer();
|
Buffer buffer = (content==null)?null:content.getIndirectBuffer();
|
||||||
|
|
|
@ -4,6 +4,13 @@ import java.io.File;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
|
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 junit.framework.AssertionFailedError;
|
import junit.framework.AssertionFailedError;
|
||||||
import org.eclipse.jetty.server.LocalConnector;
|
import org.eclipse.jetty.server.LocalConnector;
|
||||||
import org.eclipse.jetty.server.Server;
|
import org.eclipse.jetty.server.Server;
|
||||||
|
@ -498,6 +505,56 @@ public class DefaultServletTest
|
||||||
assertTrue(body.endsWith(boundary+"--\r\n"));
|
assertTrue(body.endsWith(boundary+"--\r\n"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testFiltered() throws Exception
|
||||||
|
{
|
||||||
|
File testDir = new File("target/tests/" + DefaultServletTest.class.getSimpleName());
|
||||||
|
prepareEmptyTestDir(testDir);
|
||||||
|
File resBase = new File(testDir, "docroot");
|
||||||
|
assertTrue(resBase.mkdirs());
|
||||||
|
File file0 = new File(resBase, "data0.txt");
|
||||||
|
createFile(file0, "Hello Text 0");
|
||||||
|
|
||||||
|
String resBasePath = resBase.getAbsolutePath();
|
||||||
|
|
||||||
|
ServletHolder defholder = context.addServlet(DefaultServlet.class,"/");
|
||||||
|
defholder.setInitParameter("dirAllowed","false");
|
||||||
|
defholder.setInitParameter("redirectWelcome","false");
|
||||||
|
defholder.setInitParameter("welcomeServlets","false");
|
||||||
|
defholder.setInitParameter("gzip","false");
|
||||||
|
defholder.setInitParameter("resourceBase",resBasePath);
|
||||||
|
|
||||||
|
ServletHolder jspholder = context.addServlet(NoJspServlet.class,"*.jsp");
|
||||||
|
|
||||||
|
String response = connector.getResponses("GET /context/data0.txt HTTP/1.1\r\nHost:localhost:8080\r\n\r\n");
|
||||||
|
assertResponseContains("Content-Length: 12",response);
|
||||||
|
assertResponseNotContains("Extra Info",response);
|
||||||
|
|
||||||
|
context.addFilter(AddingFilter.class,"/*",0);
|
||||||
|
response = connector.getResponses("GET /context/data0.txt HTTP/1.1\r\nHost:localhost:8080\r\n\r\n");
|
||||||
|
System.err.println(response);
|
||||||
|
assertResponseContains("Content-Length: 24",response);
|
||||||
|
assertResponseContains("Extra Info",response);
|
||||||
|
assertResponseNotContains("Content-Length: 12",response);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class AddingFilter implements Filter
|
||||||
|
{
|
||||||
|
public void init(FilterConfig filterConfig) throws ServletException
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
|
||||||
|
{
|
||||||
|
response.getOutputStream().println("Extra Info");
|
||||||
|
chain.doFilter(request,response);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void destroy()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void createFile(File file, String str) throws IOException
|
private void createFile(File file, String str) throws IOException
|
||||||
{
|
{
|
||||||
FileOutputStream out = null;
|
FileOutputStream out = null;
|
||||||
|
|
Loading…
Reference in New Issue