Message Boards Message Boards


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

Posted 6 months ago
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://"]
During evaluation of In[1]:= SocketConnect::addrspec: The host specification 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[""]
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!


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


send = "
import asyncio
import websockets

output : object

async def send():
    global output

    uri = 'wss://'

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

Reply to this discussion
Community posts can be styled and formatted using the Markdown syntax.
Reply Preview
or Discard

Group Abstract Group Abstract