scalecube / scalecube-gateway

ScaleCube API Gateway is the single entry point for service consumers. handles incoming requests and proxy/route to the appropriate microservice instance.
Apache License 2.0
18 stars 7 forks source link

NPE on websocket gateway client #139

Closed artem-v closed 4 years ago

artem-v commented 4 years ago

NPE:

java.lang.NullPointerException: null
    at io.scalecube.services.api.Qualifier.getQualifierNamespace(Qualifier.java:28) ~[scalecube-services-api-2.9.1-RC8.jar:?]
    at io.exberry.exchange.operation.gateway.GatewaySessionHandlerImpl.isOperationEvents(GatewaySessionHandlerImpl.java:151) ~[app.jar:?]
    at io.exberry.exchange.operation.gateway.GatewaySessionHandlerImpl.onResponse(GatewaySessionHandlerImpl.java:133) ~[app.jar:?]
    at io.scalecube.services.gateway.ws.WebsocketGatewaySession.lambda$send$3(WebsocketGatewaySession.java:104) ~[scalecube-services-gateway-netty-2.8.16-RC5.jar:?]
    at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onNext(FluxPeekFuseable.java:189) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
    at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:121) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
    at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:121) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
    at reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:2317) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
    at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.request(FluxMapFuseable.java:162) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
    at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.request(FluxMapFuseable.java:162) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
    at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.request(FluxPeekFuseable.java:137) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
    at reactor.core.publisher.MonoFlatMap$FlatMapMain.onSubscribe(MonoFlatMap.java:103) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
    at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onSubscribe(FluxPeekFuseable.java:171) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
    at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onSubscribe(FluxMapFuseable.java:90) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
    at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onSubscribe(FluxMapFuseable.java:90) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
    at reactor.core.publisher.MonoJust.subscribe(MonoJust.java:54) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
    at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64) ~[reactor-core-3.3.5.RELEASE.jar:3.3.5.RELEASE]
    at reactor.core.publisher.MonoDefer

Presumably this is sig CANCEL and/or COMPLETE: io.scalecube.services.gateway.ws.GatewayMessages#newCancelMessage io.scalecube.services.gateway.ws.GatewayMessages#newCompleteMessage those are two places where qualifier is explicitly not being set.

Proposed solution (@segabriel) -- store original request qualifier somewhere and when it's needed to send CANCEL and/or CANCEL then use that original saved somewhere message qualfier.