All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.progressoft.brix.domino.api.server.RouterConfigurator Maven / Gradle / Ivy

The newest version!
package com.progressoft.brix.domino.api.server;

import com.progressoft.brix.domino.api.server.logging.DefaultRemoteLogger;
import com.progressoft.brix.domino.api.server.logging.RemoteLogger;
import com.progressoft.brix.domino.api.server.logging.RemoteLoggingHandler;
import io.vertx.core.Vertx;
import io.vertx.core.http.HttpMethod;
import io.vertx.core.json.JsonArray;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.web.Router;
import io.vertx.ext.web.handler.*;
import io.vertx.ext.web.sstore.ClusteredSessionStore;
import io.vertx.ext.web.sstore.LocalSessionStore;
import io.vertx.ext.web.sstore.SessionStore;

import java.util.Arrays;
import java.util.HashSet;
import java.util.ServiceLoader;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;

import static java.util.Objects.isNull;

public class RouterConfigurator {

    private static final int DEFAULT_BODY_LIMIT = 50;
    private static final long MB = 1048576L;
    private static final String REMOTE_LOGGER = "remote.logger";

    private final Vertx vertx;
    private final JsonObject config;
    private final String secret;
    private boolean clustered;

    public RouterConfigurator(Vertx vertx, JsonObject config, String secret) {
        this.vertx = vertx;
        this.config = config;
        this.secret = secret;
    }

    public Router configuredRouter() {
        return makeRouterWithPredefinedHandlers(vertx);
    }

    public Router configuredClusteredRouter() {
        this.clustered = true;
        return makeRouterWithPredefinedHandlers(vertx);
    }

    private Router makeRouterWithPredefinedHandlers(Vertx vertx) {
        Router router = Router.router(vertx);
        addPredefinedHandlers(vertx, router);
        return router;
    }

    private void addPredefinedHandlers(Vertx vertx, Router router) {
        addCorsHandler(router);
        addBodyHandler(router);
        addSessionHandler(vertx, router);
        addCSRFHandler(router);
        addRemoteExceptionHandler(router);
    }

    private void addCorsHandler(Router router) {
        router.route().handler(CorsHandler.create("*")
                .allowedHeaders(new HashSet<>(Arrays.asList("Content-Type", "X-HTTP-Method-Override", "X-XSRF-TOKEN")))
                .allowedMethods(Stream.of(HttpMethod.values()).collect(Collectors.toSet())));
    }

    private void addRemoteExceptionHandler(Router router) {
        RemoteLogger remoteLogger = StreamSupport.stream(ServiceLoader.load(RemoteLogger.class).spliterator(), false)
                .filter(logger -> logger.getClass().getName().equals(config.getString(REMOTE_LOGGER)))
                .findFirst().orElseGet(DefaultRemoteLogger::new);
        router.route("/service/remoteLogging")
                .handler(new RemoteLoggingHandler(remoteLogger));
    }

    private void addBodyHandler(Router router) {
        Integer bodyLimit = config.getInteger("body.limit");
        router.route().handler(BodyHandler.create().setBodyLimit((isNull(bodyLimit) ? DEFAULT_BODY_LIMIT : bodyLimit) * MB));
    }

    private void addCSRFHandler(Router router) {
        JsonArray jsonArray = config.getJsonArray("csrf.whitelist", new JsonArray());
        Set whiteList=new HashSet<>();
        jsonArray.forEach(o-> whiteList.add(o.toString()));

        router.route().handler(new DominoCSRFHandler(secret,config));
    }

    private void addSessionHandler(Vertx vertx, Router router) {
        SessionStore
                sessionStore = clustered ? ClusteredSessionStore.create(vertx) : LocalSessionStore
                .create(vertx);
        router.route().handler(CookieHandler.create());
        router.route().handler(SessionHandler
                .create(sessionStore)
                .setCookieHttpOnlyFlag(true)
                .setCookieSecureFlag(true)
        );
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy