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