XPoweredByFilter.java

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

import java.io.IOException;
import java.io.PrintWriter;

import org.apache.commons.lang3.StringUtils;

import jakarta.servlet.Filter;
import jakarta.servlet.FilterChain;
import jakarta.servlet.FilterConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpServletResponseWrapper;

/**
* XPoweredByFilter
*
* @author Andrea Poli (apoli@link.it)
* @author $Author$
* @version $Rev$, $Date$
*/
public class XPoweredByFilter implements Filter {
	
	private boolean enabled = false;
	private String value = null;
	
	private static final String XPOWEREDBY_CONFIG_ENABLED = "xPoweredBy.enabled";
	private static final String XPOWEREDBY_CONFIG_VAUE = "xPoweredBy.value"; // impostare a string vuota o non impostarlo per non far generare l'header
	
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		if(filterConfig!=null) {
			String tmp = filterConfig.getInitParameter(XPOWEREDBY_CONFIG_ENABLED);
			if(tmp!=null && "true".equalsIgnoreCase(tmp.trim())) {
				this.enabled = true;
			}
			
			tmp = filterConfig.getInitParameter(XPOWEREDBY_CONFIG_VAUE);
			if(tmp!=null) {
				this.value = tmp.trim();
				if(StringUtils.isEmpty(this.value)) {
					this.value=null;
				}
			}
		}
	}
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

	    if (!this.enabled) {
	    	chain.doFilter(request, response);
	    	return;
	    }

        chain.doFilter(request, new XPoweredByResponseProxy((HttpServletResponse)response, this.value));
    }

}

class XPoweredByResponseProxy extends HttpServletResponseWrapper{

	private final HttpServletResponse response;
	private String value;

	public XPoweredByResponseProxy(final HttpServletResponse resp, String value) {
		super(resp);
		this.response = resp;
		this.value = value;
	}

	@Override
	public void sendError(final int sc) throws IOException {
		setXPoweredBy();
		super.sendError(sc);
	}
	@Override
	public void sendError(final int sc, final String msg) throws IOException {
		setXPoweredBy();
		super.sendError(sc, msg);
	}
	
	@Override
	public void sendRedirect(final String location) throws IOException {
		setXPoweredBy();
		super.sendRedirect(location);
	}


	@Override
	public PrintWriter getWriter() throws IOException {
		setXPoweredBy();
		return super.getWriter();
	}
	@Override
	public ServletOutputStream getOutputStream() throws IOException {
		setXPoweredBy();
		return super.getOutputStream();
	}

	private void setXPoweredBy() {

		this.response.setHeader(HttpConstants.X_POWERED_BY, this.value);
		
	}

}