blob: d43a612e4986d8b696e5f21132e4cab106ad7c25 [file] [log] [blame]
package org.apache.meecrowave.letencrypt;
import static java.util.Optional.ofNullable;
import java.io.IOException;
import javax.servlet.ServletException;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.connector.Request;
import org.apache.catalina.connector.Response;
import org.apache.catalina.valves.ValveBase;
import org.apache.coyote.http11.AbstractHttp11Protocol;
public class LetsEncryptValve extends ValveBase {
private final AbstractHttp11Protocol<?> protocol;
private final LetsEncryptReloadLifecycle.LetsEncryptConfig config;
private LetsEncryptReloadLifecycle support;
private volatile Current current = new Current("/.well-known/acme-challenge/-", "none");
public LetsEncryptValve(final AbstractHttp11Protocol<?> protocol,
final LetsEncryptReloadLifecycle.LetsEncryptConfig config) {
super(true);
this.protocol = protocol;
this.config = config;
}
@Override
protected void initInternal() throws LifecycleException {
super.initInternal();
support = new LetsEncryptReloadLifecycle(config, protocol, (e, c) -> current = new Current(e, c));
}
@Override
protected synchronized void stopInternal() throws LifecycleException {
super.stopInternal();
ofNullable(support).ifPresent(LetsEncryptReloadLifecycle::close);
}
@Override
public void invoke(final Request request, final Response response) throws IOException, ServletException {
if (request.getRequestURI().equals(current.endpoint)) {
response.setHeader("Content-Type", "text/plain");
response.getWriter().write(current.challenge);
return;
}
getNext().invoke(request, response);
}
private static class Current {
private final String endpoint;
private final String challenge;
private Current(final String endpoint, final String challenge) {
this.endpoint = endpoint;
this.challenge = challenge;
}
}
}