tokio-tungstenite
tokio-tungstenite copied to clipboard
"WebSocket protocol error: httparse error: invalid token" when connect from ngrok tcp tunnel.
When I tried using an ngrok tcp tunnel to point towards a tokio-tungstenite websocket server on my localhost, I get an "httparse error: invalid token" error. Does anyone know why this is happening?
Sounds like an invalid header line or something. This error originates from the httparse
dependency that parses the HTTP.
And here is the error, i.e. I think a simple example with httparse
would fail for the same reason, so maybe you could check what you're getting from the server that makes it fail.
I've made a simple tcp server to listen for websocket connections, but the initial message sent to the server seems to be garbled.
Here's a request I got on this test TCP server via ngrok:
Opened connection from 127.0.0.1:64160
Got string: ▬♥☺☻.☺☻*♥♥u�h��&�►�2�v51�↨��d:�♣0���◄ 0��x�R��Y�x� �↓/(�}S;?F'�������� ZZ‼☺‼☻‼♥�+�/�,�0̨̩�‼�¶��/5☺☺ ☺���Di♣♥☻h2↨‼◄0.tcp.ngrok.io#�☺☺-☻☺☺+♠JJ♥♦♥♥
[�7!�ۅ���+↓�W�h↓Х ,?���▼�♣5♥AB��v�A��↔l&↨↑H∟�d�@=m�)�fJ$v̜��FO��qČ�}z��݂�=)S��E����↕�0Ά���→:�↓���?s��G�G�W�R�nm[ [r�����:
�F���]0C��'q��d,�'�9����2��7}Q�#�__Q☺◄��o"&�1C�A�����<���f@�♠c��{♣w��Ft
↕►♦♦♦☺♣♣♣♠♠☺↕►
http/1.1♥☻☻
☻☺J☺
Could this maybe have something to do with connecting with secure websockets (wss://) over ngrok?
This certainly depends on the configuration of the ngrok. I think without an additional configuration it would indeed expect non-encrypted traffic. So it depends on which endpoints you're exposing.
I'm running a tcp tunnel through ngrok without tls (using ngrok tcp 9000
, however I have to connect to the tcp endpoint using wss:// because unsecure websockets are not allowed when content is loaded from secure sites. I think if I tried using an http tunnel ngrok should translate the encrypted traffic to unencrypted traffic. But I'll need to pass a header to bypass the browser warning.
The "Got string" message looks like TLS encryption. Can it be that the client expects unencrypted HTTP headers while the server sends encrypted ones? In this case you would get a httparse error message just like you actually got. How exactly do you connect?