jprq icon indicating copy to clipboard operation
jprq copied to clipboard

Expose API so jprq can be used as a library

Open ZenaMel opened this issue 4 years ago • 6 comments

Having jprq be usable as a command line utility is nice, but being able to create a tunnel programmatically would be useful.

ZenaMel avatar Sep 23 '21 20:09 ZenaMel

I attempted to do this by modifying jprq.jprq.main

Before:
import argparse
import asyncio
from getpass import getuser
from .username import randomize
from .tunnel import open_tunnel
from . import __version__


def main():
    parser = argparse.ArgumentParser(description='Live And HTTPS Localhost')
    parser.add_argument('port', type=int, help='Port number of the local server')
    parser.add_argument('--host', type=str, help='Host of the remote server', default='open.jprq.io')
    parser.add_argument('-s', '--subdomain', type=str, help='Sub-domain')
    parser.add_argument('-v', '--version', action="version",version=__version__, help='Version number of jprq')

    args = parser.parse_args()

    username = args.subdomain or randomize(getuser())

    loop = asyncio.get_event_loop()

    print(f"\n\033[1;35mjprq : {__version__}\033[00m \033[34m{'Press Ctrl+C to quit.':>60}\n")

    try:
        loop.run_until_complete(
            open_tunnel(
                ws_uri=f'wss://{args.host}/_ws/?username={username}&port={args.port}&version={__version__}',
                http_uri=f'http://127.0.0.1:{args.port}',
            )
        )
    except KeyboardInterrupt:
        print("\n\033[31mjprq tunnel closed\033[00m")
After:
import argparse
import asyncio
from getpass import getuser
from .username import randomize
from .tunnel import open_tunnel
from . import __version__


def main():

    args = argparse.Namespace(port=5000, host='open.jprq.io', subdomain=None, version='1.4.1')

    username = args.subdomain or randomize(getuser())

    loop = asyncio.get_event_loop()

    print(f"\n\033[1;35mjprq : {__version__}\033[00m \033[34m{'Press Ctrl+C to quit.':>60}\n")

    try:
        loop.run_until_complete(
            open_tunnel(
                ws_uri=f'wss://{args.host}/_ws/?username={username}&port={args.port}&version={__version__}',
                http_uri=f'http://127.0.0.1:{args.port}',
            )
        )
    except KeyboardInterrupt:
        print("\n\033[31mjprq tunnel closed\033[00m")

But I end up with an SSL error:

Error:
...
  File "C:\Program Files\Python38\lib\ssl.py", line 944, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:1124)

ZenaMel avatar Sep 23 '21 23:09 ZenaMel

Looking at https://open.jprq.io/

yields

image

ZenaMel avatar Sep 23 '21 23:09 ZenaMel

args I've used:

{'port': 5000, 'host': 'open.jprq.io', 'subdomain': None, 'version': '1.4.1'}

ZenaMel avatar Sep 23 '21 23:09 ZenaMel

I've tried using a ssl._create_unverified_context() as the SSL context because of this but that yields a HTTP 502 error.

websockets.exceptions.InvalidStatusCode: server rejected WebSocket connection: HTTP 502

ZenaMel avatar Sep 23 '21 23:09 ZenaMel

Hello,

Thanks for reporting this issue. It was due to an expired SSL certificate.

The certificate has been updated, JPRQ is now operational.

azimjohn avatar Sep 27 '21 07:09 azimjohn

@azimjohn The problem still stands on exposing the jprq tunnel programmatically. With the above code changes I get the following error:

websockets.exceptions.InvalidStatusCode: server rejected WebSocket connection: HTTP 502

ZenaMel avatar Sep 29 '21 04:09 ZenaMel