blob: 4da9066727a8f238c56d97ff2c7484d12c1eb11e [file] [log] [blame]
/*
* Copyright (c) 2020 Kentyou.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Kentyou - initial API and implementation
*/
package org.eclipse.sensinact.gateway.nthbnd.rest.internal.http;
import org.eclipse.sensinact.gateway.nthbnd.endpoint.NorthboundMediator;
import org.eclipse.sensinact.gateway.nthbnd.rest.internal.RestAccessConstants;
//import javax.servlet.AsyncContext;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
//import javax.servlet.WriteListener;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* CORS Filter
*/
@WebFilter()
public class CorsFilter implements Filter {
private NorthboundMediator mediator;
/**
* Constructor
*
* @param mediator the {@link NorthboundMediator} allowing to
* interact with the OSGi host environment
*/
public CorsFilter(NorthboundMediator mediator) {
this.mediator = mediator;
}
/**
* @inheritDoc
* @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
*/
public void init(FilterConfig config) throws ServletException {
if (mediator.isDebugLoggable()) {
mediator.info("Init with config [" + config + "]");
}
}
/**
* @inheritDoc
* @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
*/
public void doFilter(final ServletRequest req, final ServletResponse res, final FilterChain chain) throws IOException, ServletException {
if (res.isCommitted()) {
return;
}
final HttpServletRequest request = (HttpServletRequest) req;
final HttpServletResponse response = (HttpServletResponse) res;
if (RestAccessConstants.OPTIONS.equals(request.getMethod())) {
((HttpServletResponse)res).setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
StringBuilder builder = new StringBuilder();
String controlRequestHeaders = request.getHeader("Access-Control-Request-Headers");
if (controlRequestHeaders != null && controlRequestHeaders.length() > 0) {
builder.append(controlRequestHeaders);
builder.append(",");
}
builder.append("Authorization, X-Auth-Token, X-Requested-With");
response.setHeader("Access-Control-Allow-Headers", builder.toString());
final ServletOutputStream output = res.getOutputStream();
output.println();
} else {
try {
chain.doFilter(req, res);
} catch (Exception e) {
mediator.error(e);
}
}
}
/**
* @inheritDoc
* @see javax.servlet.Filter#destroy()
*/
public void destroy() {
if (mediator.isDebugLoggable()) {
mediator.info("Destroyed filter");
}
}
}