/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.catalina.manager;
import java.io.File;
import java.io.StringReader;
import javax.xml.parsers.DocumentBuilderFactory;
import org.junit.Assert;
import org.junit.Test;
import static org.apache.catalina.startup.SimpleHttpClient.CRLF;
import org.apache.catalina.Context;
import org.apache.catalina.Wrapper;
import org.apache.catalina.startup.SimpleHttpClient;
import org.apache.catalina.startup.Tomcat;
import org.apache.catalina.startup.TomcatBaseTest;
import org.apache.tomcat.util.json.JSONParser;
import org.w3c.dom.Document;
import org.w3c.dom.ls.DOMImplementationLS;
import org.xml.sax.InputSource;
public class TestStatusTransformer extends TomcatBaseTest {
enum Mode {
HTML,
XML,
JSON
}
@Test
public void testJSON() throws Exception {
testStatusServlet(Mode.JSON);
}
@Test
public void testXML() throws Exception {
testStatusServlet(Mode.XML);
}
@Test
public void testHTML() throws Exception {
testStatusServlet(Mode.HTML);
}
protected void testStatusServlet(Mode mode) throws Exception {
Tomcat tomcat = getTomcatInstance();
// Add default servlet to make some requests
File appDir = new File("test/webapp");
Context ctxt = tomcat.addContext("", appDir.getAbsolutePath());
ctxt.setPrivileged(true);
Wrapper defaultServlet = Tomcat.addServlet(ctxt, "default", "org.apache.catalina.servlets.DefaultServlet");
defaultServlet.addInitParameter("fileEncoding", "ISO-8859-1");
ctxt.addServletMappingDecoded("/", "default");
Tomcat.addServlet(ctxt, "status", "org.apache.catalina.manager.StatusManagerServlet");
ctxt.addServletMappingDecoded("/status/*", "status");
ctxt.addMimeMapping("html", "text/html");
Context ctxt2 = tomcat.addContext("/test", null);
Tomcat.addServlet(ctxt2, "status", "org.apache.catalina.manager.StatusManagerServlet");
ctxt.addServletMappingDecoded("/somepath/*", "status");
tomcat.start();
SimpleHttpClient client = new SimpleHttpClient() {
@Override
public boolean isResponseBodyOK() {
return true;
}
};
client.setPort(getPort());
// @formatter:off
client.setRequest(new String[] {
"GET /index.html HTTP/1.1" + CRLF +
"Host: localhost" + CRLF +
"Connection: Close" + CRLF +
CRLF
});
// @formatter:on
client.connect();
client.processRequest(true);
String requestline = null;
switch (mode) {
case XML -> requestline = "GET /status/all?XML=true HTTP/1.1";
case JSON -> requestline = "GET /status/all?JSON=true HTTP/1.1";
default -> requestline = "GET /status/all HTTP/1.1";
}
// @formatter:off
client.setRequest(new String[] {
requestline + CRLF +
"Host: localhost" + CRLF +
"Connection: Close" + CRLF +
CRLF
});
// @formatter:on
client.connect();
client.processRequest(true);
String body = client.getResponseBody();
if (mode.equals(Mode.JSON)) {
JSONParser parser = new JSONParser(body);
String result = parser.parse().toString();
Assert.assertTrue(result.contains("name=localhost/"));
} else if (mode.equals(Mode.XML)) {
try (StringReader reader = new StringReader(body)) {
Document xmlDocument =
DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new InputSource(reader));
String serialized = ((DOMImplementationLS) xmlDocument.getImplementation()).createLSSerializer()
.writeToString(xmlDocument);
// Verify that a request is being processed
Assert.assertTrue(serialized.contains("stage=\"S\""));
}
} else {
// Verify that a request is being processed
Assert.assertTrue(body.contains("<strong>S</strong>"));
}
}
}