Issue #2675 - adding testcase to demonstrate issue
Signed-off-by: Joakim Erdfelt <joakim.erdfelt@gmail.com>
This commit is contained in:
parent
f7df6b3326
commit
0ecc5fb3ae
|
@ -24,11 +24,6 @@
|
||||||
</plugins>
|
</plugins>
|
||||||
</build>
|
</build>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
|
||||||
<groupId>org.eclipse.jetty.toolchain</groupId>
|
|
||||||
<artifactId>jetty-test-helper</artifactId>
|
|
||||||
<scope>test</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.eclipse.jetty</groupId>
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
<artifactId>jetty-server</artifactId>
|
<artifactId>jetty-server</artifactId>
|
||||||
|
@ -38,5 +33,18 @@
|
||||||
<groupId>javax.servlet</groupId>
|
<groupId>javax.servlet</groupId>
|
||||||
<artifactId>javax.servlet-api</artifactId>
|
<artifactId>javax.servlet-api</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
|
<artifactId>jetty-http</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
<classifier>tests</classifier>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.eclipse.jetty.toolchain</groupId>
|
||||||
|
<artifactId>jetty-test-helper</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
</project>
|
</project>
|
||||||
|
|
|
@ -18,63 +18,198 @@
|
||||||
|
|
||||||
package org.eclipse.jetty.rewrite.handler;
|
package org.eclipse.jetty.rewrite.handler;
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.hamcrest.MatcherAssert.assertThat;
|
||||||
|
import static org.hamcrest.Matchers.is;
|
||||||
|
import static org.hamcrest.Matchers.notNullValue;
|
||||||
|
import static org.hamcrest.Matchers.nullValue;
|
||||||
|
import static org.junit.Assert.fail;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.Enumeration;
|
import java.io.PrintWriter;
|
||||||
|
import java.io.StringReader;
|
||||||
|
|
||||||
import org.eclipse.jetty.http.HttpFields;
|
import javax.servlet.ServletException;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
import org.eclipse.jetty.http.HttpField;
|
||||||
import org.eclipse.jetty.http.HttpHeader;
|
import org.eclipse.jetty.http.HttpHeader;
|
||||||
import org.junit.Before;
|
import org.eclipse.jetty.http.HttpTester;
|
||||||
|
import org.eclipse.jetty.server.Handler;
|
||||||
|
import org.eclipse.jetty.server.LocalConnector;
|
||||||
|
import org.eclipse.jetty.server.Request;
|
||||||
|
import org.eclipse.jetty.server.Server;
|
||||||
|
import org.eclipse.jetty.server.handler.AbstractHandler;
|
||||||
|
import org.eclipse.jetty.server.handler.HandlerList;
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Ignore;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
public class CookiePatternRuleTest extends AbstractRuleTestCase
|
public class CookiePatternRuleTest
|
||||||
{
|
{
|
||||||
@Before
|
private Server server;
|
||||||
public void init() throws Exception
|
private LocalConnector localConnector;
|
||||||
|
|
||||||
|
public void startServer(CookiePatternRule rule) throws Exception
|
||||||
{
|
{
|
||||||
start(false);
|
server = new Server();
|
||||||
}
|
localConnector = new LocalConnector(server);
|
||||||
|
server.addConnector(localConnector);
|
||||||
|
|
||||||
@Test
|
RewriteHandler rewriteHandler = new RewriteHandler();
|
||||||
public void testSingleCookie() throws IOException
|
// rewriteHandler.setRewriteRequestURI(false);
|
||||||
{
|
rewriteHandler.addRule(rule);
|
||||||
String[] cookie = {"cookie", "value"};
|
|
||||||
assertCookies(cookie,true);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testSetAlready() throws IOException
|
|
||||||
{
|
|
||||||
String[] cookie = {"set", "already"};
|
|
||||||
assertCookies(cookie,false);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void assertCookies(String[] cookie,boolean setExpected) throws IOException
|
Handler dummyHandler = new AbstractHandler()
|
||||||
{
|
{
|
||||||
// set cookie pattern
|
@Override
|
||||||
CookiePatternRule rule = new CookiePatternRule();
|
public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
|
||||||
rule.setPattern("*");
|
|
||||||
rule.setName(cookie[0]);
|
|
||||||
rule.setValue(cookie[1]);
|
|
||||||
|
|
||||||
// System.out.println(rule.toString());
|
|
||||||
|
|
||||||
// apply cookie pattern
|
|
||||||
rule.apply(_request.getRequestURI(), _request, _response);
|
|
||||||
|
|
||||||
// verify
|
|
||||||
HttpFields httpFields = _response.getHttpFields();
|
|
||||||
Enumeration<String> e = httpFields.getValues(HttpHeader.SET_COOKIE.asString());
|
|
||||||
boolean set = false;
|
|
||||||
while (e.hasMoreElements())
|
|
||||||
{
|
{
|
||||||
String[] result = (e.nextElement()).split("=");
|
response.setContentType("text/plain");
|
||||||
assertEquals(cookie[0], result[0]);
|
response.setCharacterEncoding("utf-8");
|
||||||
assertEquals(cookie[1], result[1]);
|
PrintWriter out = response.getWriter();
|
||||||
set=true;
|
out.printf("target=%s%n", target);
|
||||||
|
out.printf("baseRequest.requestUri=%s%n", baseRequest.getRequestURI());
|
||||||
|
out.printf("baseRequest.originalUri=%s%n", baseRequest.getOriginalURI());
|
||||||
|
out.printf("request.requestUri=%s%n", request.getRequestURI());
|
||||||
|
baseRequest.setHandled(true);
|
||||||
}
|
}
|
||||||
|
};
|
||||||
assertEquals(setExpected,set);
|
|
||||||
|
HandlerList handlers = new HandlerList();
|
||||||
|
handlers.addHandler(rewriteHandler);
|
||||||
|
handlers.addHandler(dummyHandler);
|
||||||
|
|
||||||
|
server.setHandler(handlers);
|
||||||
|
server.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void stopServer() throws Exception
|
||||||
|
{
|
||||||
|
if (server != null)
|
||||||
|
{
|
||||||
|
server.stop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSingleCookie() throws Exception
|
||||||
|
{
|
||||||
|
CookiePatternRule rule = new CookiePatternRule();
|
||||||
|
rule.setPattern("*");
|
||||||
|
rule.setName("cookie");
|
||||||
|
rule.setValue("value");
|
||||||
|
|
||||||
|
startServer(rule);
|
||||||
|
|
||||||
|
StringBuilder rawRequest = new StringBuilder();
|
||||||
|
rawRequest.append("GET / HTTP/1.1\r\n");
|
||||||
|
rawRequest.append("Host: local\r\n");
|
||||||
|
rawRequest.append("Connection: close\r\n");
|
||||||
|
rawRequest.append("\r\n");
|
||||||
|
|
||||||
|
String rawResponse = localConnector.getResponse(rawRequest.toString());
|
||||||
|
HttpTester.Response response = HttpTester.parseResponse(rawResponse);
|
||||||
|
|
||||||
|
// verify
|
||||||
|
HttpField setCookieField = response.getField(HttpHeader.SET_COOKIE);
|
||||||
|
assertThat("response should have Set-Cookie", setCookieField, notNullValue());
|
||||||
|
for (String value : setCookieField.getValues())
|
||||||
|
{
|
||||||
|
String[] result = value.split("=");
|
||||||
|
assertThat(result[0], is("cookie"));
|
||||||
|
assertThat(result[1], is("value"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSetAlready() throws Exception
|
||||||
|
{
|
||||||
|
CookiePatternRule rule = new CookiePatternRule();
|
||||||
|
rule.setPattern("*");
|
||||||
|
rule.setName("set");
|
||||||
|
rule.setValue("already");
|
||||||
|
|
||||||
|
startServer(rule);
|
||||||
|
|
||||||
|
StringBuilder rawRequest = new StringBuilder();
|
||||||
|
rawRequest.append("GET / HTTP/1.1\r\n");
|
||||||
|
rawRequest.append("Host: local\r\n");
|
||||||
|
rawRequest.append("Connection: close\r\n");
|
||||||
|
rawRequest.append("Cookie: set=already\r\n"); // already present on request
|
||||||
|
rawRequest.append("\r\n");
|
||||||
|
|
||||||
|
String rawResponse = localConnector.getResponse(rawRequest.toString());
|
||||||
|
HttpTester.Response response = HttpTester.parseResponse(rawResponse);
|
||||||
|
|
||||||
|
// verify
|
||||||
|
assertThat("response should not have Set-Cookie", response.getField(HttpHeader.SET_COOKIE), nullValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Ignore("See #2675 for details") // TODO: needs to be fixed in RuleContainer
|
||||||
|
public void testUrlParameter() throws Exception
|
||||||
|
{
|
||||||
|
CookiePatternRule rule = new CookiePatternRule();
|
||||||
|
rule.setPattern("*");
|
||||||
|
rule.setName("fruit");
|
||||||
|
rule.setValue("banana");
|
||||||
|
|
||||||
|
startServer(rule);
|
||||||
|
|
||||||
|
StringBuilder rawRequest = new StringBuilder();
|
||||||
|
rawRequest.append("GET /other;fruit=apple HTTP/1.1\r\n");
|
||||||
|
rawRequest.append("Host: local\r\n");
|
||||||
|
rawRequest.append("Connection: close\r\n");
|
||||||
|
rawRequest.append("\r\n");
|
||||||
|
|
||||||
|
String rawResponse = localConnector.getResponse(rawRequest.toString());
|
||||||
|
HttpTester.Response response = HttpTester.parseResponse(rawResponse);
|
||||||
|
|
||||||
|
String responseContent = response.getContent();
|
||||||
|
System.out.println(responseContent);
|
||||||
|
assertResponseContentLine(responseContent, "baseRequest.requestUri=", "/other;fruit=apple");
|
||||||
|
|
||||||
|
// verify
|
||||||
|
HttpField setCookieField = response.getField(HttpHeader.SET_COOKIE);
|
||||||
|
assertThat("response should have Set-Cookie", setCookieField, notNullValue());
|
||||||
|
for (String value : setCookieField.getValues())
|
||||||
|
{
|
||||||
|
String[] result = value.split("=");
|
||||||
|
assertThat(result[0], is("fruit"));
|
||||||
|
assertThat(result[1], is("banana"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void assertResponseContentLine(String responseContent, String linePrefix, String expectedEquals) throws IOException
|
||||||
|
{
|
||||||
|
String line;
|
||||||
|
try (StringReader stringReader = new StringReader(responseContent);
|
||||||
|
BufferedReader bufferedReader = new BufferedReader(stringReader))
|
||||||
|
{
|
||||||
|
boolean foundIt = false;
|
||||||
|
while ((line = bufferedReader.readLine()) != null)
|
||||||
|
{
|
||||||
|
if (line.startsWith(linePrefix))
|
||||||
|
{
|
||||||
|
if (foundIt)
|
||||||
|
{
|
||||||
|
// duplicate lines
|
||||||
|
fail("Found multiple lines prefixed with: " + linePrefix);
|
||||||
|
}
|
||||||
|
// found it
|
||||||
|
String actualValue = line.substring(linePrefix.length());
|
||||||
|
assertThat("Line:" + linePrefix, actualValue, is(expectedEquals));
|
||||||
|
foundIt = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!foundIt)
|
||||||
|
{
|
||||||
|
fail("Unable to find line prefixed with: " + linePrefix);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue