3

I follow the spring-rsocket-demo project to complete my code. I add some authentication logic in my server side code as follows. You can see I throw a exception in the after the authentication logic 'CLIENT.add(requester)'. I execute the test method in spring-rsocket-demo project called 'testRequestGetsResponse' and I find I can't receive the exception. How to process setup payload in @ConnectMapping annotated method and return a RejectedSetupException if need.


        requester.rsocket()
                .onClose()
                .doFirst(() -> {
                    // Add all new clients to a client list
                    log.info("Client: {} CONNECTED.", client);
                    //throw Exception during process setup payload
                    //my authentication code.
                    try {
//                        CLIENTS.add(requester);
                        throw new RuntimeException();
                    } catch (Exception exception) {
                        throw exception;
                    }
                })
                .doOnError(error -> {
                    // Warn when channels are closed by clients
                    log.warn("Channel to client {} CLOSED", client);
                })
                .doFinally(consumer -> {
                    // Remove disconnected clients from the client list
                    CLIENTS.remove(requester);
                    log.info("Client {} DISCONNECTED", client);
                })
                .subscribe();
Kami Wan
  • 724
  • 2
  • 9
  • 23

1 Answers1

5

You should define your @ConnectionMapping method as following:

@ConnectionMapping 
Mono<Void> handleSetup(@Payload String payload) {
   // Add all new clients to a client list
   log.info("Client: {} CONNECTED.", client);
   boolean isAuthenticated = ... //my authentication code.
   if (!isAuthenticated) {
     //throw Exception during process setup payload
     return Mono.error(new RejectedSetupException("connection is not authenticated"));
   }

   // add client if it is authenticated
   CLIENTS.add(requester);

   requester.rsocket()
            .onClose()
            .doFinally(consumer -> {
               // Remove disconnected clients from the client list
               CLIENTS.remove(requester);
               log.info("Client {} DISCONNECTED", client);
            })
            .subscribe();

   return Mono.empty();
}

As you may see from the code above, if a connection does not pass the authentication, it returns a Mono.error with an appropriate error

Oleh Dokuka
  • 11,613
  • 5
  • 40
  • 65