1
2
3
4
5
6
7 package waffle.servlet;
8
9 import jakarta.servlet.http.HttpServlet;
10 import jakarta.servlet.http.HttpServletRequest;
11 import jakarta.servlet.http.HttpServletResponse;
12
13 import java.io.IOException;
14 import java.security.Principal;
15 import java.util.Collections;
16 import java.util.List;
17
18 import javax.xml.XMLConstants;
19 import javax.xml.parsers.ParserConfigurationException;
20 import javax.xml.transform.OutputKeys;
21 import javax.xml.transform.Transformer;
22 import javax.xml.transform.TransformerException;
23 import javax.xml.transform.TransformerFactory;
24 import javax.xml.transform.dom.DOMSource;
25 import javax.xml.transform.stream.StreamResult;
26
27 import org.slf4j.Logger;
28 import org.slf4j.LoggerFactory;
29 import org.w3c.dom.Document;
30 import org.w3c.dom.Element;
31
32 import waffle.util.WaffleInfo;
33
34
35
36
37 public class WaffleInfoServlet extends HttpServlet {
38
39
40 private static final long serialVersionUID = 1L;
41
42
43 private static final Logger logger = LoggerFactory.getLogger(WaffleInfoServlet.class);
44
45 @Override
46 public void doGet(final HttpServletRequest request, final HttpServletResponse response) {
47 this.getWaffleInfoResponse(request, response);
48 }
49
50 @Override
51 public void doPost(final HttpServletRequest request, final HttpServletResponse response) {
52 this.getWaffleInfoResponse(request, response);
53 }
54
55
56
57
58
59
60
61
62
63 public void getWaffleInfoResponse(final HttpServletRequest request, final HttpServletResponse response) {
64 final WaffleInfo info = new WaffleInfo();
65 try {
66 final Document doc = info.getWaffleInfo();
67 final Element root = doc.getDocumentElement();
68
69
70 final Element http = this.getRequestInfo(doc, request);
71 root.insertBefore(http, root.getFirstChild());
72
73
74 final String[] lookup = request.getParameterValues("lookup");
75 if (lookup != null) {
76 for (final String name : lookup) {
77 root.appendChild(info.getLookupInfo(doc, name));
78 }
79 }
80
81
82 final TransformerFactory transfac = TransformerFactory.newInstance();
83 transfac.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
84 transfac.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, "");
85
86 final Transformer trans = transfac.newTransformer();
87 trans.setOutputProperty(OutputKeys.INDENT, "yes");
88
89 final StreamResult result = new StreamResult(response.getWriter());
90 final DOMSource source = new DOMSource(doc);
91 trans.transform(source, result);
92 response.setContentType("application/xml");
93 } catch (final ParserConfigurationException | TransformerException | IOException e) {
94 WaffleInfoServlet.logger.error("", e);
95 throw new RuntimeException("See logs for underlying error condition");
96 }
97 }
98
99
100
101
102
103
104
105
106
107
108
109 private Element getRequestInfo(final Document doc, final HttpServletRequest request) {
110 final Element node = doc.createElement("request");
111
112 Element value = doc.createElement("AuthType");
113 value.setTextContent(request.getAuthType());
114 node.appendChild(value);
115
116 final Principal p = request.getUserPrincipal();
117 if (p != null) {
118 final Element child = doc.createElement("principal");
119 child.setAttribute("class", p.getClass().getName());
120
121 value = doc.createElement("name");
122 value.setTextContent(p.getName());
123 child.appendChild(value);
124
125 value = doc.createElement("string");
126 value.setTextContent(p.toString());
127 child.appendChild(value);
128
129 node.appendChild(child);
130 }
131
132 final List<String> headers = Collections.list(request.getHeaderNames());
133 if (!headers.isEmpty()) {
134 final Element child = doc.createElement("headers");
135 for (String header : headers) {
136 value = doc.createElement(header);
137 value.setTextContent(request.getHeader(header));
138 child.appendChild(value);
139 }
140 node.appendChild(child);
141 }
142 return node;
143 }
144
145 }