Merge pull request #3331 from eclipse/jetty-10.0.x-3225-sendErrorNoReason

Issue #3225 sendError does not set reason.
This commit is contained in:
Simone Bordet 2019-02-12 16:20:58 +01:00 committed by GitHub
commit bd6feceeb1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 132 additions and 126 deletions

View File

@ -30,23 +30,23 @@ import org.eclipse.jetty.util.annotation.Name;
*/ */
public class ResponsePatternRule extends PatternRule public class ResponsePatternRule extends PatternRule
{ {
private String _code; private int _code;
private String _reason; private String _message;
/* ------------------------------------------------------------ */ /* ------------------------------------------------------------ */
public ResponsePatternRule() public ResponsePatternRule()
{ {
this(null,null,""); this(null,null,null);
} }
/* ------------------------------------------------------------ */ /* ------------------------------------------------------------ */
public ResponsePatternRule(@Name("pattern") String pattern, @Name("code") String code, @Name("reason") String reason) public ResponsePatternRule(@Name("pattern") String pattern, @Name("code") String code, @Name("message") String message)
{ {
super(pattern); super(pattern);
_handling = true; _handling = true;
_terminating = true; _terminating = true;
setCode(code); setCode(code);
setReason(reason); setMessage(message);
} }
/* ------------------------------------------------------------ */ /* ------------------------------------------------------------ */
@ -56,19 +56,34 @@ public class ResponsePatternRule extends PatternRule
*/ */
public void setCode(String code) public void setCode(String code)
{ {
_code = code; _code = code==null ? 0 : Integer.parseInt(code);
} }
/* ------------------------------------------------------------ */ /* ------------------------------------------------------------ */
/** /**
* Sets the reason for the response status code. Reasons will only reflect * Sets the reason for the response status code. Reasons will only reflect
* if the code value is greater or equal to 400. * if the code value is greater or equal to 400.
* * @deprecated Reason has been replaced by message
* @param reason the reason * @param reason the reason
* @see #setMessage(String)
*/ */
@Deprecated
public void setReason(String reason) public void setReason(String reason)
{ {
_reason = reason; setMessage(reason);
}
/* ------------------------------------------------------------ */
/**
* Sets the message for the {@link org.eclipse.jetty.server.Response#sendError(int, String)} method.
* Reasons will only reflect
* if the code value is greater or equal to 400.
*
* @param message the reason
*/
public void setMessage(String message)
{
_message = message;
} }
/* ------------------------------------------------------------ */ /* ------------------------------------------------------------ */
@ -79,16 +94,13 @@ public class ResponsePatternRule extends PatternRule
@Override @Override
public String apply(String target, HttpServletRequest request, HttpServletResponse response) throws IOException public String apply(String target, HttpServletRequest request, HttpServletResponse response) throws IOException
{ {
int code = Integer.parseInt(_code);
// status code 400 and up are error codes // status code 400 and up are error codes
if (code >= 400) if (_code>0)
{ {
response.sendError(code, _reason); if (_message != null && !_message.isEmpty())
} response.sendError(_code, _message);
else else
{ response.setStatus(_code);
response.setStatus(code);
} }
return target; return target;
} }
@ -100,6 +112,6 @@ public class ResponsePatternRule extends PatternRule
@Override @Override
public String toString() public String toString()
{ {
return super.toString()+"["+_code+","+_reason+"]"; return super.toString()+"["+_code+","+ _message +"]";
} }
} }

View File

@ -42,7 +42,7 @@ public class ValidUrlRule extends Rule
private static final Logger LOG = Log.getLogger(ValidUrlRule.class); private static final Logger LOG = Log.getLogger(ValidUrlRule.class);
String _code = "400"; String _code = "400";
String _reason = "Illegal Url"; String _message = "Illegal Url";
public ValidUrlRule() public ValidUrlRule()
{ {
@ -64,13 +64,26 @@ public class ValidUrlRule extends Rule
/* ------------------------------------------------------------ */ /* ------------------------------------------------------------ */
/** /**
* Sets the reason for the response status code. Reasons will only reflect if the code value is greater or equal to 400. * Sets the reason for the response status code.
* *
* @param reason the reason * @param reason the reason
* @deprecated use {@link #setMessage(String)}
*/ */
@Deprecated
public void setReason(String reason) public void setReason(String reason)
{ {
_reason = reason; _message = reason;
}
/* ------------------------------------------------------------ */
/**
* Sets the message for the {@link org.eclipse.jetty.server.Response#sendError(int, String)} method.
*
* @param message the message
*/
public void setMessage(String message)
{
_message = message;
} }
@Override @Override
@ -90,14 +103,10 @@ public class ValidUrlRule extends Rule
int code = Integer.parseInt(_code); int code = Integer.parseInt(_code);
// status code 400 and up are error codes so include a reason // status code 400 and up are error codes so include a reason
if (code >= 400) if (_message!=null && !_message.isEmpty())
{ response.sendError(code, _message);
response.sendError(code,_reason);
}
else else
{
response.setStatus(code); response.setStatus(code);
}
// we have matched, return target and consider it is handled // we have matched, return target and consider it is handled
return target; return target;
@ -121,6 +130,6 @@ public class ValidUrlRule extends Rule
@Override @Override
public String toString() public String toString()
{ {
return super.toString() + "[" + _code + ":" + _reason + "]"; return super.toString() + "[" + _code + ":" + _message + "]";
} }
} }

View File

@ -18,13 +18,15 @@
package org.eclipse.jetty.rewrite.handler; package org.eclipse.jetty.rewrite.handler;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.io.IOException; import java.io.IOException;
import org.eclipse.jetty.server.Dispatcher;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNull;
public class ResponsePatternRuleTest extends AbstractRuleTestCase public class ResponsePatternRuleTest extends AbstractRuleTestCase
{ {
private ResponsePatternRule _rule; private ResponsePatternRule _rule;
@ -38,57 +40,27 @@ public class ResponsePatternRuleTest extends AbstractRuleTestCase
} }
@Test @Test
public void testStatusCodeNoReason() throws IOException public void testStatusCodeNoMessage() throws IOException
{ {
for (int i = 1; i < 400; i++) for (int i = 1; i < 600; i++)
{ {
_rule.setCode("" + i); _rule.setCode("" + i);
_rule.setMessage(null);
_rule.apply(null, _request, _response); _rule.apply(null, _request, _response);
assertEquals(i, _response.getStatus()); assertEquals(i, _response.getStatus());
assertNull(_request.getAttribute(Dispatcher.ERROR_MESSAGE));
} }
} }
@Test @Test
public void testStatusCodeWithReason() throws IOException public void testStatusCodeMessage() throws IOException
{ {
for (int i = 1; i < 400; i++) _rule.setCode("499");
{ _rule.setMessage("Message 499");
_rule.setCode("" + i); _rule.apply(null, _request, _response);
_rule.setReason("reason" + i);
_rule.apply(null, _request, _response);
assertEquals(i, _response.getStatus()); assertEquals(499, _response.getStatus());
assertEquals(null, _response.getReason()); assertEquals( "Message 499", _request.getAttribute(Dispatcher.ERROR_MESSAGE));
}
}
@Test
public void testErrorStatusNoReason() throws IOException
{
for (int i = 400; i < 600; i++)
{
_rule.setCode("" + i);
_rule.apply(null, _request, _response);
assertEquals(i, _response.getStatus());
assertEquals("", _response.getReason());
super.reset();
}
}
@Test
public void testErrorStatusWithReason() throws IOException
{
for (int i = 400; i < 600; i++)
{
_rule.setCode("" + i);
_rule.setReason("reason-" + i);
_rule.apply(null, _request, _response);
assertEquals(i, _response.getStatus());
assertEquals("reason-" + i, _response.getReason());
super.reset();
}
} }
} }

View File

@ -18,14 +18,15 @@
package org.eclipse.jetty.rewrite.handler; package org.eclipse.jetty.rewrite.handler;
import static org.junit.jupiter.api.Assertions.assertEquals; import org.eclipse.jetty.server.Dispatcher;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
@SuppressWarnings("unused") @SuppressWarnings("unused")
public class ValidUrlRuleTest extends AbstractRuleTestCase public class ValidUrlRuleTest extends AbstractRuleTestCase
{ {
@ -61,16 +62,16 @@ public class ValidUrlRuleTest extends AbstractRuleTestCase
} }
@Test @Test
public void testInvalidUrlWithReason() throws Exception public void testInvalidUrlWithMessage() throws Exception
{ {
_rule.setCode("405"); _rule.setCode("405");
_rule.setReason("foo"); _rule.setMessage("foo");
_request.setURIPathQuery("/%00/"); _request.setURIPathQuery("/%00/");
String result = _rule.matchAndApply(_request.getRequestURI(), _request, _response); String result = _rule.matchAndApply(_request.getRequestURI(), _request, _response);
assertEquals(405,_response.getStatus()); assertEquals(405,_response.getStatus());
assertEquals("foo",_response.getReason()); assertEquals( "foo", _request.getAttribute(Dispatcher.ERROR_MESSAGE));
} }
@Test @Test
@ -83,7 +84,7 @@ public class ValidUrlRuleTest extends AbstractRuleTestCase
String result = _rule.matchAndApply(_request.getRequestURI(), _request, _response); String result = _rule.matchAndApply(_request.getRequestURI(), _request, _response);
assertEquals(405,_response.getStatus()); assertEquals(405,_response.getStatus());
assertEquals("foo",_response.getReason()); assertEquals( "foo", _request.getAttribute(Dispatcher.ERROR_MESSAGE));
} }
@Disabled("Not working in jetty-9") @Disabled("Not working in jetty-9")
@ -97,7 +98,7 @@ public class ValidUrlRuleTest extends AbstractRuleTestCase
String result = _rule.matchAndApply(_request.getRequestURI(), _request, _response); String result = _rule.matchAndApply(_request.getRequestURI(), _request, _response);
assertEquals(405,_response.getStatus()); assertEquals(405,_response.getStatus());
assertEquals("foo",_response.getReason()); assertEquals( "foo", _request.getAttribute(Dispatcher.ERROR_MESSAGE));
} }
@Disabled("Not working in jetty-9") @Disabled("Not working in jetty-9")

View File

@ -18,11 +18,6 @@
package org.eclipse.jetty.security; package org.eclipse.jetty.security;
import static org.hamcrest.Matchers.startsWith;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.io.IOException; import java.io.IOException;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashSet; import java.util.HashSet;
@ -48,6 +43,11 @@ import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.startsWith;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
/** /**
* @version $Revision: 1441 $ $Date: 2010-04-02 12:28:17 +0200 (Fri, 02 Apr 2010) $ * @version $Revision: 1441 $ $Date: 2010-04-02 12:28:17 +0200 (Fri, 02 Apr 2010) $
*/ */
@ -323,7 +323,7 @@ public class SpecExampleConstraintTest
response = _connector.getResponse("POST /ctx/acme/wholesale/index.html HTTP/1.0\r\n" + response = _connector.getResponse("POST /ctx/acme/wholesale/index.html HTTP/1.0\r\n" +
"Authorization: Basic " + B64Code.encode("chris:password") + "\r\n" + "Authorization: Basic " + B64Code.encode("chris:password") + "\r\n" +
"\r\n"); "\r\n");
assertThat(response,startsWith("HTTP/1.1 403 !")); assertThat(response,startsWith("HTTP/1.1 403 "));
//a user in role HOMEOWNER can do a GET //a user in role HOMEOWNER can do a GET
response = _connector.getResponse("GET /ctx/acme/retail/index.html HTTP/1.0\r\n" + response = _connector.getResponse("GET /ctx/acme/retail/index.html HTTP/1.0\r\n" +

View File

@ -633,13 +633,9 @@ public class Response implements HttpServletResponse
Request request = _channel.getRequest(); Request request = _channel.getRequest();
Throwable cause = (Throwable)request.getAttribute(Dispatcher.ERROR_EXCEPTION); Throwable cause = (Throwable)request.getAttribute(Dispatcher.ERROR_EXCEPTION);
_reason=HttpStatus.getMessage(code);
if (message==null) if (message==null)
{
_reason=HttpStatus.getMessage(code);
message=cause==null?_reason:cause.toString(); message=cause==null?_reason:cause.toString();
}
else
_reason=message;
// If we are allowed to have a body, then produce the error page. // If we are allowed to have a body, then produce the error page.
if (code != SC_NO_CONTENT && code != SC_NOT_MODIFIED && if (code != SC_NO_CONTENT && code != SC_NOT_MODIFIED &&
@ -873,19 +869,19 @@ public class Response implements HttpServletResponse
@Override @Override
@Deprecated @Deprecated
public void setStatus(int sc, String sm) public void setStatus(int sc, String message)
{ {
setStatusWithReason(sc,sm); setStatusWithReason(sc, null);
} }
public void setStatusWithReason(int sc, String sm) public void setStatusWithReason(int sc, String message)
{ {
if (sc <= 0) if (sc <= 0)
throw new IllegalArgumentException(); throw new IllegalArgumentException();
if (!isIncluding()) if (!isIncluding())
{ {
_status = sc; _status = sc;
_reason = sm; _reason = message;
} }
} }

View File

@ -139,7 +139,14 @@ public class ErrorHandler extends AbstractHandler
if (_cacheControl != null) if (_cacheControl != null)
response.setHeader(HttpHeader.CACHE_CONTROL.asString(), _cacheControl); response.setHeader(HttpHeader.CACHE_CONTROL.asString(), _cacheControl);
generateAcceptableResponse(baseRequest,request,response,response.getStatus(),baseRequest.getResponse().getReason());
String message = (String)request.getAttribute(RequestDispatcher.ERROR_MESSAGE);
if (message==null)
message = baseRequest.getResponse().getReason();
if (message==null)
message = HttpStatus.getMessage(response.getStatus());
generateAcceptableResponse(baseRequest,request,response,response.getStatus(),message);
} }
/** /**

View File

@ -18,21 +18,6 @@
package org.eclipse.jetty.server; package org.eclipse.jetty.server;
import static java.nio.charset.StandardCharsets.UTF_8;
import static org.hamcrest.CoreMatchers.allOf;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.not;
import static org.hamcrest.Matchers.nullValue;
import static org.hamcrest.Matchers.startsWith;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.io.IOException; import java.io.IOException;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.io.LineNumberReader; import java.io.LineNumberReader;
@ -62,6 +47,7 @@ import org.eclipse.jetty.http.CookieCompliance;
import org.eclipse.jetty.http.HttpField; import org.eclipse.jetty.http.HttpField;
import org.eclipse.jetty.http.HttpFields; import org.eclipse.jetty.http.HttpFields;
import org.eclipse.jetty.http.HttpHeader; import org.eclipse.jetty.http.HttpHeader;
import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.http.HttpURI; import org.eclipse.jetty.http.HttpURI;
import org.eclipse.jetty.http.HttpVersion; import org.eclipse.jetty.http.HttpVersion;
import org.eclipse.jetty.http.MetaData; import org.eclipse.jetty.http.MetaData;
@ -86,6 +72,21 @@ import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import static java.nio.charset.StandardCharsets.UTF_8;
import static org.hamcrest.CoreMatchers.allOf;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.not;
import static org.hamcrest.Matchers.nullValue;
import static org.hamcrest.Matchers.startsWith;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
public class ResponseTest public class ResponseTest
{ {
@ -676,7 +677,9 @@ public class ResponseTest
response.sendError(500, "Database Error"); response.sendError(500, "Database Error");
assertEquals(500, response.getStatus()); assertEquals(500, response.getStatus());
assertEquals("Database Error", response.getReason()); assertEquals("Server Error", response.getReason());
assertThat(BufferUtil.toString(_content), containsString("Database Error"));
assertEquals("must-revalidate,no-cache,no-store", response.getHeader(HttpHeader.CACHE_CONTROL.asString())); assertEquals("must-revalidate,no-cache,no-store", response.getHeader(HttpHeader.CACHE_CONTROL.asString()));
response = getResponse(); response = getResponse();
@ -689,7 +692,8 @@ public class ResponseTest
response.sendError(406, "Super Nanny"); response.sendError(406, "Super Nanny");
assertEquals(406, response.getStatus()); assertEquals(406, response.getStatus());
assertEquals("Super Nanny", response.getReason()); assertEquals(HttpStatus.Code.NOT_ACCEPTABLE.getMessage(), response.getReason());
assertThat(BufferUtil.toString(_content), containsString("Super Nanny"));
assertEquals("must-revalidate,no-cache,no-store", response.getHeader(HttpHeader.CACHE_CONTROL.asString())); assertEquals("must-revalidate,no-cache,no-store", response.getHeader(HttpHeader.CACHE_CONTROL.asString()));
} }
@ -707,7 +711,8 @@ public class ResponseTest
response.sendError(500, "Database Error"); response.sendError(500, "Database Error");
assertEquals(500, response.getStatus()); assertEquals(500, response.getStatus());
assertEquals("Database Error", response.getReason()); assertEquals("Server Error", response.getReason());
assertThat(BufferUtil.toString(_content), is(""));
assertThat(response.getHeader(HttpHeader.CACHE_CONTROL.asString()),Matchers.nullValue()); assertThat(response.getHeader(HttpHeader.CACHE_CONTROL.asString()),Matchers.nullValue());
response = getResponse(); response = getResponse();
@ -720,7 +725,8 @@ public class ResponseTest
response.sendError(406, "Super Nanny"); response.sendError(406, "Super Nanny");
assertEquals(406, response.getStatus()); assertEquals(406, response.getStatus());
assertEquals("Super Nanny", response.getReason()); assertEquals(HttpStatus.Code.NOT_ACCEPTABLE.getMessage(), response.getReason());
assertThat(BufferUtil.toString(_content), is(""));
assertThat(response.getHeader(HttpHeader.CACHE_CONTROL.asString()),Matchers.nullValue()); assertThat(response.getHeader(HttpHeader.CACHE_CONTROL.asString()),Matchers.nullValue());
} }
@ -1384,6 +1390,7 @@ public class ResponseTest
{ {
_channel.recycle(); _channel.recycle();
_channel.getRequest().setMetaData(new MetaData.Request("GET",new HttpURI("/path/info"),HttpVersion.HTTP_1_0,new HttpFields())); _channel.getRequest().setMetaData(new MetaData.Request("GET",new HttpURI("/path/info"),HttpVersion.HTTP_1_0,new HttpFields()));
BufferUtil.clear(_content);
return _channel.getResponse(); return _channel.getResponse();
} }

View File

@ -18,12 +18,6 @@
package org.eclipse.jetty.server.ssl; package org.eclipse.jetty.server.ssl;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.startsWith;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.io.File; import java.io.File;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.IOException; import java.io.IOException;
@ -70,6 +64,12 @@ import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.startsWith;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
public class SniSslConnectionFactoryTest public class SniSslConnectionFactoryTest
{ {
private Server _server; private Server _server;
@ -268,8 +268,9 @@ public class SniSslConnectionFactoryTest
output.flush(); output.flush();
response = response(input); response = response(input);
String body = IO.toString(input);
assertThat(response,startsWith("HTTP/1.1 400 ")); assertThat(response,startsWith("HTTP/1.1 400 "));
assertThat(response, containsString("Host does not match SNI")); assertThat(body, containsString("Host does not match SNI"));
} }
finally finally
{ {
@ -326,7 +327,8 @@ public class SniSslConnectionFactoryTest
response = response(input); response = response(input);
assertTrue(response.startsWith("HTTP/1.1 400 ")); assertTrue(response.startsWith("HTTP/1.1 400 "));
assertThat(response, Matchers.containsString("Host does not match SNI")); String body = IO.toString(input);
assertThat(body, Matchers.containsString("Host does not match SNI"));
} }
finally finally
{ {

View File

@ -18,10 +18,6 @@
package org.eclipse.jetty.servlet; package org.eclipse.jetty.servlet;
import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.MatcherAssert.assertThat;
import java.io.IOException; import java.io.IOException;
import java.io.PrintWriter; import java.io.PrintWriter;
@ -42,6 +38,10 @@ import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.MatcherAssert.assertThat;
public class ErrorPageTest public class ErrorPageTest
{ {
private Server _server; private Server _server;
@ -168,7 +168,7 @@ public class ErrorPageTest
try (StacklessLogging ignore = new StacklessLogging(Dispatcher.class)) try (StacklessLogging ignore = new StacklessLogging(Dispatcher.class))
{ {
String response = _connector.getResponse("GET /app?baa=%88%A4 HTTP/1.0\r\n\r\n"); String response = _connector.getResponse("GET /app?baa=%88%A4 HTTP/1.0\r\n\r\n");
assertThat(response, Matchers.containsString("HTTP/1.1 400 Bad query encoding")); assertThat(response, Matchers.containsString("HTTP/1.1 400 "));
assertThat(response, Matchers.containsString("ERROR_PAGE: /BadMessageException")); assertThat(response, Matchers.containsString("ERROR_PAGE: /BadMessageException"));
assertThat(response, Matchers.containsString("ERROR_MESSAGE: Bad query encoding")); assertThat(response, Matchers.containsString("ERROR_MESSAGE: Bad query encoding"));
assertThat(response, Matchers.containsString("ERROR_CODE: 400")); assertThat(response, Matchers.containsString("ERROR_CODE: 400"));