Spring STOMP (Websockets) - получить StompCommand в handleFrame

При тестировании веб-сокетов моего приложения я пытался проверить, не установилось ли соединение. Происходит следующее: StompClient пытается отправить CONNECT-кадр с присоединенным заголовком авторизации. Если он не отправляет заголовок авторизации с допустимым токеном, Spring попадает и генерирует AccessDeniedException.

В результате Spring отправляет фрейм ERROR вместо фрейма CONNECTED. Я хочу проверить это в тесте, но не могу получить связанную StompCommand полученного кадра в моем StompSessionHandlerAdapter (см. Изображение: ошибка при неверной аутентификации).

Я нашел хакерский обходной путь, чтобы проверить, получаю ли я команду ERROR, например:

public static class FakeException extends RuntimeException {

}

@Test
public void testConnectionFailsWithWrongToken() throws URISyntaxException, InterruptedException, ExecutionException, TimeoutException {
    JwtUserDetails user =  JwtUserFactory.create(testDaoUtil.saveUser(true, "dontcare"));
    String token = jwtTokenUtil.generateToken(user);

    WebSocketStompClient stompClient = new WebSocketStompClient(new StandardWebSocketClient());
    stompClient.setMessageConverter(new MappingJackson2MessageConverter());

    HttpHeaders httpHeaders = new HttpHeaders();
    WebSocketHttpHeaders headers = new WebSocketHttpHeaders(httpHeaders);
    StompHeaders stompHeaders = new StompHeaders();
    stompHeaders.add("Authorization", token + "1");

    CompletableFuture<Boolean> future = new CompletableFuture<>();

    stompClient.connect(URL, headers, stompHeaders, new StompSessionHandlerAdapter() {
        @Override
        public void handleFrame(StompHeaders headers, Object payload) {
            throw new FakeException();
        }

        void handleFrame(StompHeaders headers, StompCommand command, Object payload) {
            if (command.equals(StompCommand.ERROR)) {
                future.complete(false);
            } else {
                future.complete(true);
            }

            super.handleFrame(headers, payload);
        }

        @Override
        public void handleException(StompSession session, StompCommand command, StompHeaders headers, byte[] payload, Throwable exception) {
            if (exception instanceof FakeException) {
                this.handleFrame(headers, command, payload);
            } else {
                super.handleException(session, command, headers, payload, exception);
            }
        }
    });

    assertEquals(false, future.get());
}

Но я не вижу какой-либо конкретной причины, почему @Override handleFrame(...) не включает эту информацию. Есть ли момент, который я упустил, я делаю что-то здесь не так? Или я должен просто добавить PR в Spring-сообщения для этого?

0 ответов

Другие вопросы по тегам