// // ======================================================================== // Copyright (c) 1995-2017 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // 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.server; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.not; import static org.hamcrest.Matchers.startsWith; import static org.junit.Assert.*; import java.io.IOException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.eclipse.jetty.server.handler.ErrorHandler; import org.junit.After; import org.junit.Before; import org.junit.Test; public class ErrorHandlerTest { Server server; LocalConnector connector; @Before public void before() throws Exception { server = new Server(); connector = new LocalConnector(server); server.addConnector(connector); server.addBean(new ErrorHandler() { @Override protected void generateAcceptableResponse( Request baseRequest, HttpServletRequest request, HttpServletResponse response, int code, String message, String mimeType) throws IOException { switch(mimeType) { case "text/json": case "application/json": { baseRequest.setHandled(true); response.setContentType(mimeType); response.getWriter() .append("{") .append("code: \"").append(Integer.toString(code)).append("\",") .append("message: \"").append(message).append('"') .append("}"); break; } default: super.generateAcceptableResponse(baseRequest,request,response,code,message,mimeType); } } }); server.start(); } @After public void after() throws Exception { server.stop(); } @Test public void test404NoAccept() throws Exception { String response = connector.getResponse( "GET / HTTP/1.1\r\n"+ "Host: Localhost\r\n"+ "\r\n"); assertThat(response,startsWith("HTTP/1.1 404 ")); assertThat(response,not(containsString("Content-Length: 0"))); assertThat(response,containsString("Content-Type: text/html;charset=iso-8859-1")); } @Test public void test404EmptyAccept() throws Exception { String response = connector.getResponse( "GET / HTTP/1.1\r\n"+ "Accept: \r\n"+ "Host: Localhost\r\n"+ "\r\n"); assertThat(response,startsWith("HTTP/1.1 404 ")); assertThat(response,containsString("Content-Length: 0")); assertThat(response,not(containsString("Content-Type"))); } @Test public void test404UnAccept() throws Exception { String response = connector.getResponse( "GET / HTTP/1.1\r\n"+ "Accept: text/*;q=0\r\n"+ "Host: Localhost\r\n"+ "\r\n"); assertThat(response,startsWith("HTTP/1.1 404 ")); assertThat(response,containsString("Content-Length: 0")); assertThat(response,not(containsString("Content-Type"))); } @Test public void test404AllAccept() throws Exception { String response = connector.getResponse( "GET / HTTP/1.1\r\n"+ "Host: Localhost\r\n"+ "Accept: */*\r\n"+ "\r\n"); assertThat(response,startsWith("HTTP/1.1 404 ")); assertThat(response,not(containsString("Content-Length: 0"))); assertThat(response,containsString("Content-Type: text/html;charset=iso-8859-1")); } @Test public void test404HtmlAccept() throws Exception { String response = connector.getResponse( "GET / HTTP/1.1\r\n"+ "Host: Localhost\r\n"+ "Accept: text/html\r\n"+ "\r\n"); assertThat(response,startsWith("HTTP/1.1 404 ")); assertThat(response,not(containsString("Content-Length: 0"))); assertThat(response,containsString("Content-Type: text/html;charset=iso-8859-1")); } @Test public void test404HtmlAcceptAnyCharset() throws Exception { String response = connector.getResponse( "GET / HTTP/1.1\r\n"+ "Host: Localhost\r\n"+ "Accept: text/html\r\n"+ "Accept-Charset: *\r\n"+ "\r\n"); assertThat(response,startsWith("HTTP/1.1 404 ")); assertThat(response,not(containsString("Content-Length: 0"))); assertThat(response,containsString("Content-Type: text/html;charset=utf-8")); } @Test public void test404HtmlAcceptUtf8Charset() throws Exception { String response = connector.getResponse( "GET / HTTP/1.1\r\n"+ "Host: Localhost\r\n"+ "Accept: text/html\r\n"+ "Accept-Charset: utf-8\r\n"+ "\r\n"); assertThat(response,startsWith("HTTP/1.1 404 ")); assertThat(response,not(containsString("Content-Length: 0"))); assertThat(response,containsString("Content-Type: text/html;charset=utf-8")); } @Test public void test404HtmlAcceptNotUtf8Charset() throws Exception { String response = connector.getResponse( "GET / HTTP/1.1\r\n"+ "Host: Localhost\r\n"+ "Accept: text/html\r\n"+ "Accept-Charset: utf-8;q=0\r\n"+ "\r\n"); assertThat(response,startsWith("HTTP/1.1 404 ")); assertThat(response,not(containsString("Content-Length: 0"))); assertThat(response,containsString("Content-Type: text/html;charset=iso-8859-1")); } @Test public void test404HtmlAcceptNotUtf8UnknownCharset() throws Exception { String response = connector.getResponse( "GET / HTTP/1.1\r\n"+ "Host: Localhost\r\n"+ "Accept: text/html\r\n"+ "Accept-Charset: utf-8;q=0,unknown\r\n"+ "\r\n"); assertThat(response,startsWith("HTTP/1.1 404 ")); assertThat(response,containsString("Content-Length: 0")); assertThat(response,not(containsString("Content-Type"))); } @Test public void test404HtmlAcceptUnknownUtf8Charset() throws Exception { String response = connector.getResponse( "GET / HTTP/1.1\r\n"+ "Host: Localhost\r\n"+ "Accept: text/html\r\n"+ "Accept-Charset: utf-8;q=0.1,unknown\r\n"+ "\r\n"); assertThat(response,startsWith("HTTP/1.1 404 ")); assertThat(response,not(containsString("Content-Length: 0"))); assertThat(response,containsString("Content-Type: text/html;charset=utf-8")); } @Test public void test404PreferHtml() throws Exception { String response = connector.getResponse( "GET / HTTP/1.1\r\n"+ "Host: Localhost\r\n"+ "Accept: text/html;q=1.0,text/json;q=0.5,*/*\r\n"+ "Accept-Charset: *\r\n"+ "\r\n"); assertThat(response,startsWith("HTTP/1.1 404 ")); assertThat(response,not(containsString("Content-Length: 0"))); assertThat(response,containsString("Content-Type: text/html;charset=utf-8")); } @Test public void test404PreferJson() throws Exception { String response = connector.getResponse( "GET / HTTP/1.1\r\n"+ "Host: Localhost\r\n"+ "Accept: text/html;q=0.5,text/json;q=1.0,*/*\r\n"+ "Accept-Charset: *\r\n"+ "\r\n"); assertThat(response,startsWith("HTTP/1.1 404 ")); assertThat(response,not(containsString("Content-Length: 0"))); assertThat(response,containsString("Content-Type: text/json")); } }