Message Boards Message Boards

GROUPS:

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

Posted 6 months ago
1523 Views
|
3 Replies
|
3 Total Likes
|

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.

3 Replies
Posted 6 months ago

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 5 months ago

Hi Pedro,

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

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!"

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