ConnettoreHTTPCOREUtils.java

/*
 * GovWay - A customizable API Gateway 
 * https://govway.org
 * 
 * Copyright (c) 2005-2025 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.pdd.core.connettori.httpcore5;

import java.net.URL;
import java.util.concurrent.TimeUnit;

import org.apache.hc.client5.http.classic.methods.HttpDelete;
import org.apache.hc.client5.http.classic.methods.HttpGet;
import org.apache.hc.client5.http.classic.methods.HttpHead;
import org.apache.hc.client5.http.classic.methods.HttpOptions;
import org.apache.hc.client5.http.classic.methods.HttpPatch;
import org.apache.hc.client5.http.classic.methods.HttpPost;
import org.apache.hc.client5.http.classic.methods.HttpPut;
import org.apache.hc.client5.http.classic.methods.HttpTrace;
import org.apache.hc.client5.http.classic.methods.HttpUriRequestBase;
import org.apache.hc.client5.http.config.ConnectionConfig;
import org.apache.hc.client5.http.config.RequestConfig;
import org.openspcoop2.pdd.core.connettori.AbstractConnettoreConnectionConfig;
import org.openspcoop2.pdd.core.connettori.ConnettoreException;
import org.openspcoop2.pdd.core.connettori.ConnettoreHttpPoolParams;
import org.openspcoop2.utils.transport.http.HttpRequestMethod;
import org.openspcoop2.utils.transport.http.HttpUtilities;

/**
 * ConnettoreHTTPCOREUtils
 *
 *
 * @author Poli Andrea (apoli@link.it)
 * @author $Author$
 * @version $Rev$, $Date$
 */
public class ConnettoreHTTPCOREUtils {

	private ConnettoreHTTPCOREUtils() {}
	
	public static ConnectionConfig buildConnectionConfig(ConnettoreHttpPoolParams poolParams, long connectionTimeout,
			boolean idleConnectionEvictorEnabled, int sleepTimeSeconds) {
		ConnectionConfig.Builder buider = ConnectionConfig.custom();
		buider.setConnectTimeout(connectionTimeout, TimeUnit.MILLISECONDS);
		/**
		 * specifica l'intervallo di tempo di inattività dopo il quale le connessioni persistenti dovrebbero essere convalidate prima di essere riutilizzate. 
		 * Questo è importante per evitare l'uso di connessioni che potrebbero essere state chiuse dal server o interrotte per altri motivi.
		 * Un parametro troppo basso, a meno che non ci sia una necessità specifica, non va usato poiché ciò potrebbe introdurre un overhead significativo e influire sulle prestazioni complessive dell'applicazione.
		 **/
		if(poolParams.getValidateAfterInactivity()!=null) {
			buider.setValidateAfterInactivity(poolParams.getValidateAfterInactivity().intValue(), TimeUnit.MILLISECONDS);
		}
		
		if(idleConnectionEvictorEnabled) {
			// Defines the total span of time connections can be kept alive or execute requests
			buider.setTimeToLive(sleepTimeSeconds, TimeUnit.SECONDS);
		}
		
		return buider.build();
	}

	public static void setTimeout(RequestConfig.Builder requestConfigBuilder, AbstractConnettoreConnectionConfig connectionConfig) {
		int connectionTimeout = -1;
		if(connectionConfig.getConnectionTimeout()!=null) {
			connectionTimeout = connectionConfig.getConnectionTimeout();
		}
		else {
			connectionTimeout = HttpUtilities.HTTP_CONNECTION_TIMEOUT;
		}
		requestConfigBuilder.setConnectionRequestTimeout(connectionTimeout, TimeUnit.MILLISECONDS); // quanto tempo il client aspetterà per ottenere una connessione dal pool.
		/** requestConfigBuilder.setConnectTimeout(connectionTimeout, TimeUnit.MILLISECONDS); spostato in initialize della connnection */
		
		
		int readTimeout = -1;
		if(connectionConfig.getReadTimeout()!=null) {
			readTimeout = connectionConfig.getReadTimeout();
		}
		else {
			readTimeout = HttpUtilities.HTTP_READ_CONNECTION_TIMEOUT;
		}
		requestConfigBuilder.setResponseTimeout( readTimeout, TimeUnit.MILLISECONDS  ); // // Defines the socket timeout (SO_TIMEOUT) in milliseconds, which is the timeout for waiting for data or, put differently, a maximum period inactivity between two consecutive data packets).
		
	}
	
	public static void setRedirect(RequestConfig.Builder requestConfigBuilder, AbstractConnettoreConnectionConfig connectionConfig) {
		requestConfigBuilder.setRedirectsEnabled(connectionConfig.isFollowRedirect());
		requestConfigBuilder.setCircularRedirectsAllowed(true); // da file properties
		requestConfigBuilder.setMaxRedirects(connectionConfig.getMaxNumberRedirects());
	}
	
	public static HttpUriRequestBase buildHttpRequest(HttpRequestMethod httpMethod, URL url) throws ConnettoreException {
		if(httpMethod==null){
			throw new ConnettoreException("HttpRequestMethod non definito");
		}
		HttpUriRequestBase httpRequest = null;
		switch (httpMethod) {
			case GET:
				httpRequest = new HttpGet(url.toString());
				break;
			case DELETE:
				httpRequest = new HttpDelete(url.toString());
				break;
			case HEAD:
				httpRequest = new HttpHead(url.toString());
				break;
			case POST:
				httpRequest = new HttpPost(url.toString());
				break;
			case PUT:
				httpRequest = new HttpPut(url.toString());
				break;
			case OPTIONS:
				httpRequest = new HttpOptions(url.toString());
				break;
			case TRACE:
				httpRequest = new HttpTrace(url.toString());
				break;
			case PATCH:
				httpRequest = new HttpPatch(url.toString());
				break;	
			default:
				httpRequest = new CustomHttpCoreEntity(httpMethod, url.toString());
				break;
		}
		return httpRequest;
	}
	
}