In CustomAbstracthandler, Modify Httpfield is not working in jetty server 11 version

275 Views Asked by At

Getting header Connection: close, upgrade from Client, so I am trying to change connection header from connection: close, upgrade to connection: Upgrade.

I modified httpfield in CustomAbstractHandler, but not working in Jetty 11 version.

CustomAbstractHandler.Java :

import java.io.IOException;
import org.eclipse.jetty.http.HttpFields;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.handler.AbstractHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

public class CustomAbstractHandler extends AbstractHandler {
    private static final Logger LOG = LoggerFactory.getLogger(CustomAbstractHandler.class);
    @Override
    public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {
        HttpFields.Mutable replacement = HttpFields.build(baseRequest.getHttpFields()).put("Connection", "Upgrade");
        baseRequest.setHttpFields(replacement);
        LOG.info("" + baseRequest.getHttpFields());
        baseRequest.setHandled(true);
    }
}
       

In Main Class configure Handler in server.setHandler()

import java.util.EnumSet;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.servlet.FilterHolder;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.websocket.server.config.JettyWebSocketServletContainerInitializer;
import jakarta.servlet.DispatcherType;

public class WebSocketServer {
    private static Server server;

    public static void main(String args[]) throws Exception {
        server = new Server();
        server.setStopTimeout(100);
        ServerConnector connector = new ServerConnector(server);
        connector.setIdleTimeout(1000 * 60 * 60);
        connector.setPort(56667);
        connector.setAcceptedTcpNoDelay(true);
        connector.setAccepting(true);
        connector.join(100);
        connector.setAcceptedReceiveBufferSize(1234567889);
        connector.getConnectedEndPoints();
        server.addConnector(connector);
        ServletContextHandler contextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS);
        contextHandler.setContextPath("/shop");
        FilterHolder filterHolder = contextHandler.addFilter(websocketcreator.class, "/*",
                EnumSet.of(DispatcherType.REQUEST));
        filterHolder.setAsyncSupported(true);
        contextHandler.getSessionHandler().setMaxInactiveInterval(5);
        server.setHandler(new CustomAbstractHandler());
        contextHandler.addServlet(WebSocketServerServlet.class, "/web-socket/");
        JettyWebSocketServletContainerInitializer.configure(contextHandler, null);
        server.setHandler(contextHandler);
        server.start();
        server.dump(System.err);
        server.join();
    }

Anything wrong from the code?

1

There are 1 best solutions below

3
Joakim Erdfelt On

Your code is undoing your efforts.

server.setHandler(new CustomAbstractHandler());
...(snip)...
server.setHandler(contextHandler);

That replaces CustomAbstractHandler with contextHandler

The server.setHandler(Handler) is a single Handler, it looks like you want multiple Handlers.

Use a HandlerList instead.

// this is a org.eclipse.jetty.server.handler.HandlerList
HandlerList handlers = new HandlerList();
handlers.add(new CustomAbstractHandler());
handlers.add(contextHandler);
server.setHandler(handlers);

See past answers for more details on Handler trees in Jetty.