1

I am looking for a method to write a simple proxy in flask for ttyd which is an open-source web terminal(https://github.com/tsl0922/ttyd). The most immediate way is to read client request and relay to ttyd server. However, it fails when the websocket is connecting. My view function is as follows:

@app.route('/')
@app.route('/auth_token.js')
@app.route('/ws')
def ttyd():
    if request.path=='/ws':
        url = 'ws://192.168.123.172:7681' + request.path
    else:
        url = 'http://192.168.123.172:7681' + request.path
    method = request.method
    data = request.data or request.form or None
    cookies = request.cookies
    headers = request.headers
    with closing(
            requests.request(method, url, headers=headers, data=data, cookies=cookies)
    ) as r:
        resp_headers = []
        for name, value in r.headers.items():
            resp_headers.append((name, value))
   return Response(r, status=r.status_code, headers=resp_headers)

As you can see, the view function will handle 3 url requests, the first two succeed with status code 200, the third fails with status code 500. The error code in server side is as follows: requests.exceptions.InvalidSchema: No connection adapters were found for 'ws://192.168.123.172:7681/ws'

I also check the network in two cases(with/without proxy). The picture 'without proxy' means direct type 'http://192.168.123.172:7681', it succeeds. The picture 'with proxy' means access ttyd server with flask proxy, it fails.

Without proxy enter image description here

With proxy enter image description here

Since I am new to flask and websocket, I am confused about the result. The sHTTPe flask proxy can handle any other http request(e.g. access google.com) but fails in WebSocket connection.

Thank you for telling me why and how can I fix it?

Dumi
  • 1,414
  • 4
  • 21
  • 41

1 Answers1

2

According to Websockets in Flask there is a flask-sockets project at https://github.com/heroku-python/flask-sockets to serve a websocket-endpoint in flask. To make the backend websocket connection to the server you can't use requests but websocket-client, see How do I format a websocket request?.

When I had this problem I solved it using the autobahn-python project, see https://github.com/arska/stringreplacingwebsocketproxy/

Cheers, Aarno