I'm trying to connect to a service that uses Websockets (RFC 6455), specifically, Secure Websockets, that work over HTTPS (this information will be useful later).
I've tried many ways of doing so, first, using a wss:// does not work. Of course, because SocketConnect is meant for a raw TCP socket.
During evaluation of In:= SocketConnect::addrspec: The host specification echo.websocket.org is wrong because it is missing the port specification
One workaround was to use :443 at the end to specify the "secure" port.
Which worked fine, but later on, when sending a "homemade" Opening Handshake (Section 1.3 from RFC6455), one big catastrophic thing happened, the SocketConnect works over HTTP, and not HTTPS. The following Cloudfare message told me a very unhappy message for me.
400 Bad Request - Plain HTTP request sent over HTTPS.
I've tried using the internal SocketLink library, but with no success, because it doesn't work with HTTPS as well.
In:= Needs["SocketLink`"] (* and some stuff i tried.. *)
Out= ¯\_(ツ)_/¯ (* also uses HTTP, and crashes the kernel sometimes *)
My last resort would be to write a C external function for dealing with Websockets and Secure Websockets, but I'm here asking for any other possible and easier options.
So.. what should I do? Should I wait for a SecureSocketConnect? Is there any workaround that does not involve using other programming languages? Any help would be extremely appreciated!
I am also very interested in this for streaming quotes from exchanges and already made a feature request. Hopefully there will be a build in solution in the not too distant future.
have you been able to come up with a working solution?
Rather than writing that in C, you could use Python's websockets library,
so in the meantime you find a solution you can get this done.
I'm sure there is a better way to do it, but you can play around with this
First install websockets:
$ pip3 install websockets
send = "
output : object
async def send():
uri = 'wss://echo.websocket.org'
async with websockets.connect(uri) as websocket:
await websocket.send('Hello World!')
output = await websocket.recv()
session = StartExternalSession["Python"]
output = ExternalEvaluate[session, send]
Output should be equal to "Hello World!"