CORSFilterConfiguration.java

/*
 * GovWay - A customizable API Gateway 
 * https://govway.org
 * 
 * Copyright (c) 2005-2024 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.util.ArrayList;
import java.util.List;
import java.util.Properties;

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

	// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/

	protected boolean errorAsDebug = true;
	
	// indicazione se una richiesta invalida deve cmq essere continuata ad essere gestita (e pilotata con le opzioni seguenti)
	protected boolean throwExceptionIfInvalid = false;
	protected boolean terminateIfInvalid = true; 
	
	// indica un utilizzo errato del cors come descritto nel capitolo 6.1.1 e 6.2.1 (https://www.w3.org/TR/cors/#resource-processing-model)
	// If the Origin header is not present terminate this set of steps. The request is outside the scope of this specification.
	protected boolean throwExceptionIfNotFoundOrigin = false;
	protected boolean terminateIfNotFoundOrigin = false;
	
	// indica un utilizzo errato del cors come descritto nel capitolo 6.1.2 e 6.2.2 (https://www.w3.org/TR/cors/#resource-processing-model)
	// If the value of the Origin header is not a case-sensitive match for any of the values in list of origins, 
	// do not set any additional headers and terminate this set of steps.
	protected boolean throwExceptionIfNotMatchOrigin = false;
	protected boolean terminateIfNotMatchOrigin = false;

	// indica una configurazione errata come descritto nel capitolo 6.1.3 e 6.2.7 (https://www.w3.org/TR/cors/#resource-processing-model)
	// The string "*" (Access-Control-Allow-Origin) cannot be used for a resource that supports credentials (Access-Control-Allow-Credentials=true).
	protected boolean throwExceptionIfAllowCredentialAndAllowOrigin = false;

	// indica un utilizzo errato del cors come descritto nel capitolo 6.3.3 (https://www.w3.org/TR/cors/#resource-processing-model)
	// If there is no Access-Control-Request-Method header or if parsing failed, do not set any additional headers and terminate this set of steps. 
	// The request is outside the scope of this specification.
	protected boolean throwExceptionIfNotFoundRequestMethod = false;
	protected boolean terminateIfNotFoundRequestMethod = false;
	
	// indica un utilizzo errato del cors come descritto nel capitolo 6.3.5 (https://www.w3.org/TR/cors/#resource-processing-model)
	// If method is not a case-sensitive match for any of the values in list of methods do not set any additional headers and terminate this set of steps.
	protected boolean throwExceptionIfNotMatchRequestMethod = false;
	protected boolean terminateIfNotMatchRequestMethod = false;
	
	// indica se produrre la lista dei metodi supportati, anche se la richiesta non presenta un Access-Control-Request-Method header o il valore presente non è permesso.
	// Se non produco alcun header in risposta, sarà il browser a riconoscere che non e' abilitato, cosi come se ritorna una lista non contenente il metodo richiesto
	protected boolean generateListAllowIfNotMatchRequestMethod = true;
	
	// indica un utilizzo errato del cors come descritto nel capitolo 6.3.4 (https://www.w3.org/TR/cors/#resource-processing-model)
	// If parsing failed do not set any additional headers and terminate this set of steps.
	// The request is outside the scope of this specification.
	protected boolean throwExceptionIfNotFoundRequestHeaders = false;
	protected boolean terminateIfNotFoundRequestHeaders = false;
	
	// indica un utilizzo errato del cors come descritto nel capitolo 6.3.6 (https://www.w3.org/TR/cors/#resource-processing-model)
	// If any of the header field-names is not a ASCII case-insensitive match for any of the values in list of headers do not set any additional headers and terminate this set of steps.
	protected boolean throwExceptionIfNotMatchRequestHeaders = false;
	protected boolean terminateIfNotMatchRequestHeaders = false;
	
	// indica se produrre la lista degli headers supportati, anche se la richiesta non presenta un Access-Control-Request-Header header o un degli header presenti non è permesso.
	// Se non produco alcun header in risposta, sarà il browser a riconoscere che non e' abilitato, cosi come se ritorna una lista non contenente l'header richiesto
	protected boolean generateListAllowIfNotMatchRequestHeaders = true;
	
	
	
	/*
	 * The Access-Control-Allow-Credentials response header indicates whether or not the response to the request can be exposed to the page. 
	 * It can be exposed when the true value is returned.
	 * Credentials are cookies, authorization headers or TLS client certificates.
	 * When used as part of a response to a preflight request, this indicates whether or not the actual request can be made using credentials. 
	 * Note that simple GET requests are not preflighted, and so if a request is made for a resource with credentials, 
	 * if this header is not returned with the resource, the response is ignored by the browser and not returned to web content.
	 *
	 * NOTE: The only valid value for this header is true (case-sensitive). If you don't need credentials, omit this header entirely (rather than setting its value to false).
	 **/
	protected Boolean allowCredentials = null;

	/*
	 * The Access-Control-Request-Headers request header is used when issuing a preflight request to let the server know which HTTP headers will be used when the actual request is made.
	 **/
	protected Boolean allowRequestHeader = null;
	/*
	 * The Access-Control-Allow-Headers response header is used in response to a preflight request which includes the Access-Control-Request-Headers to indicate which HTTP headers can be used during the actual request.
	 * The simple headers, Accept, Accept-Language, Content-Language, Content-Type (but only with a MIME type of its parsed value (ignoring parameters) of either application/x-www-form-urlencoded, multipart/form-data, or text/plain), 
	 * are always available and don't need to be listed by this header.
	 * 
	 * This header is required if the request has an Access-Control-Request-Headers header.
	 **/
	protected List<String> allowHeaders = new ArrayList<>(); 
	
	/*
	 * Oltre all'header Access-Control-Allow-Headers response header viene generato anche l'header Allow con medesimi valori
	 */
	protected boolean generateAllowHeader = false;
	
	/*
	 * The Access-Control-Request-Method request header is used when issuing a preflight request to let the server know which HTTP method will be used when the actual request is made. 
	 * This header is necessary as the preflight request is always an OPTIONS and doesn't use the same method as the actual request.
	 **/
	protected Boolean allowRequestMethod = null;
	/*
	 * The Access-Control-Allow-Methods response header specifies the method or methods allowed when accessing the resource in response to a preflight request.
	 **/
	protected List<String> allowMethods = new ArrayList<>(); 
	

	/*
	 * The Access-Control-Allow-Origin response header indicates whether the response can be shared with requesting code from the given origin.
	 * 
	 * Access-Control-Allow-Origin: <origin>
	 * Specifies an origin. Only a single origin can be specified.
	 * 
	 * !! CORS and caching !! If the server sends a response with an Access-Control-Allow-Origin value that is an explicit origin (rather than the "*" wildcard), 
	 * then the response should also include a Vary response header with the value Origin to indicate to browsers that server responses can differ based 
	 * on the value of the Origin request header.
	 * 
	 * example request:
	 * Origin: https://developer.mozilla.org
	 * 
	 * example response:
	 * Access-Control-Allow-Origin: https://developer.mozilla.org
	 * Vary: Origin
	 **/
	protected Boolean allowRequestOrigin = null;
	/*
	 * Access-Control-Allow-Origin: *
	 * 
	 * For requests without credentials, the literal value "*" can be specified, as a wildcard; 
	 * the value tells browsers to allow requesting code from any origin to access the resource. 
	 * Attempting to use the wildcard with credentials will result in an error.
	 **/
	protected Boolean allowAllOrigin = null;
	/*
	 * The Access-Control-Allow-Origin enabled.
	 **/
	protected List<String> allowOrigins = new ArrayList<>(); 


	/*
	 * The Access-Control-Expose-Headers response header indicates which headers can be exposed as part of the response by listing their names.
	 * By default, only the 6 simple response headers are exposed: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma
	 * If you want clients to be able to access other headers, you have to list them using the Access-Control-Expose-Headers header.
	 **/
	protected List<String> exposeHeaders = new ArrayList<>();
	
	/*
	 * The Access-Control-Max-Age response header indicates how long the results of a preflight request 
	 * (that is the information contained in the Access-Control-Allow-Methods and Access-Control-Allow-Headers headers) can be cached.
	 * 
	 * Maximum number of seconds the results can be cached. Firefox caps this at 24 hours (86400 seconds) and Chromium at 10 minutes (600 seconds). 
	 * Chromium also specifies a default value of 5 seconds. 
	 **/
	protected Integer cachingAccessControl_maxAgeSeconds = null;
	
	/*
	 * A value of -1 will disable caching, requiring a preflight OPTIONS check for all calls.
	 **/
	protected Boolean cachingAccessControl_disable = null;


	
	public void init(Properties p) {
						
		/*
		 * cors.errorAsDebug=true/false
		 * 
		 * cors.throwExceptionIfInvalid=true/false
		 * cors.terminateIfInvalid=true/false
		 * 
		 * cors.throwExceptionIfNotFoundOrigin=true/false
		 * cors.terminateIfNotFoundOrigin=true/false
		 * cors.throwExceptionIfNotMatchOrigin=true/false
		 * cors.terminateIfNotMatchOrigin=true/false
		 * 
		 * cors.throwExceptionIfAllowCredentialAndAllowOrigin=true/false
		 * 
		 * cors.throwExceptionIfNotFoundRequestMethod=true/false
		 * cors.terminateIfNotFoundRequestMethod=true/false
		 * cors.throwExceptionIfNotMatchRequestMethod=true/false
		 * cors.terminateIfNotMatchRequestMethod=true/false
		 * cors.generateListAllowIfNotMatchRequestMethod=true/false
		 * 
		 * cors.throwExceptionIfNotFoundRequestHeaders=true/false
		 * cors.terminateIfNotFoundRequestHeaders=true/false
		 * cors.throwExceptionIfNotMatchRequestHeaders=true/false
		 * cors.terminateIfNotMatchRequestHeaders=true/false
		 * cors.generateListAllowIfNotMatchRequestHeaders=true/false
		 * 
		 * 
		 * cors.allowCredentials=true/false
		 * 
		 * cors.allowRequestHeaders=true/false
		 * cors.allowHeaders=HDR1,...,HDRN
		 * 
		 * cors.allowRequestMethod=true/false
		 * cors.allowMethods=METHOD1,...,METHODN
		 * 
		 * cors.allowRequestOrigin=true/false
		 * cors.allowAllOrigin=true/false
		 * cors.allowOrigins=http://origin1, ... ,http://originN
		 * 
		 * cors.exposeHeaders=HDR1,...,HDRN
		 * 
		 * cors.maxAge.cacheDisable=true/false
		 * cors.maxAge.seconds=
		 * 
		 **/
		
		String tmp = p.getProperty("cors.errorAsDebug");
		if(tmp!=null) {
			this.errorAsDebug = "true".equalsIgnoreCase(tmp.trim());
		}
		
		tmp = p.getProperty("cors.throwExceptionIfInvalid");
		if(tmp!=null) {
			this.throwExceptionIfInvalid = "true".equalsIgnoreCase(tmp.trim());
		}
		tmp = p.getProperty("cors.terminateIfInvalid");
		if(tmp!=null) {
			this.terminateIfInvalid = "true".equalsIgnoreCase(tmp.trim());
		}	
		
		tmp = p.getProperty("cors.throwExceptionIfNotFoundOrigin");
		if(tmp!=null) {
			this.throwExceptionIfNotFoundOrigin = "true".equalsIgnoreCase(tmp.trim());
		}
		tmp = p.getProperty("cors.terminateIfNotFoundOrigin");
		if(tmp!=null) {
			this.terminateIfNotFoundOrigin = "true".equalsIgnoreCase(tmp.trim());
		}		
		tmp = p.getProperty("cors.throwExceptionIfNotMatchOrigin");
		if(tmp!=null) {
			this.throwExceptionIfNotMatchOrigin = "true".equalsIgnoreCase(tmp.trim());
		}
		tmp = p.getProperty("cors.terminateIfNotMatchOrigin");
		if(tmp!=null) {
			this.terminateIfNotMatchOrigin = "true".equalsIgnoreCase(tmp.trim());
		}
		
		tmp = p.getProperty("cors.throwExceptionIfAllowCredentialAndAllowOrigin");
		if(tmp!=null) {
			this.throwExceptionIfAllowCredentialAndAllowOrigin = "true".equalsIgnoreCase(tmp.trim());
		}
			
		tmp = p.getProperty("cors.throwExceptionIfNotFoundRequestMethod");
		if(tmp!=null) {
			this.throwExceptionIfNotFoundRequestMethod = "true".equalsIgnoreCase(tmp.trim());
		}
		tmp = p.getProperty("cors.terminateIfNotFoundRequestMethod");
		if(tmp!=null) {
			this.terminateIfNotFoundRequestMethod = "true".equalsIgnoreCase(tmp.trim());
		}		
		tmp = p.getProperty("cors.throwExceptionIfNotMatchRequestMethod");
		if(tmp!=null) {
			this.throwExceptionIfNotMatchRequestMethod = "true".equalsIgnoreCase(tmp.trim());
		}
		tmp = p.getProperty("cors.terminateIfNotMatchRequestMethod");
		if(tmp!=null) {
			this.terminateIfNotMatchRequestMethod = "true".equalsIgnoreCase(tmp.trim());
		}
		tmp = p.getProperty("cors.generateListAllowIfNotMatchRequestMethod");
		if(tmp!=null) {
			this.generateListAllowIfNotMatchRequestMethod = "true".equalsIgnoreCase(tmp.trim());
		}
		
		tmp = p.getProperty("cors.throwExceptionIfNotFoundRequestHeaders");
		if(tmp!=null) {
			this.throwExceptionIfNotFoundRequestHeaders = "true".equalsIgnoreCase(tmp.trim());
		}
		tmp = p.getProperty("cors.terminateIfNotFoundRequestHeaders");
		if(tmp!=null) {
			this.terminateIfNotFoundRequestHeaders = "true".equalsIgnoreCase(tmp.trim());
		}		
		tmp = p.getProperty("cors.throwExceptionIfNotMatchRequestHeaders");
		if(tmp!=null) {
			this.throwExceptionIfNotMatchRequestHeaders = "true".equalsIgnoreCase(tmp.trim());
		}
		tmp = p.getProperty("cors.terminateIfNotMatchRequestHeaders");
		if(tmp!=null) {
			this.terminateIfNotMatchRequestHeaders = "true".equalsIgnoreCase(tmp.trim());
		}
		tmp = p.getProperty("cors.generateListAllowIfNotMatchRequestHeaders");
		if(tmp!=null) {
			this.generateListAllowIfNotMatchRequestHeaders = "true".equalsIgnoreCase(tmp.trim());
		}

		
		tmp = p.getProperty("cors.allowCredentials");
		if(tmp!=null) {
			this.allowCredentials = "true".equalsIgnoreCase(tmp.trim());
		}
		
		tmp = p.getProperty("cors.allowRequestHeaders");
		if(tmp!=null) {
			this.allowRequestHeader = "true".equalsIgnoreCase(tmp.trim());
		}
		tmp = p.getProperty("cors.allowHeaders");
		if(tmp!=null) {
			String [] tmpList = tmp.trim().split(",");
			for (String v : tmpList) {
				this.allowHeaders.add(v.trim());
			}
		}
		
		tmp = p.getProperty("cors.allowRequestMethod");
		if(tmp!=null) {
			this.allowRequestMethod = "true".equalsIgnoreCase(tmp.trim());
		}
		tmp = p.getProperty("cors.allowMethods");
		if(tmp!=null) {
			String [] tmpList = tmp.trim().split(",");
			for (String v : tmpList) {
				this.allowMethods.add(v.trim());
			}
		}
		
		tmp = p.getProperty("cors.allowRequestOrigin");
		if(tmp!=null) {
			this.allowRequestOrigin = "true".equalsIgnoreCase(tmp.trim());
		}
		tmp = p.getProperty("cors.allowAllOrigin");
		if(tmp!=null) {
			this.allowAllOrigin = "true".equalsIgnoreCase(tmp.trim());
		}
		tmp = p.getProperty("cors.allowOrigins");
		if(tmp!=null) {
			String [] tmpList = tmp.trim().split(",");
			for (String v : tmpList) {
				this.allowOrigins.add(v.trim());
			}
		}
		
		tmp = p.getProperty("cors.exposeHeaders");
		if(tmp!=null) {
			String [] tmpList = tmp.trim().split(",");
			for (String v : tmpList) {
				this.exposeHeaders.add(v.trim());
			}
		}
		
		tmp = p.getProperty("cors.maxAge.cacheDisable");
		if(tmp!=null) {
			this.cachingAccessControl_disable = "true".equalsIgnoreCase(tmp.trim());
		}
		tmp = p.getProperty("cors.maxAge.seconds");
		if(tmp!=null) {
			this.cachingAccessControl_maxAgeSeconds = Integer.valueOf(tmp.trim());
		}
		
	}

	public boolean isErrorAsDebug() {
		return this.errorAsDebug;
	}
	public void setErrorAsDebug(boolean errorAsDebug) {
		this.errorAsDebug = errorAsDebug;
	}

	public boolean isThrowExceptionIfInvalid() {
		return this.throwExceptionIfInvalid;
	}
	public void setThrowExceptionIfInvalid(boolean throwExceptionIfInvalid) {
		this.throwExceptionIfInvalid = throwExceptionIfInvalid;
	}

	public boolean isTerminateIfInvalid() {
		return this.terminateIfInvalid;
	}
	public void setTerminateIfInvalid(boolean terminateIfInvalid) {
		this.terminateIfInvalid = terminateIfInvalid;
	}

	
	public boolean isThrowExceptionIfNotFoundOrigin() {
		return this.throwExceptionIfNotFoundOrigin;
	}
	public void setThrowExceptionIfNotFoundOrigin(boolean throwExceptionIfNotFoundOrigin) {
		this.throwExceptionIfNotFoundOrigin = throwExceptionIfNotFoundOrigin;
	}

	public boolean isTerminateIfNotFoundOrigin() {
		return this.terminateIfNotFoundOrigin;
	}
	public void setTerminateIfNotFoundOrigin(boolean terminateIfNotFoundOrigin) {
		this.terminateIfNotFoundOrigin = terminateIfNotFoundOrigin;
	}


	public boolean isThrowExceptionIfNotMatchOrigin() {
		return this.throwExceptionIfNotMatchOrigin;
	}
	public void setThrowExceptionIfNotMatchOrigin(boolean throwExceptionIfNotMatchOrigin) {
		this.throwExceptionIfNotMatchOrigin = throwExceptionIfNotMatchOrigin;
	}

	public boolean isTerminateIfNotMatchOrigin() {
		return this.terminateIfNotMatchOrigin;
	}
	public void setTerminateIfNotMatchOrigin(boolean terminateIfNotMatchOrigin) {
		this.terminateIfNotMatchOrigin = terminateIfNotMatchOrigin;
	}


	
	public boolean isThrowExceptionIfAllowCredentialAndAllowOrigin() {
		return this.throwExceptionIfAllowCredentialAndAllowOrigin;
	}
	public void setThrowExceptionIfAllowCredentialAndAllowOrigin(boolean throwExceptionIfAllowCredentialAndAllowOrigin) {
		this.throwExceptionIfAllowCredentialAndAllowOrigin = throwExceptionIfAllowCredentialAndAllowOrigin;
	}



	public boolean isThrowExceptionIfNotFoundRequestMethod() {
		return this.throwExceptionIfNotFoundRequestMethod;
	}
	public void setThrowExceptionIfNotFoundRequestMethod(boolean throwExceptionIfNotFoundRequestMethod) {
		this.throwExceptionIfNotFoundRequestMethod = throwExceptionIfNotFoundRequestMethod;
	}

	public boolean isTerminateIfNotFoundRequestMethod() {
		return this.terminateIfNotFoundRequestMethod;
	}
	public void setTerminateIfNotFoundRequestMethod(boolean terminateIfNotFoundRequestMethod) {
		this.terminateIfNotFoundRequestMethod = terminateIfNotFoundRequestMethod;
	}


	public boolean isThrowExceptionIfNotMatchRequestMethod() {
		return this.throwExceptionIfNotMatchRequestMethod;
	}
	public void setThrowExceptionIfNotMatchRequestMethod(boolean throwExceptionIfNotMatchRequestMethod) {
		this.throwExceptionIfNotMatchRequestMethod = throwExceptionIfNotMatchRequestMethod;
	}

	public boolean isTerminateIfNotMatchRequestMethod() {
		return this.terminateIfNotMatchRequestMethod;
	}
	public void setTerminateIfNotMatchRequestMethod(boolean terminateIfNotMatchRequestMethod) {
		this.terminateIfNotMatchRequestMethod = terminateIfNotMatchRequestMethod;
	}

	
	public boolean isGenerateListAllowIfNotMatchRequestMethod() {
		return this.generateListAllowIfNotMatchRequestMethod;
	}
	public void setGenerateListAllowIfNotMatchRequestMethod(boolean generateListAllowIfNotMatchRequestMethod) {
		this.generateListAllowIfNotMatchRequestMethod = generateListAllowIfNotMatchRequestMethod;
	}

	
	public boolean isThrowExceptionIfNotFoundRequestHeaders() {
		return this.throwExceptionIfNotFoundRequestHeaders;
	}
	public void setThrowExceptionIfNotFoundRequestHeaders(boolean throwExceptionIfNotFoundRequestHeaders) {
		this.throwExceptionIfNotFoundRequestHeaders = throwExceptionIfNotFoundRequestHeaders;
	}

	public boolean isTerminateIfNotFoundRequestHeaders() {
		return this.terminateIfNotFoundRequestHeaders;
	}
	public void setTerminateIfNotFoundRequestHeaders(boolean terminateIfNotFoundRequestHeaders) {
		this.terminateIfNotFoundRequestHeaders = terminateIfNotFoundRequestHeaders;
	}


	public boolean isThrowExceptionIfNotMatchRequestHeaders() {
		return this.throwExceptionIfNotMatchRequestHeaders;
	}
	public void setThrowExceptionIfNotMatchRequestHeaders(boolean throwExceptionIfNotMatchRequestHeaders) {
		this.throwExceptionIfNotMatchRequestHeaders = throwExceptionIfNotMatchRequestHeaders;
	}

	public boolean isTerminateIfNotMatchRequestHeaders() {
		return this.terminateIfNotMatchRequestHeaders;
	}
	public void setTerminateIfNotMatchRequestHeaders(boolean terminateIfNotMatchRequestHeaders) {
		this.terminateIfNotMatchRequestHeaders = terminateIfNotMatchRequestHeaders;
	}
	
	
	public boolean isGenerateListAllowIfNotMatchRequestHeaders() {
		return this.generateListAllowIfNotMatchRequestHeaders;
	}
	public void setGenerateListAllowIfNotMatchRequestHeaders(boolean generateListAllowIfNotMatchRequestHeaders) {
		this.generateListAllowIfNotMatchRequestHeaders = generateListAllowIfNotMatchRequestHeaders;
	}
	

	
	public Boolean getAllowCredentials() {
		return this.allowCredentials;
	}
	public void setAllowCredentials(Boolean allowCredentials) {
		this.allowCredentials = allowCredentials;
	}
	
	public Boolean getAllowRequestHeader() {
		return this.allowRequestHeader;
	}
	public void setAllowRequestHeader(Boolean allowRequestHeader) {
		this.allowRequestHeader = allowRequestHeader;
	}
	
	public List<String> getAllowHeaders() {
		return this.allowHeaders;
	}
	public void addAllowHeader(String header) {
		this.allowHeaders.add(header);
	}
	
	public boolean isGenerateAllowHeader() {
		return this.generateAllowHeader;
	}
	public void setGenerateAllowHeader(boolean generateAllowHeader) {
		this.generateAllowHeader = generateAllowHeader;
	}
	
	public Boolean getAllowRequestMethod() {
		return this.allowRequestMethod;
	}
	public void setAllowRequestMethod(Boolean allowRequestMethod) {
		this.allowRequestMethod = allowRequestMethod;
	}
	
	public List<String> getAllowMethods() {
		return this.allowMethods;
	}
	public void addAllowMethod(String method) {
		this.allowMethods.add(method);
	}
	
	public Boolean getAllowRequestOrigin() {
		return this.allowRequestOrigin;
	}
	public void setAllowRequestOrigin(Boolean allowRequestOrigin) {
		this.allowRequestOrigin = allowRequestOrigin;
	}
	
	public Boolean getAllowAllOrigin() {
		return this.allowAllOrigin;
	}
	public void setAllowAllOrigin(Boolean allowAllOrigin) {
		this.allowAllOrigin = allowAllOrigin;
	}
	
	public List<String> getAllowOrigins() {
		return this.allowOrigins;
	}
	public void addAllowOrigin(String origin) {
		this.allowOrigins.add(origin);
	}
	
	public List<String> getExposeHeaders() {
		return this.exposeHeaders;
	}
	public void addExposeHeader(String header) {
		this.exposeHeaders.add(header);
	}
	
	public Integer getCachingAccessControl_maxAgeSeconds() {
		return this.cachingAccessControl_maxAgeSeconds;
	}
	public void setCachingAccessControl_maxAgeSeconds(Integer cachingAccessControl_maxAgeSeconds) {
		this.cachingAccessControl_maxAgeSeconds = cachingAccessControl_maxAgeSeconds;
	}
	
	public Boolean getCachingAccessControl_disable() {
		return this.cachingAccessControl_disable;
	}
	public void setCachingAccessControl_disable(Boolean cachingAccessControl_disable) {
		this.cachingAccessControl_disable = cachingAccessControl_disable;
	}
	
}