/** * Copyright (c) 2009 - 2012 Red Hat, Inc. * * This software is licensed to you under the GNU General Public License, * version 2 (GPLv2). There is NO WARRANTY for this software, express or * implied, including the implied warranties of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2 * along with this software; if not, see * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. * * Red Hat trademarks are not licensed under GPLv2. No permission is * granted to use or replicate Red Hat trademarks that are incorporated * in this software or its documentation. */ package org.candlepin.common.filter; import org.candlepin.common.util.Util; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import javax.servlet.ServletInputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; /** * This class gives us a new ServletInputStream every time we call getInputStream() * so we can read a request body more than once. */ public class TeeHttpServletRequest extends HttpServletRequestWrapper implements BodyLogger { private final byte[] body; public TeeHttpServletRequest(HttpServletRequest request) throws IOException { super(request); InputStream inputStream = request.getInputStream(); if (inputStream != null) { body = IOUtils.toByteArray(inputStream); } else { body = new byte[0]; } } @Override public ServletInputStream getInputStream() throws IOException { final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body); ServletInputStream servletInputStream = new ServletInputStream() { @Override public int read() throws IOException { return byteArrayInputStream.read(); } }; return servletInputStream; } @Override public BufferedReader getReader() throws IOException { return new BufferedReader(new InputStreamReader(this.getInputStream())); } @Override public String getBody() { if (ServletLogger.showAsText(getContentType())) { return new String(body); } return StringUtils.abbreviate(Util.toBase64(body), 100); } }