MultipartFilter.java

  1. /*
  2.  * GovWay - A customizable API Gateway
  3.  * https://govway.org
  4.  *
  5.  * Copyright (c) 2005-2025 Link.it srl (https://link.it).
  6.  *
  7.  * This program is free software: you can redistribute it and/or modify
  8.  * it under the terms of the GNU General Public License version 3, as published by
  9.  * the Free Software Foundation.
  10.  *
  11.  * This program is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  * GNU General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU General Public License
  17.  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  18.  *
  19.  */
  20. package org.openspcoop2.utils.transport.http;

  21. import java.io.ByteArrayInputStream;
  22. import java.io.IOException;

  23. import javax.servlet.Filter;
  24. import javax.servlet.FilterChain;
  25. import javax.servlet.FilterConfig;
  26. import javax.servlet.ReadListener;
  27. import javax.servlet.ServletException;
  28. import javax.servlet.ServletInputStream;
  29. import javax.servlet.ServletRequest;
  30. import javax.servlet.ServletResponse;
  31. import javax.servlet.http.HttpServletRequest;
  32. import javax.servlet.http.HttpServletRequestWrapper;

  33. import org.openspcoop2.utils.Utilities;

  34. /**
  35. * MultipartFilter
  36. *
  37. * @author Andrea Poli (apoli@link.it)
  38. * @author $Author$
  39. * @version $Rev$, $Date$
  40. */
  41. public class MultipartFilter  implements Filter{

  42.     /** Multipart request start */
  43.     public static final String MULTIPART = "multipart/";

  44.     @Override
  45.     public void init(FilterConfig filterConfig) throws ServletException {
  46.     }

  47.     @Override
  48.     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
  49.             throws IOException, ServletException {

  50.         HttpServletRequest httpServletRequest = (HttpServletRequest) request;
  51.         BufferedRequestWrapper reqWrapper = null;
  52.         if(isMultipartRequest(httpServletRequest)){
  53. //          log.debug("Ricevuta Richiesta Multipart...");
  54.             reqWrapper = new BufferedRequestWrapper((HttpServletRequest) request);
  55. //          log.debug("Contenuto: [" +new String(reqWrapper.getBuffer())+"]");
  56.             chain.doFilter(reqWrapper, response);
  57.         }else {
  58.             chain.doFilter(request, response);
  59.         }
  60.     }

  61.     private boolean isMultipartRequest(HttpServletRequest request) {
  62.         if (!"post".equals(request.getMethod().toLowerCase())) {
  63.             return false;
  64.         }

  65.         String contentType = request.getContentType();
  66.         if (contentType == null) {
  67.             return false;
  68.         }

  69.         if (contentType.toLowerCase().startsWith(MULTIPART)) {
  70.             return true;
  71.         }

  72.         return false;
  73.     }

  74.     @Override
  75.     public void destroy() {
  76.     }


  77.     private class BufferedRequestWrapper extends HttpServletRequestWrapper {

  78.         private ByteArrayInputStream bais;

  79.         private BufferedServletInputStream bsis;

  80.         private byte[] buffer;

  81.         public BufferedRequestWrapper(HttpServletRequest req) throws IOException {
  82.             super(req);
  83.             try {
  84.                 this.buffer = Utilities.getAsByteArray(req.getInputStream());
  85.             }catch(Exception e) {
  86.                 throw new IOException(e);
  87.             }
  88.         }

  89.         @Override
  90.         public ServletInputStream getInputStream() {
  91.             try {
  92.                 this.bais = new ByteArrayInputStream(this.buffer);
  93.                 this.bsis = new BufferedServletInputStream(this.bais);
  94.             } catch (Exception ex) {
  95.                 ex.printStackTrace(System.err);
  96.             }

  97.             return this.bsis;
  98.         }

  99.         @SuppressWarnings("unused")
  100.         public byte[] getBuffer() {
  101.             return this.buffer;
  102.         }
  103.     }

  104.     class BufferedServletInputStream extends ServletInputStream {

  105.         private ByteArrayInputStream bais;

  106.         public BufferedServletInputStream(ByteArrayInputStream bais) {
  107.             this.bais = bais;
  108.         }

  109.         @Override
  110.         public int available() {
  111.             return this.bais.available();
  112.         }

  113.         @Override
  114.         public int read() {
  115.             return this.bais.read();
  116.         }

  117.         @Override
  118.         public int read(byte[] buf, int off, int len) {
  119.             return this.bais.read(buf, off, len);
  120.         }

  121.         @Override
  122.         public boolean isFinished() {
  123.             return false;
  124.         }

  125.         @Override
  126.         public boolean isReady() {
  127.             return true;
  128.         }

  129.         @Override
  130.         public void setReadListener(ReadListener arg0) {
  131.            
  132.         }

  133.     }

  134. }