private NextAction sendRequest(FilterChainContext ctx, UpgradeRequest upgradeRequest) { HttpRequestPacket.Builder builder = HttpRequestPacket.builder(); if (proxy && !PROXY_CONNECTED.get(ctx.getConnection())) { UPGRADE_REQUEST.set(ctx.getConnection(), upgradeRequest); URI requestURI = upgradeRequest.getRequestURI(); final int requestPort = Utils.getWsPort(requestURI); builder = builder.uri(String.format("%s:%d", requestURI.getHost(), requestPort)); builder = builder.protocol(Protocol.HTTP_1_1); builder = builder.method(Method.CONNECT); if (proxyHeaders != null && proxyHeaders.size() > 0) { for (Map.Entry<String, String> entry : proxyHeaders.entrySet()) { builder.header(entry.getKey(), entry.getValue()); } } builder = builder.header(Header.Host, requestURI.getHost()); builder = builder.header(Header.ProxyConnection, "keep-alive"); builder = builder.header(Header.Connection, "keep-alive"); ctx.write(HttpContent.builder(builder.build()).build()); ctx.flush(null); } else { ctx.write(getHttpContent(upgradeRequest)); } // call the next filter in the chain return ctx.getInvokeAction(); }
private NextAction sendRequest(FilterChainContext ctx, UpgradeRequest upgradeRequest) { HttpRequestPacket.Builder builder = HttpRequestPacket.builder(); if (proxy && !PROXY_CONNECTED.get(ctx.getConnection())) { UPGRADE_REQUEST.set(ctx.getConnection(), upgradeRequest); URI requestURI = upgradeRequest.getRequestURI(); final int requestPort = Utils.getWsPort(requestURI); builder = builder.uri(String.format("%s:%d", requestURI.getHost(), requestPort)); builder = builder.protocol(Protocol.HTTP_1_1); builder = builder.method(Method.CONNECT); if (proxyHeaders != null && proxyHeaders.size() > 0) { for (Map.Entry<String, String> entry : proxyHeaders.entrySet()) { builder.header(entry.getKey(), entry.getValue()); } } builder = builder.header(Header.Host, requestURI.getHost()); builder = builder.header(Header.ProxyConnection, "keep-alive"); builder = builder.header(Header.Connection, "keep-alive"); ctx.write(HttpContent.builder(builder.build()).build()); ctx.flush(null); } else { ctx.write(getHttpContent(upgradeRequest)); } // call the next filter in the chain return ctx.getInvokeAction(); }
/** * Handle Grizzly {@link Connection} write phase. If the {@link Connection} has associated {@link WebSocket} object * (websocket connection), we assume that message is websocket {@link DataFrame} and serialize it into a {@link * Buffer}. * * @param ctx {@link FilterChainContext} * @return {@link NextAction} instruction for {@link FilterChain}, how it should continue the execution * @throws IOException TODO */ @Override public NextAction handleWrite(FilterChainContext ctx) throws IOException { // get the associated websocket org.glassfish.tyrus.websockets.Connection connection = getWebSocketConnection(ctx, null); final WebSocket websocket = getWebSocket(connection); // if there is one if (websocket != null) { final DataFrame frame = ctx.getMessage(); final WebSocketHolder holder = WebSocketEngine.getEngine().getWebSocketHolder(connection); final Buffer wrap = Buffers.wrap(ctx.getMemoryManager(), holder.handler.frame(frame)); ctx.setMessage(wrap); ctx.flush(null); } // invoke next filter in the chain return ctx.getInvokeAction(); }
/** * Handle server-side websocket handshake * * @param ctx {@link FilterChainContext} * @param requestContent HTTP message * @return TODO * @throws IOException TODO */ private NextAction handleServerHandshake(final FilterChainContext ctx, final HttpContent requestContent) throws IOException { // get HTTP request headers final HttpRequestPacket request = (HttpRequestPacket) requestContent.getHttpHeader(); final org.glassfish.tyrus.websockets.Connection webSocketConnection = getWebSocketConnection(ctx, requestContent); try { if (!WebSocketEngine.getEngine().upgrade( webSocketConnection, createWebSocketRequest(ctx, requestContent))) { return ctx.getInvokeAction(); // not a WS request, pass to the next filter. } setIdleTimeout(ctx); } catch (HandshakeException e) { ctx.write(composeHandshakeError(request, e)); } ctx.flush(null); requestContent.recycle(); return ctx.getStopAction(); }
if (httpStatus == HttpStatus.OK_200) { ctx.write(getHttpContent(webSocketRequest)); ctx.flush(null);