Проксирование через WebSocket с помощью HttpServlet - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть вопрос.Может быть, кто-то может объяснить мне, или, может быть, кто-то уже сделал это - В моем проекте я использую http-прокси на основе Smiley's Http Proxy с небольшим рефакторингом - он отлично работает для HTTP и HTTPS.Но теперь мне нужно проксировать приложения Websocket.Итак, я нашел другую библиотеку - Nv-WebSocket-Client .Когда пользователь открывает браузер, скажем, на http://somehost:8082/examples/websocket/chat.xhtml - мое приложение проксирует http://someanotherhost:8080/examples/websocket/chat.xhtml - это работает.Затем - код javascript на этой странице создает Websocket и реквизит ws: // somehost: 8082 / examples / websocket / chat - мое приложение проксирует ws: // someanotherhost: 8080 / examples / websocket / chat - и это тоже работает,Потому что рукопожатие успешно выполнено, и ответ возвращается в браузер с 101 протоколом переключения.Но потом я получил текстовый фрейм от конечной точки реального сервера weboscket, я не понимаю, как я могу донести этот фрейм до пользователя.Может быть кто-нибудь знает какие-нибудь библиотеки, которые могут делать проксирование для websocket?Это некоторый код метода:

private HttpResponse invokeWebSocketReq(HttpServletRequest servletRequest, HttpRequest proxyRequest){
    final HttpResponse httpResponse = new BasicHttpResponse(new ProtocolVersion("HTTP",1,1), 101, "Switching protocol");
    try {


            WebSocketFactory factory = new WebSocketFactory();

            factory.setConnectionTimeout(5000);
            WebSocket webSocket = factory.createSocket(proxyRequest.getRequestLine().getUri());
            Header header = proxyRequest.getFirstHeader("Sec-WebSocket-Extensions");
            webSocket.addExtension(WebSocketExtension.parse(header.getValue()));
            webSocket.addHeader("Sec-WebSocket-Key", proxyRequest.getFirstHeader("Sec-WebSocket-Key").getValue());
            webSocket.setMissingCloseFrameAllowed(true);
            webSocket.addListener(new WebSocketAdapter() {
                ServerTest st;

                @Override
                public void onConnected(WebSocket websocket, Map<String, List<String>> headers) throws Exception {
                    System.out.println("Successfully connected to websocket");
                    System.out.println("Is websocket open? - " + webSocket.isOpen());

                }

                @Override
                public void onConnectError(WebSocket websocket, WebSocketException exception) throws Exception {
                    super.onConnectError(websocket, exception);
                }

                @Override
                public void onDisconnected(WebSocket websocket, WebSocketFrame serverCloseFrame, WebSocketFrame clientCloseFrame, boolean closedByServer) throws Exception {
                    System.out.println("Disconnected from websocket");
                    System.out.println("Server Close code: " + serverCloseFrame.getCloseCode());
                    System.out.println("Server Close reason: " + serverCloseFrame.getCloseReason());
                    System.out.println("Client Close code: " + clientCloseFrame.getCloseCode());
                    System.out.println("Client Close reason: " + clientCloseFrame.getCloseReason());
                }

                @Override
                public void onTextFrame(WebSocket websocket, WebSocketFrame frame) throws Exception {
                    System.out.println("OnTextFrame: " + frame.getPayloadText());

                }

                @Override
                public void onCloseFrame(WebSocket websocket, WebSocketFrame frame) throws Exception {
                    System.out.println("OnClose Frame");
                }

                @Override
                public void onTextMessage(WebSocket websocket, String text) throws Exception {
                    System.out.println("On Text Message: " + text);
                    System.out.println("Local socket address: " + websocket.getSocket().getLocalSocketAddress().toString());
                    System.out.println("Remote socket address" + websocket.getSocket().getRemoteSocketAddress().toString());
                    super.onTextMessage(websocket, text);
                }

                @Override
                public void onError(WebSocket websocket, WebSocketException cause) throws Exception {
                    System.out.println("Error: " + cause.getMessage());
                }

                @Override
                public void onSendError(WebSocket websocket, WebSocketException cause, WebSocketFrame frame) throws Exception {
                    System.out.println("On send error");
                }

                @Override
                public void onUnexpectedError(WebSocket websocket, WebSocketException cause) throws Exception {
                    System.out.println("On unexpected error");
                }

                @Override
                public void onSendingHandshake(WebSocket websocket, String requestLine, List<String[]> headers) throws Exception {
                    System.out.println("Will send handshake");
                    System.out.println("Request line: " + requestLine);
                    System.out.println("All headers: " + headers.toString());

                }

                @Override
                public void onStateChanged(WebSocket websocket, WebSocketState newState) throws Exception {
                    super.onStateChanged(websocket, newState);
                }

            });

            webSocket.connect();
            System.out.println("Is websocket open? - " + webSocket.isOpen());
            for (Map.Entry<String, List<String>> entry : webSocket.getServerHeaders().entrySet()) {
                httpResponse.setHeader(entry.getKey(), entry.getValue().get(0));
            }




    } catch (InterruptedException | ExecutionException | /*DeploymentException |*/ IOException | WebSocketException e) {
        e.printStackTrace();
        httpResponse.setStatusCode(500);
        httpResponse.setReasonPhrase(e.getMessage());
    }finally {
        System.out.println("Woopes");
    }
    return httpResponse;
}

Я тестирую на примере чата tomcat websocket.Кроме того, когда пользователь пытается что-то набрать в чате - я получаю сообщение в консоли браузера: «Не удалось установить соединение WebSocket с« ws: // somehost: 8082 / examples / websocket / chat »: сервер не должен маскировать любые кадры, которые онотправляет клиенту. "

...