Hi all.

I've implemented an embedded Jetty instance for my simple REST api. Because I 
want to manage a common error of the end user (the double slash in the URL), 
I've instantiated the CompactPathRule class and I've passed it as rewrite rule, 
but it doesn't work (http://localhost:8080/endpoint/path work, 
http://localhost:8080/endpoint//path returns 404). I don't know if I've 
instantiate the rule correctly, because I haven't find a correct documentation 
for it, can anyone help me? Below, the code:

package com.application.webapp;

import org.eclipse.jetty.rewrite.handler.CompactPathRule;
import org.eclipse.jetty.rewrite.handler.RewriteHandler;
import org.eclipse.jetty.server.AsyncRequestLogWriter;
import org.eclipse.jetty.server.CustomRequestLog;
import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.DefaultHandler;
import org.eclipse.jetty.server.handler.HandlerList;
import org.eclipse.jetty.server.handler.ResourceHandler;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.servlet.ServletContainer;

import javax.naming.NamingException;
import java.net.InetSocketAddress;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Optional;

public class Main {
    private URI uri;

    public Main() {
        try {
            var host = 
Optional.ofNullable(System.getenv("WEB_HOST")).orElse("localhost");
            var port = 
Optional.ofNullable(System.getenv("WEB_PORT")).orElse("8080");

            this.setUri(host, Integer.parseInt(port));
        } catch (URISyntaxException | NumberFormatException e) {
            e.printStackTrace();
        }
    }

    private void setUri(String host, int port) throws URISyntaxException {
        this.uri = new URI("http", null, host, port, null, null, null);
    }

    public String toUrl() {
        return this.uri.toString();
    }

    public Server setupServer() throws NamingException, NoSuchFieldException {
        var server = new Server(new InetSocketAddress(this.uri.getHost(), 
this.uri.getPort()));
        var ctx = new ServletContextHandler(ServletContextHandler.NO_SESSIONS);
        var cfg = new ResourceConfig();
        var container = new ServletContainer(cfg);
        var holder = new ServletHolder(container);
        var handler = new ResourceHandler();
        var handlers = new HandlerList();
        var logger = new CustomRequestLog(new AsyncRequestLogWriter(), 
CustomRequestLog.NCSA_FORMAT);
        var rewrite = new RewriteHandler();

        ctx.addServlet(holder, "/*");
        cfg.packages("com.application.webapp.resources");

        rewrite.addRule(new CompactPathRule());

        server.setRequestLog(logger);
        handlers.setHandlers(new Handler[]{handler, ctx, new DefaultHandler()});
        server.setHandler(handlers);

        return server;
    }

    public static void main(String[] args) throws NamingException, 
NoSuchFieldException {
        final Server server;
        Main m = new Main();
        server = m.setupServer();

        System.out.println(String.format("Jetty app started at %s", m.toUrl()));

        try {
            server.start();
            server.join();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            server.destroy();
        }
    }
}

Cheers,
Enrico
_______________________________________________
jetty-users mailing list
[email protected]
To change your delivery options, retrieve your password, or unsubscribe from 
this list, visit
https://www.eclipse.org/mailman/listinfo/jetty-users

Reply via email to