/** * 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.falcon.resource.proxy; import org.apache.falcon.FalconWebException; import org.apache.hadoop.io.IOUtils; import javax.servlet.RequestDispatcher; import javax.servlet.ServletInputStream; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import javax.ws.rs.core.Response; import java.io.*; import java.security.Principal; import java.util.Enumeration; import java.util.Locale; import java.util.Map; /** * A buffered implementation of HttpServletRequest. */ public class BufferedRequest implements HttpServletRequest { private final HttpServletRequest request; private final ServletInputStream stream; private final ThreadLocal<ByteArrayOutputStream> streams = new ThreadLocal<ByteArrayOutputStream>() { @Override protected ByteArrayOutputStream initialValue() { return new ByteArrayOutputStream(2 * 1024); } }; public BufferedRequest(HttpServletRequest request) { try { this.request = request; ByteArrayOutputStream copyBuffer = streams.get(); copyBuffer.reset(); IOUtils.copyBytes(request.getInputStream(), copyBuffer, 4096, false); final ByteArrayInputStream buffer = new ByteArrayInputStream(copyBuffer.toByteArray(), 0, copyBuffer.size()); stream = new ServletInputStream() { @Override public int read() throws IOException { return buffer.read(); } @Override public void mark(int readlimit) { buffer.mark(readlimit); } @Override public void reset() throws IOException { buffer.reset(); } @Override public boolean markSupported() { return buffer.markSupported(); } }; stream.mark(10 * 1024 * 1024); } catch (IOException e) { throw FalconWebException.newException(e, Response.Status.INTERNAL_SERVER_ERROR); } } @Override public String getAuthType() { return request.getAuthType(); } @Override public Cookie[] getCookies() { return request.getCookies(); } @Override public long getDateHeader(String name) { return request.getDateHeader(name); } @Override public String getHeader(String name) { return request.getHeader(name); } @Override public Enumeration getHeaders(String name) { return request.getHeaders(name); } @Override public Enumeration getHeaderNames() { return request.getHeaderNames(); } @Override public int getIntHeader(String name) { return request.getIntHeader(name); } @Override public String getMethod() { return request.getMethod(); } @Override public String getPathInfo() { return request.getPathInfo(); } @Override public String getPathTranslated() { return request.getPathTranslated(); } @Override public String getContextPath() { return request.getContextPath(); } @Override public String getQueryString() { return request.getQueryString(); } @Override public String getRemoteUser() { return request.getRemoteUser(); } @Override public boolean isUserInRole(String role) { return request.isUserInRole(role); } @Override public Principal getUserPrincipal() { return request.getUserPrincipal(); } @Override public String getRequestedSessionId() { return request.getRequestedSessionId(); } @Override public String getRequestURI() { return request.getRequestURI(); } @Override public StringBuffer getRequestURL() { return request.getRequestURL(); } @Override public String getServletPath() { return request.getServletPath(); } @Override public HttpSession getSession(boolean create) { return request.getSession(create); } @Override public HttpSession getSession() { return request.getSession(); } @Override public boolean isRequestedSessionIdValid() { return request.isRequestedSessionIdValid(); } @Override public boolean isRequestedSessionIdFromCookie() { return request.isRequestedSessionIdFromCookie(); } @Override public boolean isRequestedSessionIdFromURL() { return request.isRequestedSessionIdFromURL(); } @Override public boolean isRequestedSessionIdFromUrl() { return request.isRequestedSessionIdFromUrl(); } @Override public Object getAttribute(String name) { return request.getAttribute(name); } @Override public Enumeration getAttributeNames() { return request.getAttributeNames(); } @Override public String getCharacterEncoding() { return request.getCharacterEncoding(); } @Override public void setCharacterEncoding(String env) throws UnsupportedEncodingException { } @Override public int getContentLength() { return request.getContentLength(); } @Override public String getContentType() { return request.getContentType(); } @Override public ServletInputStream getInputStream() throws IOException { return stream; } @Override public String getParameter(String name) { return request.getParameter(name); } @Override public Enumeration getParameterNames() { return request.getParameterNames(); } @Override public String[] getParameterValues(String name) { return request.getParameterValues(name); } @Override public Map getParameterMap() { return request.getParameterMap(); } @Override public String getProtocol() { return request.getProtocol(); } @Override public String getScheme() { return request.getScheme(); } @Override public String getServerName() { return request.getServerName(); } @Override public int getServerPort() { return request.getServerPort(); } @Override public BufferedReader getReader() throws IOException { return request.getReader(); } @Override public String getRemoteAddr() { return request.getRemoteAddr(); } @Override public String getRemoteHost() { return request.getRemoteHost(); } @Override public void setAttribute(String name, Object o) { } @Override public void removeAttribute(String name) { } @Override public Locale getLocale() { return request.getLocale(); } @Override public Enumeration getLocales() { return request.getLocales(); } @Override public boolean isSecure() { return request.isSecure(); } @Override public RequestDispatcher getRequestDispatcher(String path) { return request.getRequestDispatcher(path); } @Override public String getRealPath(String path) { return request.getRealPath(path); } @Override public int getRemotePort() { return request.getRemotePort(); } @Override public String getLocalName() { return request.getLocalName(); } @Override public String getLocalAddr() { return request.getLocalAddr(); } @Override public int getLocalPort() { return request.getLocalPort(); } }