Message Boards Message Boards

2
|
9329 Views
|
3 Replies
|
3 Total Likes
View groups...
Share
Share this post:

Support for Secure (Web) Sockets in the Wolfram Language?

Hello everyone!

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.

In[1]:= SocketConnect["wss://echo.websocket.org"]
During evaluation of In[1]:= SocketConnect::addrspec: The host specification echo.websocket.org is wrong because it is missing the port specification    
Out[1]= $Failed

One workaround was to use :443 at the end to specify the "secure" port.

In[2]:= SocketConnect["echo.websocket.org:443"]
Out[2]= SocketObject["TCP-<<UUID>>"]

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[3]:= Needs["SocketLink`"] (* and some stuff i tried.. *)
Out[3]= ¯\_(ツ)_/¯ (* 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!

Thanks!

Pedro Cabral.

POSTED BY: Pedro Cabral
3 Replies

Hello Pedro,

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

Then:

send = "
import asyncio
import websockets

output : object

async def send():
    global output

    uri = 'wss://echo.websocket.org'

    async with websockets.connect(uri) as websocket:
       await websocket.send('Hello World!')
       output = await websocket.recv()

asyncio.get_event_loop().run_until_complete(send())

output
"

session = StartExternalSession["Python"]
output = ExternalEvaluate[session, send]

Output should be equal to "Hello World!"

POSTED BY: Nicolò Monti

Hi Pedro,

have you been able to come up with a working solution?

POSTED BY: Philipp Winkler

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.

POSTED BY: Philipp Winkler
Reply to this discussion
Community posts can be styled and formatted using the Markdown syntax.
Reply Preview
Attachments
Remove
or Discard

Group Abstract Group Abstract