Expose API so jprq can be used as a library
Having jprq be usable as a command line utility is nice, but being able to create a tunnel programmatically would be useful.
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)
Looking at https://open.jprq.io/
yields

args I've used:
{'port': 5000, 'host': 'open.jprq.io', 'subdomain': None, 'version': '1.4.1'}
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
Hello,
Thanks for reporting this issue. It was due to an expired SSL certificate.
The certificate has been updated, JPRQ is now operational.
@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