InRequestProtocolHandlerGestioneControlloTraffico.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.controllo_traffico.handler;
- import java.security.SecureRandom;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.Iterator;
- import java.util.List;
- import java.util.Map;
- import java.util.Properties;
- import org.openspcoop2.core.commons.CoreException;
- import org.openspcoop2.core.config.PortaApplicativa;
- import org.openspcoop2.core.config.PortaDelegata;
- import org.openspcoop2.core.config.driver.DriverConfigurazioneNotFound;
- import org.openspcoop2.core.controllo_traffico.AttivazionePolicy;
- import org.openspcoop2.core.controllo_traffico.ConfigurazioneGenerale;
- import org.openspcoop2.core.controllo_traffico.ConfigurazionePolicy;
- import org.openspcoop2.core.controllo_traffico.ElencoIdPolicyAttive;
- import org.openspcoop2.core.controllo_traffico.IdActivePolicy;
- import org.openspcoop2.core.controllo_traffico.beans.DatiTransazione;
- import org.openspcoop2.core.controllo_traffico.beans.IDUnivocoGroupByPolicy;
- import org.openspcoop2.core.controllo_traffico.beans.UniqueIdentifierUtilities;
- import org.openspcoop2.core.controllo_traffico.constants.Costanti;
- import org.openspcoop2.core.controllo_traffico.constants.TipoErrore;
- import org.openspcoop2.core.controllo_traffico.constants.TipoRisorsa;
- import org.openspcoop2.core.controllo_traffico.constants.TipoRisorsaPolicyAttiva;
- import org.openspcoop2.core.controllo_traffico.driver.IGestorePolicyAttive;
- import org.openspcoop2.core.controllo_traffico.utils.PolicyUtilities;
- import org.openspcoop2.core.eventi.constants.CodiceEventoControlloTraffico;
- import org.openspcoop2.core.eventi.constants.TipoEvento;
- import org.openspcoop2.message.constants.ServiceBinding;
- import org.openspcoop2.pdd.config.ConfigurazionePdDManager;
- import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
- import org.openspcoop2.pdd.core.PdDContext;
- import org.openspcoop2.pdd.core.controllo_traffico.ConfigurazioneGatewayControlloTraffico;
- import org.openspcoop2.pdd.core.controllo_traffico.ConnettoreUtilities;
- import org.openspcoop2.pdd.core.controllo_traffico.CostantiControlloTraffico;
- import org.openspcoop2.pdd.core.controllo_traffico.DatiTempiRisposta;
- import org.openspcoop2.pdd.core.controllo_traffico.GeneratoreMessaggiDiagnostici;
- import org.openspcoop2.pdd.core.controllo_traffico.GeneratoreMessaggiErrore;
- import org.openspcoop2.pdd.core.controllo_traffico.GestoreControlloTraffico;
- import org.openspcoop2.pdd.core.controllo_traffico.RisultatoVerificaPolicy;
- import org.openspcoop2.pdd.core.controllo_traffico.StatoTraffico;
- import org.openspcoop2.pdd.core.controllo_traffico.policy.InterceptorPolicyUtilities;
- import org.openspcoop2.pdd.core.controllo_traffico.policy.PolicyFiltroApplicativoUtilities;
- import org.openspcoop2.pdd.core.controllo_traffico.policy.PolicyVerifier;
- import org.openspcoop2.pdd.core.controllo_traffico.policy.config.PolicyConfiguration;
- import org.openspcoop2.pdd.core.controllo_traffico.policy.driver.GestorePolicyAttive;
- import org.openspcoop2.pdd.core.handlers.HandlerException;
- import org.openspcoop2.pdd.core.handlers.InRequestProtocolContext;
- import org.openspcoop2.pdd.core.transazioni.Transaction;
- import org.openspcoop2.pdd.core.transazioni.TransactionDeletedException;
- import org.openspcoop2.pdd.logger.MsgDiagnosticiProperties;
- import org.openspcoop2.pdd.logger.MsgDiagnostico;
- import org.openspcoop2.pdd.logger.OpenSPCoop2Logger;
- import org.openspcoop2.protocol.sdk.constants.EsitoTransazioneName;
- import org.openspcoop2.protocol.sdk.state.RequestInfo;
- import org.openspcoop2.protocol.sdk.state.StateMessage;
- import org.openspcoop2.protocol.utils.EsitiProperties;
- import org.openspcoop2.utils.Utilities;
- import org.slf4j.Logger;
- /**
- * InRequestProtocolHandlerGestioneControlloTraffico
- *
- * @author Poli Andrea (poli@link.it)
- * @author $Author$
- * @version $Rev$, $Date$
- */
- public class InRequestProtocolHandlerGestioneControlloTraffico {
- private static java.util.Random rndEngine = null;
- private static synchronized void initRandom() {
- if(rndEngine==null) {
- rndEngine = new SecureRandom();
- }
- }
- public static java.util.Random getRandom() {
- if(rndEngine==null) {
- initRandom();
- }
- return rndEngine;
- }
-
- public void process(InRequestProtocolContext context, Transaction tr) throws HandlerException{
-
- Map<TipoRisorsaPolicyAttiva, ElencoIdPolicyAttive> mapPolicyAttive = null;
- boolean mapFromRequestInfo = false;
-
- DatiTransazione datiTransazione = null;
-
- IGestorePolicyAttive gestorePolicyGlobale = null;
- IGestorePolicyAttive gestorePolicyPorta = null;
- PolicyConfiguration policyConfigurationGlobale = null;
- PolicyConfiguration policyConfigurationPorta = null;
- PolicyConfiguration policyConfigurationHeaderHttp = null;
-
- GestoreControlloTraffico gestoreControlloTraffico = null;
- ConfigurazionePdDManager configPdDManager = null;
-
- TipoErrore tipoErrore = TipoErrore.FAULT;
- boolean includiDescrizioneErrore = true;
-
- ConfigurazioneGatewayControlloTraffico configurazioneControlloTraffico = null;
-
- Logger log = null;
-
- ServiceBinding serviceBinding = ServiceBinding.REST;
-
- RequestInfo requestInfo = null;
- if(context!=null && context.getPddContext()!=null && context.getPddContext().containsKey(org.openspcoop2.core.constants.Costanti.REQUEST_INFO)){
- requestInfo = (RequestInfo) context.getPddContext().getObject(org.openspcoop2.core.constants.Costanti.REQUEST_INFO);
- }
-
- boolean registerThread = true;
- OpenSPCoop2Properties op2Properties = null;
- try{
-
- // ConfigurazioneControlloTraffico
- op2Properties = OpenSPCoop2Properties.getInstance();
- configurazioneControlloTraffico = op2Properties.getConfigurazioneControlloTraffico();
-
- // Logger
- log = OpenSPCoop2Logger.getLoggerOpenSPCoopControlloTraffico(op2Properties.isControlloTrafficoDebug());
-
- if(context==null) {
- throw new CoreException("InRequestProtocolContext is null");
- }
-
- // Leggo i dati del servizio
- datiTransazione = InterceptorPolicyUtilities.readDatiTransazione(context);
- registerThread = InterceptorPolicyUtilities.checkRegisterThread(datiTransazione);
- // Se registerThread == false, sicuramente la richiesta non verra' veicolata fuori e terminerà con un errore all'interno della PdD.
- if(context!=null && context.getMessaggio()!=null && context.getMessaggio().getServiceBinding()!=null) {
- serviceBinding = context.getMessaggio().getServiceBinding();
- }
-
- if(registerThread){
-
- configPdDManager = ConfigurazionePdDManager.getInstance(context.getStato());
-
- // Prelevo la configurazione del Controllo del Traffico per quanto concerne le policy attive
-
- if(requestInfo!=null && requestInfo.getRequestRateLimitingConfig()!=null) {
- if(requestInfo.getRequestRateLimitingConfig().getNomePorta()==null && datiTransazione!=null) {
- requestInfo.getRequestRateLimitingConfig().setDatiPorta(context.getTipoPorta(), datiTransazione.getNomePorta(),
- datiTransazione.getIdServizio(),
- datiTransazione.getSoggettoFruitore());
- }
- if(requestInfo.getRequestRateLimitingConfig().getMapPolicyAttive()!=null) {
- mapPolicyAttive = requestInfo.getRequestRateLimitingConfig().getMapPolicyAttive();
- mapFromRequestInfo = true;
- }
- }
-
- if(!mapFromRequestInfo) {
-
- mapPolicyAttive = new HashMap<>();
-
- Map<TipoRisorsaPolicyAttiva, ElencoIdPolicyAttive> mapPolicyAttiveAPI = null;
- try {
- mapPolicyAttiveAPI = configPdDManager.getElencoIdPolicyAttiveAPI(configurazioneControlloTraffico.isPolicyReadedWithDynamicCache(),
- context.getTipoPorta(), datiTransazione.getNomePorta());
- }catch(DriverConfigurazioneNotFound notFound) {
- // ignore
- }
- if(mapPolicyAttiveAPI!=null && !mapPolicyAttiveAPI.isEmpty()) {
- Iterator<TipoRisorsaPolicyAttiva> it = mapPolicyAttiveAPI.keySet().iterator();
- while (it.hasNext()) {
- TipoRisorsaPolicyAttiva tipoRisorsaPolicyAttiva = it.next();
- ElencoIdPolicyAttive elencoPolicyAttiveAPI = mapPolicyAttiveAPI.get(tipoRisorsaPolicyAttiva);
- if(elencoPolicyAttiveAPI!=null) {
- ElencoIdPolicyAttive cloned = (ElencoIdPolicyAttive) elencoPolicyAttiveAPI.clone(); // altrimenti dopo aggiungendo quelle globali si modifica l'oggetto in cache
- mapPolicyAttive.put(tipoRisorsaPolicyAttiva, cloned);
- }
- }
- }
-
- Map<TipoRisorsaPolicyAttiva, ElencoIdPolicyAttive> mapPolicyAttiveGlobali = null;
- try {
- mapPolicyAttiveGlobali = configPdDManager.getElencoIdPolicyAttiveGlobali(configurazioneControlloTraffico.isPolicyReadedWithDynamicCache());
- }catch(DriverConfigurazioneNotFound notFound) {
- // ignore
- }
- if(mapPolicyAttiveGlobali!=null && !mapPolicyAttiveGlobali.isEmpty()) {
- Iterator<TipoRisorsaPolicyAttiva> it = mapPolicyAttiveGlobali.keySet().iterator();
- while (it.hasNext()) {
- TipoRisorsaPolicyAttiva tipoRisorsaPolicyAttiva = it.next();
- ElencoIdPolicyAttive elencoPolicyAttiveGlobali = mapPolicyAttiveGlobali.get(tipoRisorsaPolicyAttiva);
-
- if(mapPolicyAttive.containsKey(tipoRisorsaPolicyAttiva)) {
- ElencoIdPolicyAttive elencoPolicyAttiveCloned = mapPolicyAttive.get(tipoRisorsaPolicyAttiva); // gia' clonato per l'api sopra
- for (IdActivePolicy idActivePolicyGlobale : elencoPolicyAttiveGlobali.getIdActivePolicyList()) {
- elencoPolicyAttiveCloned.addIdActivePolicy(idActivePolicyGlobale);
- }
- }
- else {
- ElencoIdPolicyAttive cloned = (ElencoIdPolicyAttive) elencoPolicyAttiveGlobali.clone(); // per non modificare l'oggetto in cache
- mapPolicyAttive.put(tipoRisorsaPolicyAttiva, cloned);
- }
- }
- }
-
- if(requestInfo!=null && requestInfo.getRequestRateLimitingConfig()!=null) {
- requestInfo.getRequestRateLimitingConfig().setMapPolicyAttive(mapPolicyAttive);
- }
-
- }
-
- // ** ConfigurazionePolicy per gestore **
-
- policyConfigurationGlobale = configPdDManager.getConfigurazionePolicyRateLimitingGlobali(requestInfo);
- context.getPddContext().addObject(CostantiControlloTraffico.PDD_CONTEXT_POLICY_CONFIG_GLOBALE, policyConfigurationGlobale);
-
- PolicyConfiguration policyConfigurationApiInternal = null;
- if(context.getIntegrazione()!=null && context.getIntegrazione().getIdPD()!=null){
- PortaDelegata pd = configPdDManager.getPortaDelegata(context.getIntegrazione().getIdPD(),requestInfo);
- policyConfigurationApiInternal = new PolicyConfiguration(pd.getProprietaRateLimitingList());
- }
- else if(context.getIntegrazione()!=null && context.getIntegrazione().getIdPA()!=null){
- PortaApplicativa pa = configPdDManager.getPortaApplicativa(context.getIntegrazione().getIdPA(),requestInfo);
- policyConfigurationApiInternal = new PolicyConfiguration(pa.getProprietaRateLimitingList());
- }
- if(policyConfigurationApiInternal==null) {
- throw new CoreException("Policy configuration not found");
- }
- else {
- if(policyConfigurationApiInternal.isGestionePolicyRidefinita()) {
- policyConfigurationPorta = policyConfigurationApiInternal;
- }
- else {
- policyConfigurationPorta = policyConfigurationGlobale;
- }
- }
- context.getPddContext().addObject(CostantiControlloTraffico.PDD_CONTEXT_POLICY_CONFIG_PORTA, policyConfigurationPorta);
-
- // ** ConfigurazionePolicy per header http **
- if(policyConfigurationApiInternal.isGestioneHttpHeadersRidefinita()) {
- policyConfigurationHeaderHttp = policyConfigurationApiInternal;
- }
- else {
- policyConfigurationHeaderHttp = policyConfigurationGlobale;
- }
-
- // Gestore delle Policy
- gestorePolicyPorta = GestorePolicyAttive.getInstance(policyConfigurationPorta.getType());
- gestorePolicyGlobale = GestorePolicyAttive.getInstance(policyConfigurationGlobale.getType());
-
- // Gestore del Traffico
- gestoreControlloTraffico = GestoreControlloTraffico.getInstance();
-
- // Configurazione Generale del RateLimiting
- ConfigurazioneGenerale configurazioneGenerale = configPdDManager.getConfigurazioneControlloTraffico(requestInfo);
- if(configurazioneGenerale.getRateLimiting()!=null){
- if(configurazioneGenerale.getRateLimiting().getTipoErrore()!=null) {
- TipoErrore tipoErrorTmp = TipoErrore.toEnumConstant(configurazioneGenerale.getRateLimiting().getTipoErrore());
- if(tipoErrorTmp!=null) {
- tipoErrore = tipoErrorTmp;
- }
- }
- includiDescrizioneErrore = configurazioneGenerale.getRateLimiting().isTipoErroreIncludiDescrizione();
- }
-
- }
-
- /**System.out.println("PROCESS registerThread["+registerThread+"] datiControlloTraffico["+(datiControlloTraffico!=null)+"]");*/
-
- }catch(Exception e){
- throw new HandlerException("Configurazione non disponibile: "+e.getMessage(), e);
- }
-
- if(registerThread){
-
- try{
-
- MsgDiagnostico msgDiag = this.buildMsgDiagnostico(context);
-
- // Verifico se la Pdd è congestionata ed emetto l'opportuno diagnostico
- boolean pddCongestionata =
- isCondizioneCongestionamentoPortaDominio(context, gestoreControlloTraffico, msgDiag, tr);
-
-
- // Effettuo controllo di rate limiting
- if(mapPolicyAttive!=null && !mapPolicyAttive.isEmpty()){
-
- // Emetto Diagnostico Controllo di RateLimiting
- msgDiag.logPersonalizzato(GeneratoreMessaggiErrore.MSG_DIAGNOSTICO_INTERCEPTOR_CONTROLLO_TRAFFICO_POLICY_CONTROLLO_IN_CORSO);
-
- int policyTotali = 0;
- int policyDisabilitate = 0;
- int policyFiltrate = 0;
- int policyNonApplicabili = 0;
- int policyRispettate = 0;
- int policyViolate = 0;
- int policyViolateWarningOnly = 0;
- int policyInErrore = 0;
-
- List<RisultatoVerificaPolicy> policyBloccanti = new ArrayList<>();
-
- List<String> pddContextUniqueIdsPolicy = new ArrayList<>();
- List<IDUnivocoGroupByPolicy> pddContextIdUnivociGroupBy = new ArrayList<>();
- List<Boolean> pddContextPolicyApplicabile = new ArrayList<>();
- List<Boolean> pddContextPolicyViolata = new ArrayList<>();
- List<String> pddContextApi = new ArrayList<>();
-
- DatiTempiRisposta datiTempiRisposta = null;
-
- // NOTA: Questo blocco che gestisce la raccolta delle policy soddisfatte e violate per generare gli opportuni header potrebbe essere riscritto utilizzando TipoRisorsaPolicyAttiva
- // Per adesso non viene modificato.
- List<RisultatoVerificaPolicy> risultatiVerificaPolicyViolate = new ArrayList<>();
- Map<TipoRisorsa,List<RisultatoVerificaPolicy>> risultatiVerificaPolicyRispettate = new HashMap<>();
- for (TipoRisorsa tipoRisorsa : TipoRisorsa.values()) {
- risultatiVerificaPolicyRispettate.put(tipoRisorsa, new ArrayList<>());
- }
-
- try{
-
- Iterator<TipoRisorsaPolicyAttiva> it = mapPolicyAttive.keySet().iterator();
- while (it.hasNext()) {
- TipoRisorsaPolicyAttiva tipoRisorsaPolicyAttiva = it.next();
- ElencoIdPolicyAttive elencoPolicyAttivePerRisorsa = mapPolicyAttive.get(tipoRisorsaPolicyAttiva);
-
- msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_ACTIVE_RISORSA, tipoRisorsaPolicyAttiva.getValue());
-
- boolean policyRispettataCheRichiedeBreak = false;
- boolean policyViolataBreak = false;
-
- for (IdActivePolicy idActive : elencoPolicyAttivePerRisorsa.getIdActivePolicyList()) {
-
- policyTotali++;
-
- msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_ACTIVE_ID, idActive.getNome());
-
- try{
-
- if(idActive.isEnabled()){
-
- // Prelevo la configurazione del Controllo del Traffico per quanto concerne le policy attive
- AttivazionePolicy attivazionePolicy = null;
- try {
- String id = UniqueIdentifierUtilities.getUniqueId(idActive);
- if(mapFromRequestInfo) {
- attivazionePolicy = requestInfo.getRequestRateLimitingConfig().getAttivazionePolicy(id);
- }
- if(attivazionePolicy==null) {
- attivazionePolicy = configPdDManager.getAttivazionePolicy(configurazioneControlloTraffico.isPolicyReadedWithDynamicCache(), id);
- if(requestInfo!=null && requestInfo.getRequestRateLimitingConfig()!=null) {
- requestInfo.getRequestRateLimitingConfig().addAttivazionePolicy(id, attivazionePolicy);
- }
- }
- }catch(DriverConfigurazioneNotFound notFound) {
- msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_ACTIVE_ALIAS, idActive.getNome());
- msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_ACTIVE_TIPO, "");
- throw new CoreException("Istanza di Policy con id ["+idActive.getNome()+"] non esistente: "+notFound.getMessage(),notFound);
- }
- if(attivazionePolicy==null){
- msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_ACTIVE_ALIAS, idActive.getNome());
- msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_ACTIVE_TIPO, "");
- throw new CoreException("Istanza di Policy con id ["+idActive.getNome()+"] non esistente?");
- }
-
- msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_ACTIVE_ALIAS,
- PolicyUtilities.getNomeActivePolicy(attivazionePolicy.getAlias(), attivazionePolicy.getIdActivePolicy()));
- if(attivazionePolicy.getFiltro()!=null && attivazionePolicy.getFiltro().getNomePorta()!=null && !"".equals(attivazionePolicy.getFiltro().getNomePorta())) {
- msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_ACTIVE_TIPO, Costanti.POLICY_API);
- }
- else {
- msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_ACTIVE_TIPO, Costanti.POLICY_GLOBALE);
- }
-
-
- // Verifico se un eventuale filtro configurato per la policy matcha con i dati della transazione
- boolean matchFiltro = !policyRispettataCheRichiedeBreak && !policyViolataBreak && InterceptorPolicyUtilities.filter(attivazionePolicy.getFiltro(), datiTransazione, context.getStato(), requestInfo);
- if(matchFiltro){
-
- if(attivazionePolicy.getFiltro().isEnabled() && attivazionePolicy.getFiltro().isInformazioneApplicativaEnabled()){
-
- // Verifico Filtro Applicativo
- String valorePresente = PolicyFiltroApplicativoUtilities.getValore(log,
- attivazionePolicy.getFiltro().getInformazioneApplicativaTipo(),
- attivazionePolicy.getFiltro().getInformazioneApplicativaNome(),
- context, datiTransazione, true);
- if(valorePresente==null || valorePresente.equals(attivazionePolicy.getFiltro().getInformazioneApplicativaValore())==false){
-
- policyFiltrate++;
-
- // Emetto Diagnostico Policy Filtrata
- if(valorePresente==null){
- valorePresente = "n.d.";
- }
- msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_FILTRATA_MOTIVO, "Filtro Applicativo atteso ["+
- attivazionePolicy.getFiltro().getInformazioneApplicativaValore()+"] differente da quello estratto dalla transazione ["+
- valorePresente+"]");
- GeneratoreMessaggiDiagnostici.emitDiagnostic(msgDiag,
- GeneratoreMessaggiErrore.MSG_DIAGNOSTICO_INTERCEPTOR_CONTROLLO_TRAFFICO_POLICY_FILTRATA, log);
-
- matchFiltro = false;
-
- }
-
- }
-
- if(matchFiltro){
-
- // Prelevo la configurazione del Controllo del Traffico per quanto concerne le policy istanziata
- ConfigurazionePolicy configurazionePolicy = null;
- try {
- String id = idActive.getIdPolicy();
- if(mapFromRequestInfo) {
- configurazionePolicy = requestInfo.getRequestRateLimitingConfig().getConfigurazionePolicy(id);
- }
- if(configurazionePolicy==null) {
- configurazionePolicy = configPdDManager.getConfigurazionePolicy(configurazioneControlloTraffico.isPolicyReadedWithDynamicCache(), id);
- if(requestInfo!=null && requestInfo.getRequestRateLimitingConfig()!=null) {
- requestInfo.getRequestRateLimitingConfig().addConfigurazionePolicy(id, configurazionePolicy);
- }
- }
- }catch(DriverConfigurazioneNotFound notFound) {
- throw new CoreException("Policy con id ["+idActive.getIdPolicy()+"] non esistente: "+notFound.getMessage(),notFound);
- }
- if(configurazionePolicy==null){
- throw new CoreException("Policy con id ["+idActive.getIdPolicy()+"] non esistente?");
- }
-
- org.openspcoop2.core.controllo_traffico.beans.ActivePolicy activePolicy =
- new org.openspcoop2.core.controllo_traffico.beans.ActivePolicy();
- activePolicy.setInstanceConfiguration(attivazionePolicy);
- activePolicy.setConfigurazionePolicy(configurazionePolicy);
- activePolicy.setTipoRisorsaPolicy(TipoRisorsa.toEnumConstant(configurazionePolicy.getRisorsa(), true));
- activePolicy.setConfigurazioneControlloTraffico(configurazioneControlloTraffico);
-
-
- // Creo Gruppo
- IDUnivocoGroupByPolicy idUnivocoGroupBy = InterceptorPolicyUtilities.convertToID(log,
- datiTransazione, attivazionePolicy.getGroupBy(), context);
- pddContextIdUnivociGroupBy.add(idUnivocoGroupBy);
- pddContextUniqueIdsPolicy.add(UniqueIdentifierUtilities.getUniqueId(attivazionePolicy));
-
- // Se la Policy richiede una condizione di applicabilità per degrado prestazionale
- // e non ho ancora recuperato l'informazione sui tempi lo faccio adesso
- if(datiTempiRisposta==null){
- datiTempiRisposta = ConnettoreUtilities.getDatiTempiRisposta(context, datiTransazione, requestInfo);
- }
-
- // Verifico rispetto ai dati collezionati
-
- IGestorePolicyAttive gestorePolicy = null;
- PolicyConfiguration policyConfiguration = null;
- if(attivazionePolicy.getFiltro()!=null && attivazionePolicy.getFiltro().getNomePorta()!=null && !"".equals(attivazionePolicy.getFiltro().getNomePorta())) {
- gestorePolicy = gestorePolicyPorta;
- policyConfiguration = policyConfigurationPorta;
- TipoRisorsaPolicyAttiva tipoRisorsaPolicy = TipoRisorsaPolicyAttiva.getTipo(activePolicy.getTipoRisorsaPolicy(), configurazionePolicy.isSimultanee());
- if(!gestorePolicy.getType().isSupportedResource(tipoRisorsaPolicy)) {
- // caso in cui viene configurata una policy su una specifica erogazione/fruizione, senza che nella porta stessa venga ridefinito un gestore specifico, e a livello di configurazione globale viene poi impostato un gestore non compatibile
- log.error("Riscontrata policy '"+attivazionePolicy.getIdActivePolicy()+"' (alias:"+attivazionePolicy.getAlias()+") non compatibile con il tipo di gestore '"+gestorePolicy.getType()+"'; verrà utilizzato il gestore di default");
- policyConfiguration = new PolicyConfiguration(true);
- gestorePolicy = GestorePolicyAttive.getInstance(policyConfiguration.getType());
- pddContextApi.add(CostantiControlloTraffico.PDD_CONTEXT_LIST_API_OR_GLOBAL_OR_DEFAULT_VALUE_DEFAULT);
- }
- else {
- pddContextApi.add(CostantiControlloTraffico.PDD_CONTEXT_LIST_API_OR_GLOBAL_OR_DEFAULT_VALUE_API);
- }
- }
- else {
- gestorePolicy = gestorePolicyGlobale;
- policyConfiguration = policyConfigurationGlobale;
- pddContextApi.add(CostantiControlloTraffico.PDD_CONTEXT_LIST_API_OR_GLOBAL_OR_DEFAULT_VALUE_GLOBAL);
- }
-
- RisultatoVerificaPolicy risultatoVerifica = PolicyVerifier.verifica(
- configPdDManager, context.getProtocolFactory(),
- gestorePolicy, policyConfiguration, log,
- activePolicy,
- idUnivocoGroupBy, context.getPddContext(),
- msgDiag, tr, datiTransazione, pddCongestionata, datiTempiRisposta,
- pddContextPolicyApplicabile, pddContextPolicyViolata,
- context.getStato());
-
- // Gestisco Risultato Verifica
- if(risultatoVerifica.isErroreGenerico()){
-
- policyInErrore++;
-
- // Emetto Diagnostico Policy in Errore
- log.error("Errore durante il controllo della policy con id["+idActive.getNome()+"]: "+risultatoVerifica.getDescrizione());
- msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_VIOLATA_MOTIVO, risultatoVerifica.getDescrizione());
- GeneratoreMessaggiDiagnostici.emitDiagnostic(msgDiag,
- GeneratoreMessaggiErrore.MSG_DIAGNOSTICO_INTERCEPTOR_CONTROLLO_TRAFFICO_POLICY_IN_ERRORE, log);
-
- // Aggiungo tra le policy bloccanti
- policyBloccanti.add(risultatoVerifica);
-
- }
- else if(risultatoVerifica.isNonApplicabile()){
-
- policyNonApplicabili++;
-
- // Emetto Diagnostico Policy Non Applicabile
- msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_NON_APPLICABILE_MOTIVO, risultatoVerifica.getDescrizione());
- GeneratoreMessaggiDiagnostici.emitDiagnostic(msgDiag,
- GeneratoreMessaggiErrore.MSG_DIAGNOSTICO_INTERCEPTOR_CONTROLLO_TRAFFICO_POLICY_NON_APPLICABILE, log);
-
- }
- else if(risultatoVerifica.isViolata()){
-
- risultatiVerificaPolicyViolate.add(risultatoVerifica);
-
- if(risultatoVerifica.isWarningOnly()){
-
- policyViolateWarningOnly++;
-
- // Emetto Diagnostico Policy Violata in Warning Only
- msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_VIOLATA_MOTIVO, risultatoVerifica.getDescrizione());
- GeneratoreMessaggiDiagnostici.emitDiagnostic(msgDiag,
- GeneratoreMessaggiErrore.MSG_DIAGNOSTICO_INTERCEPTOR_CONTROLLO_TRAFFICO_POLICY_VIOLATA_WARNING_ONLY, log);
-
- }
- else{
-
- policyViolate++;
-
- // Emetto Diagnostico Policy Violata
- msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_VIOLATA_MOTIVO, risultatoVerifica.getDescrizione());
- GeneratoreMessaggiDiagnostici.emitDiagnostic(msgDiag,
- GeneratoreMessaggiErrore.MSG_DIAGNOSTICO_INTERCEPTOR_CONTROLLO_TRAFFICO_POLICY_VIOLATA, log);
-
- // Aggiungo tra le policy bloccanti
- policyBloccanti.add(risultatoVerifica);
-
- }
-
- policyViolataBreak = true;
- }
- else{
-
- msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_ACTIVE_CONTINUE, attivazionePolicy.isContinuaValutazione()+"");
-
- risultatiVerificaPolicyRispettate.get(risultatoVerifica.getRisorsa()).add(risultatoVerifica);
-
- // Emetto Diagnostico Policy Rispettata
- GeneratoreMessaggiDiagnostici.emitDiagnostic(msgDiag,
- GeneratoreMessaggiErrore.MSG_DIAGNOSTICO_INTERCEPTOR_CONTROLLO_TRAFFICO_POLICY_RISPETTATA, log);
-
- policyRispettate++;
-
- if(!attivazionePolicy.isContinuaValutazione()) {
- policyRispettataCheRichiedeBreak = true;
- }
-
- }
-
- }
-
- }
- else{
-
- policyFiltrate++;
-
- // Emetto Diagnostico Policy Filtrata
- if(policyRispettataCheRichiedeBreak) {
- msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_FILTRATA_MOTIVO,
- GeneratoreMessaggiErrore.TEMPLATE_POLICY_FILTRATA_MOTIVO_BREAK);
- }
- else if(policyViolataBreak) {
- msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_FILTRATA_MOTIVO,
- GeneratoreMessaggiErrore.TEMPLATE_POLICY_FILTRATA_MOTIVO_BREAK_VIOLATA);
- }
- else {
- msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_FILTRATA_MOTIVO,
- GeneratoreMessaggiErrore.TEMPLATE_POLICY_FILTRATA_MOTIVO_FILTRO+ PolicyUtilities.toStringFilter(attivazionePolicy.getFiltro()));
- }
- GeneratoreMessaggiDiagnostici.emitDiagnostic(msgDiag,
- GeneratoreMessaggiErrore.MSG_DIAGNOSTICO_INTERCEPTOR_CONTROLLO_TRAFFICO_POLICY_FILTRATA, log);
-
- }
-
- }
- else{
-
- policyDisabilitate++;
-
- // Emetto Diagnostico Policy Disabilitata
- GeneratoreMessaggiDiagnostici.emitDiagnostic(msgDiag,
- GeneratoreMessaggiErrore.MSG_DIAGNOSTICO_INTERCEPTOR_CONTROLLO_TRAFFICO_POLICY_DISABILITATA, log);
-
- }
-
- }
- catch(Throwable e){
-
- policyInErrore++;
-
- // Messaggio di Errore
- Throwable tConMessaggio = Utilities.getInnerNotEmptyMessageException(e);
- String eMessaggio = tConMessaggio.getMessage();
- if(eMessaggio==null || "".equals(eMessaggio) || "null".equalsIgnoreCase(eMessaggio)){
- eMessaggio = "Internal Error"; // molto probabilmente si tratta di un null Pointer. Lo si vedra' nel logger
- }
-
- // Emetto Diagnostico Policy in Errore
- log.error("Errore durante il controllo della policy con id["+idActive.getNome()+"]: "+eMessaggio,e);
- msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_VIOLATA_MOTIVO, eMessaggio);
- GeneratoreMessaggiDiagnostici.emitDiagnostic(msgDiag,
- GeneratoreMessaggiErrore.MSG_DIAGNOSTICO_INTERCEPTOR_CONTROLLO_TRAFFICO_POLICY_IN_ERRORE, log);
-
- // Aggiungo tra le policy bloccanti
- RisultatoVerificaPolicy policyError = new RisultatoVerificaPolicy();
- policyError.setErroreGenerico(true);
- policyError.setDescrizione(eMessaggio);
- policyBloccanti.add(policyError);
-
- }
-
- // Effettuo clean dei dati dinamici della policy
- GeneratoreMessaggiDiagnostici.cleanPolicyValues(msgDiag);
-
-
- } // -- fine for delle policy di una risorsa
-
- } // -- fine iterazione per tipo di risorsa
-
- }finally{
- if(!pddContextIdUnivociGroupBy.isEmpty()){
- context.getPddContext().addObject(CostantiControlloTraffico.PDD_CONTEXT_LIST_GROUP_BY_CONDITION, pddContextIdUnivociGroupBy);
- context.getPddContext().addObject(CostantiControlloTraffico.PDD_CONTEXT_LIST_UNIQUE_ID_POLICY,pddContextUniqueIdsPolicy);
- context.getPddContext().addObject(CostantiControlloTraffico.PDD_CONTEXT_LIST_POLICY_APPLICABILE,pddContextPolicyApplicabile);
- context.getPddContext().addObject(CostantiControlloTraffico.PDD_CONTEXT_LIST_POLICY_VIOLATA,pddContextPolicyViolata);
- context.getPddContext().addObject(CostantiControlloTraffico.PDD_CONTEXT_LIST_API_OR_GLOBAL_OR_DEFAULT,pddContextApi);
- }
- }
- // Gestione header HTTP da aggiungere alla transazione
-
- Properties headerTrasportoRateLimiting = new Properties();
- if(!risultatiVerificaPolicyViolate.isEmpty()) {
- // calcolo tempo maggiore
- long ms = -1;
- Map<TipoRisorsa,List<RisultatoVerificaPolicy>> risultatiVerificaPolicyViolateMap = new HashMap<>();
- for (RisultatoVerificaPolicy risultatoVerificaPolicy : risultatiVerificaPolicyViolate) {
-
- List<RisultatoVerificaPolicy> l = null;
- if(risultatiVerificaPolicyViolateMap.containsKey(risultatoVerificaPolicy.getRisorsa())) {
- l = risultatiVerificaPolicyViolateMap.get(risultatoVerificaPolicy.getRisorsa());
- }
- else {
- l = new ArrayList<>();
- risultatiVerificaPolicyViolateMap.put(risultatoVerificaPolicy.getRisorsa(), l);
- }
- l.add(risultatoVerificaPolicy);
-
- if(risultatoVerificaPolicy.getMsBeforeResetCounters()!=null) {
- long tmp = risultatoVerificaPolicy.getMsBeforeResetCounters().longValue();
- if(tmp>ms) {
- ms = tmp;
- }
- }
- }
- if(ms>0) {
- // trasformo in secondi
- long sec = -1;
- if(ms>1000) {
- // trasformo in secondi
- sec = ms / 1000;
- }
- else if(ms>0) {
- // genero comunque l'header approssimando l'intervallo al secondo + backoff
- sec=1;
- }
- if(!policyConfigurationHeaderHttp.isDisabledHttpHeaders_retryAfter()) {
-
- // aggiungo backoff
- if(!policyConfigurationHeaderHttp.isForceDisabledHttpHeaders_retryAfter_backoff()) {
- if(policyConfigurationHeaderHttp.getForceHttpHeaders_retryAfter_backoff()>0) {
- sec = sec + getRandom().nextInt(policyConfigurationHeaderHttp.getForceHttpHeaders_retryAfter_backoff());
- }
- else {
- if(op2Properties.getControlloTrafficoRetryAfterHeaderRandomBackoff()!=null && op2Properties.getControlloTrafficoRetryAfterHeaderRandomBackoff()>0) {
- sec = sec + getRandom().nextInt(op2Properties.getControlloTrafficoRetryAfterHeaderRandomBackoff());
- }
- }
- }
- String [] headers = op2Properties.getControlloTrafficoRetryAfterHeader();
- if(headers!=null && headers.length>0) {
- for (String header : headers) {
- headerTrasportoRateLimiting.put(header, sec+"");
- }
- }
- }
- }
- if(risultatiVerificaPolicyViolateMap.size()>0) {
- // produco anche i normali header
- gestioneHeaderRateLimit(risultatiVerificaPolicyViolateMap, headerTrasportoRateLimiting, op2Properties, policyConfigurationHeaderHttp);
- }
- }
- else if(risultatiVerificaPolicyRispettate.size()>0) {
- gestioneHeaderRateLimit(risultatiVerificaPolicyRispettate, headerTrasportoRateLimiting, op2Properties, policyConfigurationHeaderHttp);
- }
-
- //Aggiungo nel pddContext e poi li recupero nei servizi
- if(headerTrasportoRateLimiting.size()>0) {
- context.getPddContext().addObject(CostantiControlloTraffico.PDD_CONTEXT_HEADER_RATE_LIMITING,headerTrasportoRateLimiting);
- }
-
-
- // Emetto Diagnostico Terminazione Controllo Rate limiting
-
- msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_NUMERO_POLICY, policyTotali+"");
- context.getPddContext().addObject(GeneratoreMessaggiErrore.PDD_CONTEXT_NUMERO_POLICY, policyTotali);
-
- msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_NUMERO_POLICY_DISABILITATE, policyDisabilitate+"");
- context.getPddContext().addObject(GeneratoreMessaggiErrore.PDD_CONTEXT_NUMERO_POLICY_DISABILITATE, policyDisabilitate);
-
- msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_NUMERO_POLICY_FILTRATE, policyFiltrate+"");
- context.getPddContext().addObject(GeneratoreMessaggiErrore.PDD_CONTEXT_NUMERO_POLICY_FILTRATE, policyFiltrate);
-
- msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_NUMERO_POLICY_NON_APPLICATE, policyNonApplicabili+"");
- context.getPddContext().addObject(GeneratoreMessaggiErrore.PDD_CONTEXT_NUMERO_POLICY_NON_APPLICATE, policyNonApplicabili);
-
- msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_NUMERO_POLICY_RISPETTATE, policyRispettate+"");
- context.getPddContext().addObject(GeneratoreMessaggiErrore.PDD_CONTEXT_NUMERO_POLICY_RISPETTATE, policyRispettate);
-
- msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_NUMERO_POLICY_VIOLATE, policyViolate+"");
- context.getPddContext().addObject(GeneratoreMessaggiErrore.PDD_CONTEXT_NUMERO_POLICY_VIOLATE, policyViolate);
-
- msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_NUMERO_POLICY_VIOLATE_WARNING_ONLY, policyViolateWarningOnly+"");
- context.getPddContext().addObject(GeneratoreMessaggiErrore.PDD_CONTEXT_NUMERO_POLICY_VIOLATE_WARNING_ONLY, policyViolateWarningOnly);
-
- msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_NUMERO_POLICY_IN_ERRORE, policyInErrore+"");
- context.getPddContext().addObject(GeneratoreMessaggiErrore.PDD_CONTEXT_NUMERO_POLICY_IN_ERRORE, policyInErrore);
-
- if(policyViolate>0 || policyInErrore>0){
- msgDiag.logPersonalizzato(GeneratoreMessaggiErrore.MSG_DIAGNOSTICO_INTERCEPTOR_CONTROLLO_TRAFFICO_POLICY_CONTROLLO_TERMINATO_CON_ERRORE);
-
- if(policyInErrore>0) {
- EsitoTransazioneName esito = op2Properties.getControlloTrafficoEsitiPolicyElaborazioneInErrore(EsitiProperties.getInstance(log, context.getProtocolFactory()));
- if(EsitoTransazioneName.CONTROLLO_TRAFFICO_POLICY_VIOLATA.equals(esito)) {
- GeneratoreMessaggiErrore.addPddContextInfoControlloTrafficoPolicyViolated(context.getPddContext(), false);
- }
- else {
- GeneratoreMessaggiErrore.addPddContextInfoControlloTrafficoPolicyInError(context.getPddContext(), esito);
- }
- }
- else {
- GeneratoreMessaggiErrore.addPddContextInfoControlloTrafficoPolicyViolated(context.getPddContext(), false);
- }
-
- HandlerException he = GeneratoreMessaggiErrore.getControlloTrafficoPolicyViolated(policyBloccanti,
- configurazioneControlloTraffico.isErroreGenerico(), context.getPddContext());
- he.setEmettiDiagnostico(false);
- GeneratoreMessaggiErrore.configureHandlerExceptionByTipoErrore(serviceBinding, he, tipoErrore, includiDescrizioneErrore,log);
- throw he;
- }
- else if(policyViolateWarningOnly>0){
-
- GeneratoreMessaggiErrore.addPddContextInfoControlloTrafficoPolicyViolated(context.getPddContext(), true);
-
- msgDiag.logPersonalizzato(GeneratoreMessaggiErrore.MSG_DIAGNOSTICO_INTERCEPTOR_CONTROLLO_TRAFFICO_POLICY_CONTROLLO_TERMINATO_CON_SUCCESSO);
-
- }
- else{
- msgDiag.logPersonalizzato(GeneratoreMessaggiErrore.MSG_DIAGNOSTICO_INTERCEPTOR_CONTROLLO_TRAFFICO_POLICY_CONTROLLO_TERMINATO_CON_SUCCESSO);
- }
- }
-
- }
- catch(HandlerException e){
- throw e;
- }
- catch(Exception e){
-
- GeneratoreMessaggiErrore.addPddContextInfoControlloTrafficoGenericError(context.getPddContext());
-
- throw GeneratoreMessaggiErrore.getErroreProcessamento(e, context.getPddContext());
- }
-
- }
- }
-
- private void gestioneHeaderRateLimit(Map<TipoRisorsa,List<RisultatoVerificaPolicy>> risultatiVerificaPolicy, Properties headerTrasportoRateLimiting,
- OpenSPCoop2Properties op2Properties,
- PolicyConfiguration policyConfigurationPorta) {
-
- if(policyConfigurationPorta.isDisabledHttpHeaders()) {
- return;
- }
-
- for (TipoRisorsa tipoRisorsa : risultatiVerificaPolicy.keySet()) {
- List<RisultatoVerificaPolicy> risultato = risultatiVerificaPolicy.get(tipoRisorsa);
- // in presenza di piu' policy dello stesso tipo considero la policy che termina più lontano nel tempo: NO Sbagliato poiche' se una ha un numero minore non va bene.
- // Prendo a questo punto quella con il minore limite.
-
- RisultatoVerificaPolicy risultatoUtilizzato = null;
- RisultatoVerificaPolicy risultatoUtilizzatoSimultanee = null;
- List<RisultatoVerificaPolicy> altrePolicy = new ArrayList<>();
- List<RisultatoVerificaPolicy> altrePolicySimultanee = new ArrayList<>();
-
- for (RisultatoVerificaPolicy risultatoVerificaPolicy : risultato) {
- if(TipoRisorsa.NUMERO_RICHIESTE.equals(tipoRisorsa) && risultatoVerificaPolicy.isSimultanee()) {
- if(risultatoUtilizzatoSimultanee==null) {
- risultatoUtilizzatoSimultanee = risultatoVerificaPolicy;
- }
- else {
- long numeroRimasti = -1;
- if(risultatoUtilizzatoSimultanee.getMaxValue()!=null) {
- numeroRimasti = risultatoUtilizzatoSimultanee.getMaxValue().longValue();
- }
- long numeroCheck = -1;
- if(risultatoVerificaPolicy.getMaxValue()!=null) {
- numeroCheck = risultatoVerificaPolicy.getMaxValue().longValue();
- }
- boolean switchPolicy = false;
- if(numeroCheck>0) {
- if(numeroRimasti>0) {
- if(numeroCheck<numeroRimasti) {
- altrePolicySimultanee.add(risultatoUtilizzatoSimultanee);
- risultatoUtilizzatoSimultanee = risultatoVerificaPolicy;
- switchPolicy = true;
- }
- }
- else {
- altrePolicySimultanee.add(risultatoUtilizzatoSimultanee);
- risultatoUtilizzatoSimultanee = risultatoVerificaPolicy;
- switchPolicy = true;
- }
- }
- if(!switchPolicy) {
- altrePolicySimultanee.add(risultatoVerificaPolicy);
- }
- }
- }
- else {
- if(risultatoUtilizzato==null) {
- risultatoUtilizzato = risultatoVerificaPolicy;
- }
- else {
- long numeroRimasti = -1;
- if(risultatoUtilizzato.getMaxValue()!=null) {
- numeroRimasti = risultatoUtilizzato.getMaxValue().longValue();
- }
- long numeroCheck = -1;
- if(risultatoVerificaPolicy.getMaxValue()!=null) {
- numeroCheck = risultatoVerificaPolicy.getMaxValue().longValue();
- }
- boolean switchPolicy = false;
- if(numeroCheck>0) {
- if(numeroRimasti>0) {
- if(numeroCheck<numeroRimasti) {
- altrePolicy.add(risultatoUtilizzato);
- risultatoUtilizzato = risultatoVerificaPolicy;
- switchPolicy = true;
- }
- }
- else {
- altrePolicy.add(risultatoUtilizzato);
- risultatoUtilizzato = risultatoVerificaPolicy;
- switchPolicy = true;
- }
- }
- if(!switchPolicy) {
- altrePolicy.add(risultatoVerificaPolicy);
- }
- }
- }
- }
-
- if(!policyConfigurationPorta.isDisabledHttpHeaders_limit() && risultatoUtilizzatoSimultanee!=null &&
- risultatoUtilizzatoSimultanee.getMaxValue()!=null) {
- try {
- String [] headers = op2Properties.getControlloTrafficoNumeroRichiesteSimultaneeHeaderLimit();
- if(headers!=null && headers.length>0) {
- for (String header : headers) {
- headerTrasportoRateLimiting.put(header, risultatoUtilizzatoSimultanee.getMaxValue().longValue()+"");
- }
- }
- }catch(Exception e) {
- // errore non dovrebbe succedere
- }
-
- if(risultatoUtilizzatoSimultanee.getActualValue()!=null) {
- long rimanenti = risultatoUtilizzatoSimultanee.getMaxValue().longValue() - risultatoUtilizzatoSimultanee.getActualValue().longValue();
- if(rimanenti<0) { // gli attuali conteggia anche quelle bloccate
- rimanenti = 0;
- }
- try {
- String [] headers = op2Properties.getControlloTrafficoNumeroRichiesteSimultaneeHeaderRemaining();
- if(headers!=null && headers.length>0) {
- for (String header : headers) {
- headerTrasportoRateLimiting.put(header, rimanenti+"");
- }
- }
- }catch(Exception e) {
- // errore non dovrebbe succedere
- }
- }
- }
-
- if(risultatoUtilizzato!=null &&
- risultatoUtilizzato.getMaxValue()!=null) {
-
- if(!policyConfigurationPorta.isDisabledHttpHeaders_limit()) {
- try {
- String [] headers = null;
- boolean windows = false;
- switch (tipoRisorsa) {
- case DIMENSIONE_MASSIMA_MESSAGGIO:
- // non viene usata
- break;
- case NUMERO_RICHIESTE:
- headers = op2Properties.getControlloTrafficoNumeroRichiesteHeaderLimit();
- windows = op2Properties.getControlloTrafficoNumeroRichiesteHeaderLimitWindows();
- break;
- case OCCUPAZIONE_BANDA:
- headers = op2Properties.getControlloTrafficoOccupazioneBandaHeaderLimit();
- windows = op2Properties.getControlloTrafficoOccupazioneBandaHeaderLimitWindows();
- break;
- case TEMPO_MEDIO_RISPOSTA:
- headers = op2Properties.getControlloTrafficoTempoMedioRispostaHeaderLimit();
- windows = op2Properties.getControlloTrafficoTempoMedioRispostaHeaderLimitWindows();
- break;
- case TEMPO_COMPLESSIVO_RISPOSTA:
- headers = op2Properties.getControlloTrafficoTempoComplessivoRispostaHeaderLimit();
- windows = op2Properties.getControlloTrafficoTempoComplessivoRispostaHeaderLimitWindows();
- break;
- case NUMERO_RICHIESTE_COMPLETATE_CON_SUCCESSO:
- headers = op2Properties.getControlloTrafficoNumeroRichiesteCompletateConSuccessoHeaderLimit();
- windows = op2Properties.getControlloTrafficoNumeroRichiesteCompletateConSuccessoHeaderLimitWindows();
- break;
- case NUMERO_RICHIESTE_FALLITE:
- headers = op2Properties.getControlloTrafficoNumeroRichiesteFalliteHeaderLimit();
- windows = op2Properties.getControlloTrafficoNumeroRichiesteFalliteHeaderLimitWindows();
- break;
- case NUMERO_FAULT_APPLICATIVI:
- headers = op2Properties.getControlloTrafficoNumeroFaultApplicativiHeaderLimit();
- windows = op2Properties.getControlloTrafficoNumeroFaultApplicativiHeaderLimitWindows();
- break;
- case NUMERO_RICHIESTE_FALLITE_OFAULT_APPLICATIVI:
- headers = op2Properties.getControlloTrafficoNumeroRichiesteFalliteOFaultApplicativiHeaderLimit();
- windows = op2Properties.getControlloTrafficoNumeroRichiesteFalliteOFaultApplicativiHeaderLimitWindows();
- break;
- case NUMERO_RICHIESTE_COMPLETATE_CON_SUCCESSO_OFAULT_APPLICATIVI:
- headers = op2Properties.getControlloTrafficoNumeroRichiesteCompletateConSuccessoOFaultApplicativiHeaderLimit();
- windows = op2Properties.getControlloTrafficoNumeroRichiesteCompletateConSuccessoOFaultApplicativiHeaderLimitWindows();
- break;
- }
-
- if(policyConfigurationPorta.isForceHttpHeaders_limit_no_windows()) {
- windows = false;
- }
- else if(policyConfigurationPorta.isForceHttpHeaders_limit_windows()) {
- windows = true;
- }
-
- if(headers!=null && headers.length>0) {
-
- Long maxValue = risultatoUtilizzato.getMaxValueBeforeNormalizing()!=null ? risultatoUtilizzato.getMaxValueBeforeNormalizing() : risultatoUtilizzato.getMaxValue();
-
- StringBuilder sb = new StringBuilder("");
- if(windows && risultatoUtilizzato.getMsWindow()!=null && maxValue!=null) {
- long ms = risultatoUtilizzato.getMsWindow();
- long sec = -1;
- if(ms>1000) {
- // trasformo in secondi
- sec = ms / 1000;
- }
- if(sec>0) {
- sb.append(", ").append(maxValue.longValue()).append(";w=").append(sec);
- }
- if(!altrePolicy.isEmpty()) {
- for (RisultatoVerificaPolicy r : altrePolicy) {
-
- Long maxValueR = r.getMaxValueBeforeNormalizing()!=null ? r.getMaxValueBeforeNormalizing() : r.getMaxValue();
-
- if(r.getMsWindow()!=null && maxValueR!=null) {
- ms = r.getMsWindow();
- sec = -1;
- if(ms>1000) {
- // trasformo in secondi
- sec = ms / 1000;
- }
- if(sec>0) {
- sb.append(", ").append(maxValueR.longValue()).append(";w=").append(sec);
- }
- }
- }
- }
- }
-
- for (String header : headers) {
- headerTrasportoRateLimiting.put(header, maxValue.longValue()+""+sb.toString());
- }
- }
- }catch(Exception e) {
- // errore non dovrebbe succedere
- }
- }
-
- if(!policyConfigurationPorta.isDisabledHttpHeaders_remaining() && risultatoUtilizzato.getActualValue()!=null) {
- long rimanenti = risultatoUtilizzato.getMaxValue().longValue() - risultatoUtilizzato.getActualValue().longValue();
- if(rimanenti<0) { // gli attuali conteggia anche quelle bloccate
- rimanenti = 0;
- }
- if(rimanenti==0 && !risultatoUtilizzato.isViolata() && !risultatoUtilizzato.isRemainingZeroValue()) {
- rimanenti = 1; // gestione cluster
- }
- try {
- String [] headers = null;
- switch (tipoRisorsa) {
- case DIMENSIONE_MASSIMA_MESSAGGIO:
- // non viene usata
- break;
- case NUMERO_RICHIESTE:
- headers = op2Properties.getControlloTrafficoNumeroRichiesteHeaderRemaining();
- break;
- case OCCUPAZIONE_BANDA:
- headers = op2Properties.getControlloTrafficoOccupazioneBandaHeaderRemaining();
- break;
- case TEMPO_MEDIO_RISPOSTA:
- // non ha senso
- /**headers = op2Properties.getControlloTrafficoTempoMedioRispostaHeaderRemaining();*/
- break;
- case TEMPO_COMPLESSIVO_RISPOSTA:
- headers = op2Properties.getControlloTrafficoTempoComplessivoRispostaHeaderRemaining();
- break;
- case NUMERO_RICHIESTE_COMPLETATE_CON_SUCCESSO:
- headers = op2Properties.getControlloTrafficoNumeroRichiesteCompletateConSuccessoHeaderRemaining();
- break;
- case NUMERO_RICHIESTE_FALLITE:
- headers = op2Properties.getControlloTrafficoNumeroRichiesteFalliteHeaderRemaining();
- break;
- case NUMERO_FAULT_APPLICATIVI:
- headers = op2Properties.getControlloTrafficoNumeroFaultApplicativiHeaderRemaining();
- break;
- case NUMERO_RICHIESTE_FALLITE_OFAULT_APPLICATIVI:
- headers = op2Properties.getControlloTrafficoNumeroRichiesteFalliteOFaultApplicativiHeaderRemaining();
- break;
- case NUMERO_RICHIESTE_COMPLETATE_CON_SUCCESSO_OFAULT_APPLICATIVI:
- headers = op2Properties.getControlloTrafficoNumeroRichiesteCompletateConSuccessoOFaultApplicativiHeaderRemaining();
- break;
- }
- if(headers!=null && headers.length>0) {
- for (String header : headers) {
- headerTrasportoRateLimiting.put(header, rimanenti+"");
- }
- }
- }catch(Exception e) {
- // errore non dovrebbe succedere
- }
- }
- }
- if(!policyConfigurationPorta.isDisabledHttpHeaders_reset() && risultatoUtilizzato!=null && risultatoUtilizzato.getMsBeforeResetCounters()!=null) {
-
- long ms = risultatoUtilizzato.getMsBeforeResetCounters().longValue();
- long sec = -1;
- if(ms>1000) {
- // trasformo in secondi
- sec = ms / 1000;
- }
- else if(ms>0) {
- // genero comunque l'header approssimando l'intervallo al secondo
- sec=1;
- }
-
- if(sec>0) {
- try {
- String [] headers = null;
- switch (tipoRisorsa) {
- case DIMENSIONE_MASSIMA_MESSAGGIO:
- // non viene usata
- break;
- case NUMERO_RICHIESTE:
- headers = op2Properties.getControlloTrafficoNumeroRichiesteHeaderReset();
- break;
- case OCCUPAZIONE_BANDA:
- headers = op2Properties.getControlloTrafficoOccupazioneBandaHeaderReset();
- break;
- case TEMPO_MEDIO_RISPOSTA:
- headers = op2Properties.getControlloTrafficoTempoMedioRispostaHeaderReset();
- break;
- case TEMPO_COMPLESSIVO_RISPOSTA:
- headers = op2Properties.getControlloTrafficoTempoComplessivoRispostaHeaderReset();
- break;
- case NUMERO_RICHIESTE_COMPLETATE_CON_SUCCESSO:
- headers = op2Properties.getControlloTrafficoNumeroRichiesteCompletateConSuccessoHeaderReset();
- break;
- case NUMERO_RICHIESTE_FALLITE:
- headers = op2Properties.getControlloTrafficoNumeroRichiesteFalliteHeaderReset();
- break;
- case NUMERO_FAULT_APPLICATIVI:
- headers = op2Properties.getControlloTrafficoNumeroFaultApplicativiHeaderReset();
- break;
- case NUMERO_RICHIESTE_FALLITE_OFAULT_APPLICATIVI:
- headers = op2Properties.getControlloTrafficoNumeroRichiesteFalliteOFaultApplicativiHeaderReset();
- break;
- case NUMERO_RICHIESTE_COMPLETATE_CON_SUCCESSO_OFAULT_APPLICATIVI:
- headers = op2Properties.getControlloTrafficoNumeroRichiesteCompletateConSuccessoOFaultApplicativiHeaderReset();
- break;
- }
-
- if(headers!=null && headers.length>0) {
- for (String header : headers) {
- headerTrasportoRateLimiting.put(header, sec+"");
- }
- }
- }catch(Exception e) {
- // errore non dovrebbe succedere
- }
- }
- }
- }
-
- }
-
- private boolean isCondizioneCongestionamentoPortaDominio(InRequestProtocolContext context,
- GestoreControlloTraffico gestoreControlloCongestione,
- MsgDiagnostico msgDiag, Transaction tr) throws TransactionDeletedException{
-
- if(context==null) {
- throw new TransactionDeletedException("Context is null");
- }
-
- PdDContext pddContext = context.getPddContext();
-
- boolean isPddCongestionataInformazioneIdentificataDalThread = false;
- Object oPddCongestionataThread = pddContext.getObject(CostantiControlloTraffico.PDD_CONTEXT_PDD_CONGESTIONATA);
- if(oPddCongestionataThread instanceof Boolean){
- isPddCongestionataInformazioneIdentificataDalThread = (Boolean) oPddCongestionataThread;
- }
-
- String idTransazione = null;
- if(context.getPddContext()!=null && context.getPddContext().containsKey(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE)) {
- idTransazione = (String) context.getPddContext().getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE);
- }
-
- boolean sync = true;
- if(context.getStato() instanceof StateMessage) {
- StateMessage state = (StateMessage) context.getStato();
- if(state.getConnectionDB()!=null) {
- /**System.out.println("SYNC FALSE CONNECTION FOUND!");*/
- sync=false;
- }
- }
- StatoTraffico statoControlloCongestione = gestoreControlloCongestione.getStatoControlloTraffico(idTransazione,sync);
- if(statoControlloCongestione.isPddCongestionata()!=isPddCongestionataInformazioneIdentificataDalThread){
- /**System.out.println("Rilevata differenza tra controllo del traffico attivo PREINHANDLER ["+controlloTrafficoAttivoThread+"] e stato attuale["+statoControlloCongestione.getControlloTraffico()+"]");*/
- pddContext.removeObject(CostantiControlloTraffico.PDD_CONTEXT_PDD_CONGESTIONATA);
- pddContext.addObject(CostantiControlloTraffico.PDD_CONTEXT_PDD_CONGESTIONATA, statoControlloCongestione.isPddCongestionata());
- }
-
- // Aggiungo al msgDiag i valori delle tre costanti poichè mi servirà anche per diagnostici durante la verifica delle policy.
- // Vanno aggiunti anche se la pdd non risulta congestionata
-
- msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_ACTIVE_THREADS, statoControlloCongestione.getActiveThreads()+"");
- pddContext.addObject(GeneratoreMessaggiErrore.PDD_CONTEXT_ACTIVE_THREADS, statoControlloCongestione.getActiveThreads());
-
- Object oMaxThreads = pddContext.getObject(GeneratoreMessaggiErrore.PDD_CONTEXT_MAX_THREADS_THRESHOLD);
- if(oMaxThreads!=null){
- msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_MAX_THREADS_THRESHOLD, oMaxThreads.toString());
- }
-
- Object oThreshold = pddContext.getObject(GeneratoreMessaggiErrore.PDD_CONTEXT_CONTROLLO_TRAFFICO_THRESHOLD);
- if(oThreshold!=null){
- msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_CONTROLLO_TRAFFICO_THRESHOLD, oThreshold.toString());
- }
-
- if(statoControlloCongestione.isPddCongestionata()){
- // Emetto qua il diagnostico che la porta è congestionata.
- // Potrei emetterlo anche nel preInHandler, però lo emetto anzi qua perche viene poi usato qua la condizione per capire se attivare o meno una policy.
-
-
- // Aggiunto come evento della transazione l'informazione che la PdD è congestionata
- tr.addEventoGestione(TipoEvento.CONTROLLO_TRAFFICO_SOGLIA_CONGESTIONE.getValue()+"_"+CodiceEventoControlloTraffico.VIOLAZIONE.getValue());
-
-
- // Emetto Diagnostico Controllo del Traffico Attivato
- msgDiag.logPersonalizzato(GeneratoreMessaggiErrore.MSG_DIAGNOSTICO_INTERCEPTOR_CONTROLLO_TRAFFICO_PDD_CONGESTIONATA);
-
- }
-
- return statoControlloCongestione.isPddCongestionata();
- }
-
-
- // Ritorna un MsgDiagnostico generator
- private MsgDiagnostico buildMsgDiagnostico(InRequestProtocolContext context) throws HandlerException{
- MsgDiagnostico msgDiag = null;
- try{
- String nomePorta = null;
- if(context.getIntegrazione()!=null) {
- if(context.getIntegrazione().getIdPA()!=null) {
- nomePorta = context.getIntegrazione().getIdPA().getNome();
- }
- else if(context.getIntegrazione().getIdPD()!=null) {
- nomePorta = context.getIntegrazione().getIdPD().getNome();
- }
- }
-
- RequestInfo requestInfo = null;
- if(context.getPddContext()!=null && context.getPddContext().containsKey(org.openspcoop2.core.constants.Costanti.REQUEST_INFO)) {
- requestInfo = (RequestInfo) context.getPddContext().getObject(org.openspcoop2.core.constants.Costanti.REQUEST_INFO);
- }
-
- msgDiag = MsgDiagnostico.newInstance(context.getTipoPorta(),context.getIdModulo(),nomePorta, requestInfo);
- msgDiag.setPddContext(context.getPddContext(), context.getProtocolFactory());
- if(org.openspcoop2.core.constants.TipoPdD.DELEGATA.equals(context.getTipoPorta())){
- msgDiag.setPrefixMsgPersonalizzati(MsgDiagnosticiProperties.MSG_DIAG_RICEZIONE_CONTENUTI_APPLICATIVI);
- }
- else{
- msgDiag.setPrefixMsgPersonalizzati(MsgDiagnosticiProperties.MSG_DIAG_RICEZIONE_BUSTE);
- }
- }catch(Exception e){
- throw new HandlerException("Generazione Messaggio Diagnostico non riuscita: "+e.getMessage(), e);
- }
- return msgDiag;
- }
-
- }