Search in sources :

Example 1 with HttpUpgradeListener

use of io.undertow.server.HttpUpgradeListener in project undertow by undertow-io.

the class ChannelUpgradeHandler method addProtocol.

private synchronized void addProtocol(String productString, HttpUpgradeListener openListener, final ChannelListener<? super StreamConnection> channelListener, final HttpUpgradeHandshake handshake) {
    if (productString == null) {
        throw new IllegalArgumentException("productString is null");
    }
    if (openListener == null && channelListener == null) {
        throw new IllegalArgumentException("openListener is null");
    }
    if (openListener == null) {
        openListener = new HttpUpgradeListener() {

            @Override
            public void handleUpgrade(StreamConnection streamConnection, HttpServerExchange exchange) {
                ChannelListeners.invokeChannelListener(streamConnection, channelListener);
            }
        };
    }
    List<Holder> list = handlers.get(productString);
    if (list == null) {
        handlers.put(productString, list = new CopyOnWriteArrayList<>());
    }
    list.add(new Holder(openListener, handshake, channelListener));
}
Also used : HttpServerExchange(io.undertow.server.HttpServerExchange) HttpUpgradeListener(io.undertow.server.HttpUpgradeListener) StreamConnection(org.xnio.StreamConnection) CopyOnWriteArrayList(java.util.concurrent.CopyOnWriteArrayList)

Example 2 with HttpUpgradeListener

use of io.undertow.server.HttpUpgradeListener in project undertow by undertow-io.

the class ConnectHandler method handleRequest.

@Override
public void handleRequest(final HttpServerExchange exchange) throws Exception {
    if (exchange.getRequestMethod().equals(Methods.CONNECT)) {
        if (!allowed.resolve(exchange)) {
            //not sure if this is the best response
            exchange.setStatusCode(StatusCodes.METHOD_NOT_ALLOWED);
            return;
        }
        String[] parts = exchange.getRequestPath().split(":");
        if (parts.length != 2) {
            //not sure if this is the best response
            exchange.setStatusCode(StatusCodes.BAD_REQUEST);
            return;
        }
        final String host = parts[0];
        final Integer port = Integer.parseInt(parts[1]);
        exchange.dispatch(SameThreadExecutor.INSTANCE, new Runnable() {

            @Override
            public void run() {
                exchange.getConnection().getIoThread().openStreamConnection(new InetSocketAddress(host, port), new ChannelListener<StreamConnection>() {

                    @Override
                    public void handleEvent(final StreamConnection clientChannel) {
                        exchange.acceptConnectRequest(new HttpUpgradeListener() {

                            @Override
                            public void handleUpgrade(StreamConnection streamConnection, HttpServerExchange exchange) {
                                final ClosingExceptionHandler handler = new ClosingExceptionHandler(streamConnection, clientChannel);
                                Transfer.initiateTransfer(clientChannel.getSourceChannel(), streamConnection.getSinkChannel(), ChannelListeners.closingChannelListener(), ChannelListeners.writeShutdownChannelListener(ChannelListeners.<StreamSinkChannel>flushingChannelListener(ChannelListeners.closingChannelListener(), ChannelListeners.closingChannelExceptionHandler()), ChannelListeners.closingChannelExceptionHandler()), handler, handler, exchange.getConnection().getByteBufferPool());
                                Transfer.initiateTransfer(streamConnection.getSourceChannel(), clientChannel.getSinkChannel(), ChannelListeners.closingChannelListener(), ChannelListeners.writeShutdownChannelListener(ChannelListeners.<StreamSinkChannel>flushingChannelListener(ChannelListeners.closingChannelListener(), ChannelListeners.closingChannelExceptionHandler()), ChannelListeners.closingChannelExceptionHandler()), handler, handler, exchange.getConnection().getByteBufferPool());
                            }
                        });
                        exchange.setStatusCode(200);
                        exchange.endExchange();
                    }
                }, OptionMap.create(Options.TCP_NODELAY, true)).addNotifier(new IoFuture.Notifier<StreamConnection, Object>() {

                    @Override
                    public void notify(IoFuture<? extends StreamConnection> ioFuture, Object attachment) {
                        if (ioFuture.getStatus() == IoFuture.Status.FAILED) {
                            exchange.setStatusCode(503);
                            exchange.endExchange();
                        }
                    }
                }, null);
            }
        });
    } else {
        next.handleRequest(exchange);
    }
}
Also used : InetSocketAddress(java.net.InetSocketAddress) StreamSinkChannel(org.xnio.channels.StreamSinkChannel) IoFuture(org.xnio.IoFuture) StreamConnection(org.xnio.StreamConnection) HttpServerExchange(io.undertow.server.HttpServerExchange) HttpUpgradeListener(io.undertow.server.HttpUpgradeListener)

Example 3 with HttpUpgradeListener

use of io.undertow.server.HttpUpgradeListener in project undertow by undertow-io.

the class WebSocketServlet method doGet.

@Override
protected void doGet(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException {
    final ServletWebSocketHttpExchange facade = new ServletWebSocketHttpExchange(req, resp, peerConnections);
    Handshake handshaker = null;
    for (Handshake method : handshakes) {
        if (method.matches(facade)) {
            handshaker = method;
            break;
        }
    }
    if (handshaker == null) {
        UndertowLogger.REQUEST_LOGGER.debug("Could not find hand shaker for web socket request");
        resp.sendError(StatusCodes.BAD_REQUEST);
        return;
    }
    final Handshake selected = handshaker;
    facade.upgradeChannel(new HttpUpgradeListener() {

        @Override
        public void handleUpgrade(StreamConnection streamConnection, HttpServerExchange exchange) {
            WebSocketChannel channel = selected.createChannel(facade, streamConnection, facade.getBufferPool());
            peerConnections.add(channel);
            callback.onConnect(facade, channel);
        }
    });
    handshaker.handshake(facade);
}
Also used : HttpServerExchange(io.undertow.server.HttpServerExchange) WebSocketChannel(io.undertow.websockets.core.WebSocketChannel) HttpUpgradeListener(io.undertow.server.HttpUpgradeListener) StreamConnection(org.xnio.StreamConnection) Hybi07Handshake(io.undertow.websockets.core.protocol.version07.Hybi07Handshake) Hybi13Handshake(io.undertow.websockets.core.protocol.version13.Hybi13Handshake) Handshake(io.undertow.websockets.core.protocol.Handshake) Hybi08Handshake(io.undertow.websockets.core.protocol.version08.Hybi08Handshake)

Example 4 with HttpUpgradeListener

use of io.undertow.server.HttpUpgradeListener in project undertow by undertow-io.

the class ChannelUpgradeHandler method handleRequest.

public void handleRequest(final HttpServerExchange exchange) throws Exception {
    final List<String> upgradeStrings = exchange.getRequestHeaders().get(Headers.UPGRADE);
    if (upgradeStrings != null && exchange.getRequestMethod().equals(Methods.GET)) {
        for (String string : upgradeStrings) {
            final List<Holder> holders = handlers.get(string);
            if (holders != null) {
                for (Holder holder : holders) {
                    final HttpUpgradeListener listener = holder.listener;
                    if (holder.handshake != null) {
                        if (!holder.handshake.handleUpgrade(exchange)) {
                            //handshake did not match, try again
                            continue;
                        }
                    }
                    exchange.upgradeChannel(string, listener);
                    exchange.endExchange();
                    return;
                }
            }
        }
    }
    nonUpgradeHandler.handleRequest(exchange);
}
Also used : HttpUpgradeListener(io.undertow.server.HttpUpgradeListener)

Example 5 with HttpUpgradeListener

use of io.undertow.server.HttpUpgradeListener in project undertow by undertow-io.

the class Http2UpgradeHandler method handleRequest.

@Override
public void handleRequest(HttpServerExchange exchange) throws Exception {
    final String upgrade = exchange.getRequestHeaders().getFirst(Headers.UPGRADE);
    if (upgrade != null && upgradeStrings.contains(upgrade)) {
        String settings = exchange.getRequestHeaders().getFirst("HTTP2-Settings");
        if (settings != null) {
            //required by spec
            final ByteBuffer settingsFrame = FlexBase64.decodeURL(settings);
            exchange.getResponseHeaders().put(Headers.UPGRADE, upgrade);
            exchange.upgradeChannel(new HttpUpgradeListener() {

                @Override
                public void handleUpgrade(StreamConnection streamConnection, HttpServerExchange exchange) {
                    OptionMap undertowOptions = exchange.getConnection().getUndertowOptions();
                    Http2Channel channel = new Http2Channel(streamConnection, upgrade, exchange.getConnection().getByteBufferPool(), null, false, true, true, settingsFrame, undertowOptions);
                    Http2ReceiveListener receiveListener = new Http2ReceiveListener(new HttpHandler() {

                        @Override
                        public void handleRequest(HttpServerExchange exchange) throws Exception {
                            //as the request was only to create the initial request
                            if (exchange.getRequestHeaders().contains("X-HTTP2-connect-only")) {
                                exchange.endExchange();
                                return;
                            }
                            exchange.setProtocol(Protocols.HTTP_2_0);
                            next.handleRequest(exchange);
                        }
                    }, undertowOptions, exchange.getConnection().getBufferSize(), null);
                    channel.getReceiveSetter().set(receiveListener);
                    receiveListener.handleInitialRequest(exchange, channel);
                    channel.resumeReceives();
                }
            });
            return;
        }
    }
    next.handleRequest(exchange);
}
Also used : HttpServerExchange(io.undertow.server.HttpServerExchange) HttpHandler(io.undertow.server.HttpHandler) OptionMap(org.xnio.OptionMap) Http2Channel(io.undertow.protocols.http2.Http2Channel) HttpUpgradeListener(io.undertow.server.HttpUpgradeListener) StreamConnection(org.xnio.StreamConnection) ByteBuffer(java.nio.ByteBuffer)

Aggregations

HttpUpgradeListener (io.undertow.server.HttpUpgradeListener)9 HttpServerExchange (io.undertow.server.HttpServerExchange)8 StreamConnection (org.xnio.StreamConnection)8 WebSocketChannel (io.undertow.websockets.core.WebSocketChannel)4 Handshake (io.undertow.websockets.core.protocol.Handshake)4 ServletWebSocketHttpExchange (io.undertow.servlet.websockets.ServletWebSocketHttpExchange)2 Hybi07Handshake (io.undertow.websockets.core.protocol.version07.Hybi07Handshake)2 Hybi08Handshake (io.undertow.websockets.core.protocol.version08.Hybi08Handshake)2 Hybi13Handshake (io.undertow.websockets.core.protocol.version13.Hybi13Handshake)2 ExtensionHandshake (io.undertow.websockets.extensions.ExtensionHandshake)2 SocketChannel (io.netty.channel.socket.SocketChannel)1 Http2Channel (io.undertow.protocols.http2.Http2Channel)1 HttpHandler (io.undertow.server.HttpHandler)1 InstanceFactory (io.undertow.servlet.api.InstanceFactory)1 ConstructorInstanceFactory (io.undertow.servlet.util.ConstructorInstanceFactory)1 PathTemplate (io.undertow.util.PathTemplate)1 PathTemplateMatcher (io.undertow.util.PathTemplateMatcher)1 WebSocketHandshakeHolder (io.undertow.websockets.jsr.ServerWebSocketContainer.WebSocketHandshakeHolder)1 AnnotatedEndpointFactory (io.undertow.websockets.jsr.annotated.AnnotatedEndpointFactory)1 JsrHybi07Handshake (io.undertow.websockets.jsr.handshake.JsrHybi07Handshake)1