diff options
author | Jan Bartel | 2013-07-25 01:26:35 +0000 |
---|---|---|
committer | Jan Bartel | 2013-07-25 01:26:35 +0000 |
commit | 72b077921dbdd27d0f8cd0833bbc2818265e74f2 (patch) | |
tree | bd368fe811511dd74058c757543c05b8f32075a3 | |
parent | 606c042691babeded00e1274cb6951c3ca611a20 (diff) | |
parent | 2f08ba29487aff6624dbf947b1fbd845cdd33464 (diff) | |
download | org.eclipse.jetty.project-72b077921dbdd27d0f8cd0833bbc2818265e74f2.tar.gz org.eclipse.jetty.project-72b077921dbdd27d0f8cd0833bbc2818265e74f2.tar.xz org.eclipse.jetty.project-72b077921dbdd27d0f8cd0833bbc2818265e74f2.zip |
Merge remote-tracking branch 'origin/jetty-7' into jetty-8
6 files changed, 79 insertions, 7 deletions
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/HttpExchange.java b/jetty-client/src/main/java/org/eclipse/jetty/client/HttpExchange.java index 6fe61048eb..0877dd803e 100644 --- a/jetty-client/src/main/java/org/eclipse/jetty/client/HttpExchange.java +++ b/jetty-client/src/main/java/org/eclipse/jetty/client/HttpExchange.java @@ -125,10 +125,10 @@ public class HttpExchange protected void expire(HttpDestination destination) { + AbstractHttpConnection connection = _connection; if (getStatus() < HttpExchange.STATUS_COMPLETED) setStatus(HttpExchange.STATUS_EXPIRED); destination.exchangeExpired(this); - AbstractHttpConnection connection = _connection; if (connection != null) connection.exchangeExpired(this); } diff --git a/jetty-client/src/test/java/org/eclipse/jetty/client/IdleTimeoutTest.java b/jetty-client/src/test/java/org/eclipse/jetty/client/IdleTimeoutTest.java index 930a378d28..ed2b29425c 100644 --- a/jetty-client/src/test/java/org/eclipse/jetty/client/IdleTimeoutTest.java +++ b/jetty-client/src/test/java/org/eclipse/jetty/client/IdleTimeoutTest.java @@ -18,13 +18,28 @@ package org.eclipse.jetty.client; +import java.io.IOException; +import java.net.URI; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.eclipse.jetty.http.HttpMethods; +import org.eclipse.jetty.server.Connector; +import org.eclipse.jetty.server.Request; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.handler.AbstractHandler; +import org.eclipse.jetty.server.nio.SelectChannelConnector; import org.junit.Assert; import org.junit.Ignore; import org.junit.Test; +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; + /** * IdleTimeoutTest * @@ -77,4 +92,56 @@ public class IdleTimeoutTest Assert.fail("Test did not complete in time"); } + + @Test + public void testConnectionsAreReleasedWhenExpired() throws Exception + { + // we need a server that times out and a client with shorter timeout settings, so we need to create new ones + Server server = new Server(); + Connector connector = new SelectChannelConnector(); + server.addConnector(connector); + server.setHandler(new AbstractHandler() + { + public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException + { + if (request.getParameter("timeout") != null) + { + try + { + Thread.sleep(1000); + } + catch (InterruptedException e) + { + e.printStackTrace(); + } + } + baseRequest.setHandled(true); + response.getWriter().write("Hello world"); + } + }); + server.start(); + + HttpClient httpClient = new HttpClient(); + httpClient.setMaxConnectionsPerAddress(1); + httpClient.setConnectTimeout(200); + httpClient.setTimeout(200); + httpClient.setIdleTimeout(200); + httpClient.start(); + + String uriString = "http://localhost:" + connector.getLocalPort() + "/"; + + HttpExchange httpExchange = new HttpExchange(); + httpExchange.setURI(URI.create(uriString).resolve("?timeout=true")); + httpExchange.setMethod(HttpMethods.GET); + httpClient.send(httpExchange); + int status = httpExchange.waitForDone(); + assertThat("First request expired", status, is(8)); + + httpExchange = new HttpExchange(); + httpExchange.setURI(URI.create(uriString)); + httpExchange.setMethod(HttpMethods.GET); + httpClient.send(httpExchange); + status = httpExchange.waitForDone(); + assertThat("Second request was successful as timeout is not set", status, is(7)); + } } diff --git a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpGenerator.java b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpGenerator.java index cd3edea4cb..85d70df09a 100644 --- a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpGenerator.java +++ b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpGenerator.java @@ -1015,14 +1015,17 @@ public class HttpGenerator extends AbstractGenerator // If we need EOC and everything written if (_needEOC && (_content == null || _content.length() == 0)) { + if (_header == null && _buffer == null) + _header = _buffers.getHeader(); + if (_needCRLF) { - if (_buffer == null && _header != null && _header.space() >= 2) + if (_buffer == null && _header != null && _header.space() >= HttpTokens.CRLF.length) { _header.put(HttpTokens.CRLF); _needCRLF = false; } - else if (_buffer!=null && _buffer.space() >= 2) + else if (_buffer!=null && _buffer.space() >= HttpTokens.CRLF.length) { _buffer.put(HttpTokens.CRLF); _needCRLF = false; diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandler.java b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandler.java index fd9e152c01..8a84167fe9 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandler.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandler.java @@ -2506,7 +2506,7 @@ public class ContextHandler extends ScopedHandler implements Attributes, Server. if (dot<0) return false; String suffix=path.substring(dot); - return resource.getAlias().toString().endsWith(suffix); + return resource.toString().endsWith(suffix); } } @@ -2521,10 +2521,10 @@ public class ContextHandler extends ScopedHandler implements Attributes, Server. public boolean check(String path, Resource resource) { int slash = path.lastIndexOf('/'); - if (slash<0) + if (slash<0 || slash==path.length()-1) return false; String suffix=path.substring(slash); - return resource.getAlias().toString().endsWith(suffix); + return resource.toString().endsWith(suffix); } } /* ------------------------------------------------------------ */ @@ -2537,7 +2537,7 @@ public class ContextHandler extends ScopedHandler implements Attributes, Server. public boolean check(String path, Resource resource) { int slash = path.lastIndexOf('/'); - if (slash<0) + if (slash<0 || resource.exists()) return false; String suffix=path.substring(slash); return resource.getAlias().toString().endsWith(suffix); diff --git a/tests/test-integration/src/test/java/org/eclipse/jetty/test/jsp/JspAndDefaultWithAliasesTest.java b/tests/test-integration/src/test/java/org/eclipse/jetty/test/jsp/JspAndDefaultWithAliasesTest.java index 82ffc33181..3ba4f2c5e1 100644 --- a/tests/test-integration/src/test/java/org/eclipse/jetty/test/jsp/JspAndDefaultWithAliasesTest.java +++ b/tests/test-integration/src/test/java/org/eclipse/jetty/test/jsp/JspAndDefaultWithAliasesTest.java @@ -67,6 +67,7 @@ public class JspAndDefaultWithAliasesTest // @formatter:off data.add(new String[] { "false","/dump.jsp" }); + data.add(new String[] { "false","/dump.jsp/" }); data.add(new String[] { "true", "/dump.jsp%00" }); data.add(new String[] { "false","/dump.jsp%00/" }); data.add(new String[] { "false","/dump.jsp%00x/dump.jsp" }); diff --git a/tests/test-integration/src/test/java/org/eclipse/jetty/test/jsp/JspAndDefaultWithoutAliasesTest.java b/tests/test-integration/src/test/java/org/eclipse/jetty/test/jsp/JspAndDefaultWithoutAliasesTest.java index ab9f48473f..5d119f86a0 100644 --- a/tests/test-integration/src/test/java/org/eclipse/jetty/test/jsp/JspAndDefaultWithoutAliasesTest.java +++ b/tests/test-integration/src/test/java/org/eclipse/jetty/test/jsp/JspAndDefaultWithoutAliasesTest.java @@ -68,6 +68,7 @@ public class JspAndDefaultWithoutAliasesTest // @formatter:off data.add(new Object[] { "/dump.jsp" }); + data.add(new Object[] { "/dump.jsp/" }); data.add(new Object[] { "/dump.jsp%00" }); data.add(new Object[] { "/dump.jsp%00x" }); data.add(new Object[] { "/dump.jsp%00x/dump.jsp" }); |