1package dev.rafex.ether.http.jetty12;
31import org.eclipse.jetty.server.Handler;
32import org.eclipse.jetty.server.Request;
33import org.eclipse.jetty.server.Response;
34import org.eclipse.jetty.util.Callback;
36import dev.rafex.ether.http.jetty12.response.JettyApiResponses;
37import dev.rafex.ether.http.security.cors.CorsPolicy;
39final class JettyCorsHandler
extends Handler.Wrapper {
42 private final JettyApiResponses responses;
44 JettyCorsHandler(
final Handler next,
final CorsPolicy policy,
final JettyApiResponses responses) {
47 this.responses = responses;
51 public boolean handle(
final Request request,
final Response response,
final Callback callback)
throws Exception {
52 final var origin = request.getHeaders().get(
"Origin");
53 if (isPreflight(request)) {
54 if (origin ==
null || !policy.isOriginAllowed(origin)) {
55 responses.text(response, callback, 403,
"forbidden");
58 applyHeaders(response, policy.responseHeaders(origin));
59 responses.noContent(response, callback, 204);
63 final boolean handled = super.handle(request, response, callback);
64 if (origin !=
null && policy.isOriginAllowed(origin)) {
65 applyHeaders(response, policy.responseHeaders(origin));
70 private static boolean isPreflight(
final Request request) {
71 return "OPTIONS".equalsIgnoreCase(request.getMethod())
72 && request.getHeaders().get(
"Access-Control-Request-Method") !=
null;
75 private static void applyHeaders(
final Response response,
final Map<String, String> headers) {
76 for (
final var entry : headers.entrySet()) {
77 response.getHeaders().put(entry.getKey(), entry.getValue());
record CorsPolicy(boolean allowAnyOrigin, List< String > allowedOrigins, List< String > allowedMethods, List< String > allowedHeaders, List< String > exposedHeaders, boolean allowCredentials, int maxAgeSeconds, boolean varyOrigin)
Política de seguridad CORS para controlar el acceso entre orígenes.