0

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?

Joakim Erdfelt
  • 46,896
  • 7
  • 86
  • 136
santhosh
  • 1
  • 6
  • Need more information. how are you using this handler? where is it in your handler tree? It could simply be because this handler is not executing at the right time or place within your request handling. – Joakim Erdfelt Aug 19 '21 at 14:19
  • @JoakimErdfelt added config class – santhosh Aug 19 '21 at 14:38

1 Answers1

0

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.

Joakim Erdfelt
  • 46,896
  • 7
  • 86
  • 136
  • I did changes , but not working `HandlerList handlers = new HandlerList(new CustomAbstractHandler(),contextHandler); server.setHandler(handlers);` – santhosh Aug 19 '21 at 15:32
  • Do you want your Request field changes in `CustomAbstractHandler` to propagate into the `contextHandler`? If so, remove the `baseRequest.setHandled(true);` (this is mentioned in the past answers btw) – Joakim Erdfelt Aug 19 '21 at 15:53
  • how can change incoming header value in entry of Request in Request class or HttpChannel Class – santhosh Aug 19 '21 at 16:07