Git Product home page Git Product logo

rsocket-cli's Introduction

RSocket CLI

Description

Simple RSocket CLI focused on sending basic traffic to servers built using RSocket e.g. help debug a mobile <=> server integration issue.

Supports ws and wss URIs

Consider if you should use rsc instead

For rsocket-java specfic testing, the command line you probably want is https://github.com/making/rsc . This library builds on https://github.com/rsocket/rsocket-kotlin .

Build Status

Build and Run

To build the RSocket CLI:

./gradlew --console plain installDist

To run:

./build/install/rsocket-cli/bin/rsocket-cli --help

The build and run:

$ ./rsocket-cli --help

Install via Homebrew

Use tab completion for help with specifying the operation type.

$ brew install yschimke/tap/rsocket-cli

Examples

A generic interaction:

$ rsocket-cli --request --debug wss://rsocket-demo.herokuapp.com/rsocket      

A spring routed request to query tweets:

$ rsocket-cli --route=searchTweets -i Sunday wss://rsocket-demo.herokuapp.com/rsocket

rsocket-cli's People

Contributors

benjchristensen avatar linux-china avatar lksvenoy-r7 avatar nebhale avatar niteshkant avatar robertroeser avatar rstoyanchev avatar yschimke avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

rsocket-cli's Issues

TCP connection broken with graal

 ./build/graal/rsocketcli tcp://localhost:9000 -s wss://rsocket-demo.herokuapp.com/rsocket
Exception in thread "main" java.lang.ExceptionInInitializerError
	at com.oracle.svm.core.classinitialization.ClassInitializationInfo.initialize(ClassInitializationInfo.java:291)
	at io.ktor.network.selector.SelectableBase.<init>(SelectableJvm.kt:8)
	at io.ktor.network.sockets.NIOSocketImpl.<init>(NIOSocket.kt:22)
	at io.ktor.network.sockets.SocketImpl.<init>(SocketImpl.kt:17)
	at io.ktor.network.sockets.ConnectUtilsJvmKt.connect(ConnectUtilsJvm.kt:18)
	at io.ktor.network.sockets.TcpSocketBuilder.connect(TcpSocketBuilder.kt:38)
	at io.rsocket.kotlin.transport.ktor.TcpClientTransportKt$clientTransport$$inlined$ClientTransport$1.connect(ClientTransport.kt:33)
	at io.rsocket.kotlin.core.RSocketConnector.connectOnce(RSocketConnector.kt:44)
	at io.rsocket.kotlin.core.RSocketConnector.connect(RSocketConnector.kt:35)
	at io.rsocket.cli.ClientKt.buildTcpClient(client.kt:52)
	at io.rsocket.cli.ClientKt.buildClient(client.kt:29)
	at io.rsocket.cli.ClientKt.buildClient$default(client.kt:27)
	at io.rsocket.cli.Main.exec(Main.kt:175)
	at io.rsocket.cli.Main$exec$1.invokeSuspend(Main.kt)
	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
	at kotlinx.coroutines.EventLoopImplBase.processNextEvent(EventLoop.common.kt:274)
	at kotlinx.coroutines.BlockingCoroutine.joinBlocking(Builders.kt:86)
	at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking(Builders.kt:61)
	at kotlinx.coroutines.BuildersKt.runBlocking(Unknown Source)
	at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking$default(Builders.kt)
	at kotlinx.coroutines.BuildersKt.runBlocking$default(Unknown Source)
	at io.rsocket.cli.Main.run(Main.kt:143)
	at io.rsocket.cli.Main$Companion.exec(Main.kt:298)
	at io.rsocket.cli.Main$Companion.main(Main.kt:282)
	at io.rsocket.cli.Main.main(Main.kt)
Caused by: java.lang.RuntimeException: java.lang.NoSuchFieldException: readHandlerReference
	at java.util.concurrent.atomic.AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl.<init>(AtomicReferenceFieldUpdater.java:120)
	at java.util.concurrent.atomic.AtomicReferenceFieldUpdater.newUpdater(AtomicReferenceFieldUpdater.java:116)
	at io.ktor.network.selector.InterestSuspensionsMap.<clinit>(InterestSuspensionsMap.kt:71)
	at com.oracle.svm.core.classinitialization.ClassInitializationInfo.invokeClassInitializer(ClassInitializationInfo.java:351)
	at com.oracle.svm.core.classinitialization.ClassInitializationInfo.initialize(ClassInitializationInfo.java:271)
	... 25 more
Caused by: java.lang.NoSuchFieldException: readHandlerReference
	at java.lang.Class.getDeclaredField(DynamicHub.java:2411)
	at java.util.concurrent.atomic.AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl.<init>(AtomicReferenceFieldUpdater.java:115)
	... 29 more

Unresolved reference: clientTransport

Hi there!

I'm trying to launch the rsocket-cli on my PC, but I get this error at the very first stage when I run this command:
./gradlew --console plain installDist
And my error looks like this:
> Task :compileKotlin FAILED e: /home/akulik/IdeaProjects/Pet/rsocket-cli/src/main/kotlin/io/rsocket/cli/client.kt: (21, 41): Unresolved reference: clientTransport e: /home/akulik/IdeaProjects/Pet/rsocket-cli/src/main/kotlin/io/rsocket/cli/client.kt: (46, 32): Unresolved reference: clientTransport
You can find the full log by this link.

What is more interesting these lines of code is burning red in my IDE:
image

I've checked this app on two PC and got the same error. Probably, this is a bug only for my Linux distro. I'm using - Fedora. I got this bug on the Fedora 33(bash)/34(zch) and on the latest rsocket-cli version.

Malformed ws/wss urls produce non-descriptive error and is inconsistent with other url format

Expected Behavior
When running rsocket-cli with target specified as ws://127.0.0.1:8080, granted there is a running server and the other arguments specified are correct, the connection should successfully be established.

Actual Behavior
The connection fails with a misleading error.

java.lang.IllegalArgumentException: Unable to parse url '' at reactor.netty.http.client.UriEndpointFactory.createUriEndpoint(UriEndpointFactory.java:69) at reactor.netty.http.client.UriEndpointFactory.createUriEndpoint(UriEndpointFactory.java:44) at reactor.netty.http.client.HttpClientConnect$HttpClientHandler.<init>(HttpClientConnect.java:503) at reactor.netty.http.client.HttpClientConnect$MonoHttpConnect.subscribe(HttpClientConnect.java:230) at reactor.core.publisher.MonoMap.subscribe(MonoMap.java:55) at reactor.core.publisher.MonoFlatMap.subscribe(MonoFlatMap.java:60) at reactor.core.publisher.Mono.subscribe(Mono.java:3694) at kotlinx.coroutines.reactive.AwaitKt.awaitOne(Await.kt:96) at kotlinx.coroutines.reactive.AwaitKt.awaitOne$default(Await.kt:94) at kotlinx.coroutines.reactive.AwaitKt.awaitFirst(Await.kt:25) at io.rsocket.cli.Main.buildClient(Main.kt:207) at io.rsocket.cli.Main.run(Main.kt:157) at io.rsocket.cli.Main$Companion$main$1.invokeSuspend(Main.kt:347) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:32) at kotlinx.coroutines.DispatchedTask.run(Dispatched.kt:233) at kotlinx.coroutines.EventLoopImplBase.processNextEvent(EventLoop.kt:116) at kotlinx.coroutines.BlockingCoroutine.joinBlocking(Builders.kt:76) at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking(Builders.kt:53) at kotlinx.coroutines.BuildersKt.runBlocking(Unknown Source) at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking$default(Builders.kt:35) at kotlinx.coroutines.BuildersKt.runBlocking$default(Unknown Source) at io.rsocket.cli.Main$Companion.main(Main.kt:346) at io.rsocket.cli.Main.main(Main.kt)

This error happens because the UriEndpointFactory expected the URI Path variable to be set. The error is resolved by changing the ws uri to contain / at the end. The error is non-descriptive and inconsistent with the way tcp:// works.

Steps to Reproduce the Problem

  1. Start a websocket server on localhost:8080
  2. Run rsocket-cli --channel --dataFormat json -i "Hello" --debug ws://localhost:8080
  3. Observe the crash

Version: 1.14.0
Platform: macOS High Sierra, Macbook Pro (15-inch, 2018)

HTTP 501 error on installation

The error seems fixed when manually rewriting http paths dependencies to https

This should be done by default in order to not scare away users :)

Convert UriUtils.java to UriUtils.kt

UriUtils.java is ignored by Java compiler because it's in src/main/kotlin, and not src/main/java.

https://github.com/rsocket/rsocket-cli/blob/master/src/main/kotlin/io/rsocket/cli/uri/UriUtils.java

It will trigger bug when using websocket.

 ./rsocket-cli -i "pong" --server --debug ws://localhost:42252
Exception in thread "main" java.lang.NoClassDefFoundError: io/rsocket/cli/uri/UriUtils
	at io.rsocket.cli.uri.WebsocketUriHandler.buildServer(WebsocketUriHandler.kt:52)
	at io.rsocket.cli.uri.UriTransportRegistry.serverForUri(UriTransportRegistry.kt:57)
	at io.rsocket.cli.Main.buildServer(Main.kt:207)
	at io.rsocket.cli.Main.exec(Main.kt:180)
	at io.rsocket.cli.Main$run$1.invokeSuspend(Main.kt:140)
	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:56)
	at kotlinx.coroutines.EventLoopImplBase.processNextEvent(EventLoop.common.kt:274)
	at kotlinx.coroutines.BlockingCoroutine.joinBlocking(Builders.kt:79)
	at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking(Builders.kt:54)
	at kotlinx.coroutines.BuildersKt.runBlocking(Unknown Source)
	at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking$default(Builders.kt:36)
	at kotlinx.coroutines.BuildersKt.runBlocking$default(Unknown Source)
	at io.rsocket.cli.Main.run(Main.kt:139)
	at io.rsocket.cli.Main$Companion.exec(Main.kt:388)
	at io.rsocket.cli.Main$Companion.main(Main.kt:372)
	at io.rsocket.cli.Main.main(Main.kt)
Caused by: java.lang.ClassNotFoundException: io.rsocket.cli.uri.UriUtils
	at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
	... 17 more

build fails with JDK 21

Expected Behavior

When cloning the repository and running ./gradlew --console plain installDist (as in the project README.md), the project should build.

Actual Behavior

After gradlew downloaded gradle-7.4.2-all.zip, the build failed:

FAILURE: Build failed with an exception.

* Where:
Settings file '/home/cfuchs/projects/rsocket-cli/settings.gradle'

* What went wrong:
Could not compile settings file '/home/cfuchs/projects/rsocket-cli/settings.gradle'.
> startup failed:
  General error during conversion: Unsupported class file major version 65
  
  java.lang.IllegalArgumentException: Unsupported class file major version 65

Steps to Reproduce

In an environment where javac -version reports version 21, run:

git clone https://github.com/rsocket/rsocket-cli.git
cd rsocket-cli/
./gradlew --console plain installDist

Possible Solution

Workaround: switch to JDK 17 (Debian: sudo update-alternatives --config java).

Your Environment

  • latest rsocket, at the time of this bug the HEAD commit was 9cd4656 Update all dependencies + JDK 17 (#124)
  • Debian 12 with packages temurin-21-jdk and openjdk-17-jdk, no preinstalled gradle (only using gradlew wrapper).

Support Composite and Routing metadata APIs

Now that RSocket Java has CompositeMetadataFlyweight and RoutingMetadata/TaggingMetadataFlyweight based on the corresponding extensions, it would be useful if the CLI could support sending metadata encoded with those APIs.

Not sure how this works out into command line arguments, but for composite it's essentially multiple sets of metadataFormat and metadata pairs. For routing, a collection of tags.

Simple frame logging API

Ideally with a simple flag, add ability to see either of

RSocket Frames (requestn, setup, payload) or
Transport Frames (Websocket frame, potentially HTTP2)

The former is way more important to me.

Better exception handling for standard cases

reactor.core.Exceptions$ReactiveException: io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused: localhost/127.0.0.1:9898
	at reactor.core.Exceptions.propagate(Exceptions.java:219)
	at reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:92)
	at reactor.core.publisher.Mono.block(Mono.java:1189)
	at io.reactivesocket.cli.Main.run(Main.java:151)
	at io.reactivesocket.cli.Main.main(Main.java:419)
	Suppressed: java.lang.Exception: #block terminated with an error
		at reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:93)
		... 3 more
Caused by: io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused: localhost/127.0.0.1:9898
	at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
	at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:717)
	at io.netty.channel.socket.nio.NioSocketChannel.doFinishConnect(NioSocketChannel.java:347)
	at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.finishConnect(AbstractNioChannel.java:340)
	at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:630)
	at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:565)
	at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:479)
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:441)
	at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858)
	at java.lang.Thread.run(Thread.java:745)

Using route with metadata doesn't work

Expected Behavior

send metadata along with the route should work.

Actual Behavior

yields

ApplicationError: JSON decoding error: Unrecognized token 'þԀ琄獥': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false'); nested exception is com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'þԀ琄獥': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false')
 at [Source: (io.netty.buffer.ByteBufInputStream); line: 1, column: 5]

Steps to Reproduce

$ rsocket-cli -m '{"test" : "value"}' --metadataFormat=application/json --channel --route test -i test --debug wss://localhost:8080/ws

Your Environment

installed via brew: yschimke/tap/rsocket-cli 1.29 on macOS 11.2.1

$ rsocket-cli --version
dev

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.