HADOOP-13588. ConfServlet should respect Accept request header. Contributed by Weiwei Yang

This commit is contained in:
Mingliang Liu 2016-09-12 16:01:26 -07:00
parent 8a93f45a80
commit 59d59667a8
2 changed files with 37 additions and 8 deletions

View File

@ -24,11 +24,14 @@ import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.core.HttpHeaders;
import org.apache.hadoop.classification.InterfaceAudience;
import org.apache.hadoop.classification.InterfaceStability;
import org.apache.hadoop.http.HttpServer2;
import com.google.common.annotations.VisibleForTesting;
/**
* A servlet to print out the running configuration data.
*/
@ -37,9 +40,8 @@ import org.apache.hadoop.http.HttpServer2;
public class ConfServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static final String FORMAT_JSON = "json";
private static final String FORMAT_XML = "xml";
private static final String FORMAT_PARAM = "format";
protected static final String FORMAT_JSON = "json";
protected static final String FORMAT_XML = "xml";
/**
* Return the Configuration of the daemon hosting this servlet.
@ -61,11 +63,7 @@ public class ConfServlet extends HttpServlet {
return;
}
String format = request.getParameter(FORMAT_PARAM);
if (null == format) {
format = FORMAT_XML;
}
String format = parseAccecptHeader(request);
if (FORMAT_XML.equals(format)) {
response.setContentType("text/xml; charset=utf-8");
} else if (FORMAT_JSON.equals(format)) {
@ -81,6 +79,13 @@ public class ConfServlet extends HttpServlet {
out.close();
}
@VisibleForTesting
static String parseAccecptHeader(HttpServletRequest request) {
String format = request.getHeader(HttpHeaders.ACCEPT);
return format != null && format.contains(FORMAT_JSON) ?
FORMAT_JSON : FORMAT_XML;
}
/**
* Guts of the servlet - extracted for easy testing.
*/

View File

@ -19,7 +19,11 @@ package org.apache.hadoop.conf;
import java.io.StringWriter;
import java.io.StringReader;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.core.HttpHeaders;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
@ -32,6 +36,7 @@ import org.xml.sax.InputSource;
import junit.framework.TestCase;
import org.junit.Test;
import org.mockito.Mockito;
/**
* Basic test case that the ConfServlet can write configuration
@ -47,6 +52,25 @@ public class TestConfServlet extends TestCase {
return testConf;
}
@Test
public void testParseHeaders() throws Exception {
HashMap<String, String> verifyMap = new HashMap<String, String>();
verifyMap.put("text/plain", ConfServlet.FORMAT_XML);
verifyMap.put(null, ConfServlet.FORMAT_XML);
verifyMap.put("text/xml", ConfServlet.FORMAT_XML);
verifyMap.put("application/xml", ConfServlet.FORMAT_XML);
verifyMap.put("application/json", ConfServlet.FORMAT_JSON);
HttpServletRequest request = Mockito.mock(HttpServletRequest.class);
for(String contentTypeExpected : verifyMap.keySet()) {
String contenTypeActual = verifyMap.get(contentTypeExpected);
Mockito.when(request.getHeader(HttpHeaders.ACCEPT))
.thenReturn(contentTypeExpected);
assertEquals(contenTypeActual,
ConfServlet.parseAccecptHeader(request));
}
}
@Test
@SuppressWarnings("unchecked")
public void testWriteJson() throws Exception {