| /** |
| * Licensed 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. See accompanying LICENSE file. |
| */ |
| package org.apache.hadoop.security.authentication.examples; |
| |
| import org.slf4j.Logger; |
| import org.slf4j.LoggerFactory; |
| |
| import javax.servlet.Filter; |
| import javax.servlet.FilterChain; |
| import javax.servlet.FilterConfig; |
| import javax.servlet.ServletException; |
| import javax.servlet.ServletRequest; |
| import javax.servlet.ServletResponse; |
| import javax.servlet.http.Cookie; |
| import javax.servlet.http.HttpServletRequest; |
| import javax.servlet.http.HttpServletRequestWrapper; |
| import javax.servlet.http.HttpServletResponse; |
| import javax.servlet.http.HttpServletResponseWrapper; |
| import java.io.IOException; |
| import java.util.ArrayList; |
| import java.util.Enumeration; |
| import java.util.HashMap; |
| import java.util.List; |
| import java.util.Map; |
| |
| /** |
| * Servlet filter that logs HTTP request/response headers |
| */ |
| public class RequestLoggerFilter implements Filter { |
| private static Logger LOG = LoggerFactory.getLogger(RequestLoggerFilter.class); |
| |
| @Override |
| public void init(FilterConfig filterConfig) throws ServletException { |
| } |
| |
| @Override |
| public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) |
| throws IOException, ServletException { |
| if (!LOG.isDebugEnabled()) { |
| filterChain.doFilter(request, response); |
| } |
| else { |
| XHttpServletRequest xRequest = new XHttpServletRequest((HttpServletRequest) request); |
| XHttpServletResponse xResponse = new XHttpServletResponse((HttpServletResponse) response); |
| try { |
| LOG.debug(xRequest.getResquestInfo().toString()); |
| filterChain.doFilter(xRequest, xResponse); |
| } |
| finally { |
| LOG.debug(xResponse.getResponseInfo().toString()); |
| } |
| } |
| } |
| |
| @Override |
| public void destroy() { |
| } |
| |
| private static class XHttpServletRequest extends HttpServletRequestWrapper { |
| |
| public XHttpServletRequest(HttpServletRequest request) { |
| super(request); |
| } |
| |
| public StringBuffer getResquestInfo() { |
| StringBuffer sb = new StringBuffer(512); |
| sb.append("\n").append("> ").append(getMethod()).append(" ").append(getRequestURL()); |
| if (getQueryString() != null) { |
| sb.append("?").append(getQueryString()); |
| } |
| sb.append("\n"); |
| Enumeration names = getHeaderNames(); |
| while (names.hasMoreElements()) { |
| String name = (String) names.nextElement(); |
| Enumeration values = getHeaders(name); |
| while (values.hasMoreElements()) { |
| String value = (String) values.nextElement(); |
| sb.append("> ").append(name).append(": ").append(value).append("\n"); |
| } |
| } |
| sb.append(">"); |
| return sb; |
| } |
| } |
| |
| private static class XHttpServletResponse extends HttpServletResponseWrapper { |
| private Map<String, List<String>> headers = new HashMap<String, List<String>>(); |
| private int status; |
| private String message; |
| |
| public XHttpServletResponse(HttpServletResponse response) { |
| super(response); |
| } |
| |
| private List<String> getHeaderValues(String name, boolean reset) { |
| List<String> values = headers.get(name); |
| if (reset || values == null) { |
| values = new ArrayList<String>(); |
| headers.put(name, values); |
| } |
| return values; |
| } |
| |
| @Override |
| public void addCookie(Cookie cookie) { |
| super.addCookie(cookie); |
| List<String> cookies = getHeaderValues("Set-Cookie", false); |
| cookies.add(cookie.getName() + "=" + cookie.getValue()); |
| } |
| |
| @Override |
| public void sendError(int sc, String msg) throws IOException { |
| super.sendError(sc, msg); |
| status = sc; |
| message = msg; |
| } |
| |
| |
| @Override |
| public void sendError(int sc) throws IOException { |
| super.sendError(sc); |
| status = sc; |
| } |
| |
| @Override |
| public void setStatus(int sc) { |
| super.setStatus(sc); |
| status = sc; |
| } |
| |
| @Override |
| public void setStatus(int sc, String msg) { |
| super.setStatus(sc, msg); |
| status = sc; |
| message = msg; |
| } |
| |
| @Override |
| public void setHeader(String name, String value) { |
| super.setHeader(name, value); |
| List<String> values = getHeaderValues(name, true); |
| values.add(value); |
| } |
| |
| @Override |
| public void addHeader(String name, String value) { |
| super.addHeader(name, value); |
| List<String> values = getHeaderValues(name, false); |
| values.add(value); |
| } |
| |
| public StringBuffer getResponseInfo() { |
| if (status == 0) { |
| status = 200; |
| message = "OK"; |
| } |
| StringBuffer sb = new StringBuffer(512); |
| sb.append("\n").append("< ").append("status code: ").append(status); |
| if (message != null) { |
| sb.append(", message: ").append(message); |
| } |
| sb.append("\n"); |
| for (Map.Entry<String, List<String>> entry : headers.entrySet()) { |
| for (String value : entry.getValue()) { |
| sb.append("< ").append(entry.getKey()).append(": ").append(value).append("\n"); |
| } |
| } |
| sb.append("<"); |
| return sb; |
| } |
| } |
| } |