diff --git a/CHANGELOG.md b/CHANGELOG.md
index fda088e..0d309bd 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 1.1.0:
+
+- Add `app_protocol(string)` to http and labeled listener builders, and `app_protocol: string` as a `ngrok.forward()` argument. Setting this to "http2" will enable HTTP/2 support to the backend application.
+
## 1.0.0
- Add policy support to Listener builders and `ngrok.forward`
diff --git a/Cargo.toml b/Cargo.toml
index d2b60a9..43e61ae 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,7 +1,7 @@
[package]
edition = "2021"
name = "ngrok-python"
-version = "1.0.0"
+version = "1.1.0"
description = "The ngrok Agent SDK for Python"
[lib]
diff --git a/docs/.doctrees/environment.pickle b/docs/.doctrees/environment.pickle
index 8c48b8c..8b4966a 100644
Binary files a/docs/.doctrees/environment.pickle and b/docs/.doctrees/environment.pickle differ
diff --git a/docs/.doctrees/http_listener_builder.doctree b/docs/.doctrees/http_listener_builder.doctree
index 4e4379a..86c5f60 100644
Binary files a/docs/.doctrees/http_listener_builder.doctree and b/docs/.doctrees/http_listener_builder.doctree differ
diff --git a/docs/.doctrees/index.doctree b/docs/.doctrees/index.doctree
index 963408e..e725cbe 100644
Binary files a/docs/.doctrees/index.doctree and b/docs/.doctrees/index.doctree differ
diff --git a/docs/.doctrees/labeled_listener_builder.doctree b/docs/.doctrees/labeled_listener_builder.doctree
index 6486cfd..d7152bf 100644
Binary files a/docs/.doctrees/labeled_listener_builder.doctree and b/docs/.doctrees/labeled_listener_builder.doctree differ
diff --git a/docs/genindex.html b/docs/genindex.html
index aef76a5..f6636ea 100644
--- a/docs/genindex.html
+++ b/docs/genindex.html
@@ -218,10 +218,16 @@
A
(ngrok.TlsListenerBuilder method)
+ allow_user_agent() (ngrok.HttpListenerBuilder method)
+
- - allow_user_agent() (ngrok.HttpListenerBuilder method)
+
- app_protocol() (ngrok.HttpListenerBuilder method)
+
+
- authtoken() (ngrok.SessionBuilder method)
- authtoken_from_env() (ngrok.SessionBuilder method)
diff --git a/docs/http_listener_builder.html b/docs/http_listener_builder.html
index aeaca85..a755a45 100644
--- a/docs/http_listener_builder.html
+++ b/docs/http_listener_builder.html
@@ -228,6 +228,12 @@
See User Agent Filter in the ngrok docs for additional details.
+
+-
+app_protocol(app_protocol)
+The L7 protocol to use for this edge: “http1” or “http2”.
+
+
-
basic_auth(username, password)
@@ -505,6 +511,7 @@
HttpListenerBuilder
Gunicorn
+Hypercorn
Streamlit
Tornado
Uvicorn
@@ -631,6 +633,35 @@ Development: Getting Started
+
+HTTP2
+The examples include a minimal hypercorn HTTP/2 example if you run make http2 . You can curl the endpoint logged with INFO:ngrok.listener:Created and verify the HTTP/2 response from hypercorn .
+curl --http2 -v https://<YOUR_LISTENER_URL>
+* Trying <YOUR_IP>:443...
+* Connected to a6278d6c07ce.ngrok.app (<YOUR_IP>) port 443 (#0)
+* ALPN, offering h2
+* ALPN, offering http/1.1
+...
+> GET / HTTP/2
+> Host: a6278d6c07ce.ngrok.app
+> user-agent: curl/7.81.0
+> accept: */*
+>
+...
+< HTTP/2 200
+< content-type: text/plain
+< date: Fri, 01 Mar 2024 18:50:23 GMT
+< ngrok-agent-ips: <YOUR_AGENT_IP>
+< ngrok-trace-id: ed038ace04876818149cf0769bd43e38
+< server: hypercorn-h2
+<
+* TLSv1.2 (IN), TLS header, Supplemental data (23):
+* TLSv1.2 (IN), TLS header, Supplemental data (23):
+* Connection #0 to host <YOUR_LISTENER_URL> left intact
+hello
+
+
+
API Reference
diff --git a/docs/labeled_listener_builder.html b/docs/labeled_listener_builder.html
index 67f3ce0..5cf85fc 100644
--- a/docs/labeled_listener_builder.html
+++ b/docs/labeled_listener_builder.html
@@ -211,6 +211,12 @@
-
class ngrok.LabeledListenerBuilder
A labeled ngrok listener.
+
+-
+app_protocol(app_protocol)
+Set the L7 application protocol used for this listener, i.e. “http1” or “http2” (default “http1”)
+
+
-
label(label, value)
@@ -328,6 +334,7 @@
- Labeled Listener Builder
LabeledListenerBuilder
+LabeledListenerBuilder.app_protocol()
LabeledListenerBuilder.label()
LabeledListenerBuilder.listen()
LabeledListenerBuilder.listen_and_forward()
diff --git a/docs/objects.inv b/docs/objects.inv
index b1175d9..e260f47 100644
Binary files a/docs/objects.inv and b/docs/objects.inv differ
diff --git a/docs/searchindex.js b/docs/searchindex.js
index bcadf4c..7ffa721 100644
--- a/docs/searchindex.js
+++ b/docs/searchindex.js
@@ -1 +1 @@
-Search.setIndex({"docnames": ["http_listener_builder", "index", "labeled_listener_builder", "listener", "module", "session", "session_builder", "tcp_listener_builder", "tls_listener_builder"], "filenames": ["http_listener_builder.rst", "index.rst", "labeled_listener_builder.rst", "listener.rst", "module.rst", "session.rst", "session_builder.rst", "tcp_listener_builder.rst", "tls_listener_builder.rst"], "titles": ["HTTP Listener Builder", "Python SDK for ngrok", "Labeled Listener Builder", "Listener", "Ngrok Module", "Session", "Session Builder", "TCP Listener Builder", "TLS Listener Builder"], "terms": {"The": [0, 1, 2, 3, 4, 5, 6, 7, 8], "ngrok": [0, 2, 3, 5, 6, 7, 8], "agent": [0, 2, 3, 4, 5, 6, 7, 8], "sdk": [0, 2, 3, 4, 5, 6, 7, 8], "python": [0, 2, 3, 4, 5, 6, 7, 8], "class": [0, 1, 2, 3, 5, 6, 7, 8], "httplistenerbuild": [0, 3], "an": [0, 1, 3, 4, 5, 6, 7, 8], "back": [0, 1, 3, 5, 7, 8], "endpoint": [0, 3, 5, 7, 8], "allow_cidr": [0, 1, 7, 8], "cidr": [0, 7, 8], "restrict": [0, 7, 8], "place": [0, 7, 8], "origin": [0, 7, 8], "incom": [0, 3, 7, 8], "connect": [0, 2, 3, 4, 6, 7, 8], "edg": [0, 1, 7, 8], "onli": [0, 6, 7, 8], "allow": [0, 1, 6, 7, 8], "rang": [0, 7, 8], "call": [0, 1, 3, 6, 7, 8], "multipl": [0, 7, 8], "time": [0, 6, 7, 8], "add": [0, 1, 2, 6, 7, 8], "addit": [0, 1, 2, 6, 7, 8], "basic_auth": [0, 1], "usernam": 0, "password": 0, "credenti": 0, "basic": [0, 1], "authent": [0, 6, 8], "If": [0, 1, 6, 8], "i": [0, 1, 3, 4, 6], "disabl": 0, "circuit_break": [0, 1], "reject": 0, "request": [0, 1, 6, 7, 8], "when": [0, 1, 6], "5xx": 0, "respons": [0, 1, 6], "exce": 0, "thi": [0, 1, 2, 3, 4, 5, 6, 7, 8], "ratio": 0, "0": [0, 1, 3], "compress": [0, 1], "enabl": [0, 1], "gzip": 0, "deny_cidr": [0, 1, 7, 8], "deni": [0, 7, 8], "domain": [0, 1, 3, 8], "forwards_to": [0, 3, 7, 8], "backend": [0, 7, 8], "metadata": [0, 1, 2, 3, 6, 7, 8], "viewabl": [0, 2, 7, 8], "via": [0, 1, 2, 6, 7, 8], "dashboard": [0, 1, 3, 6, 7, 8], "api": [0, 2, 3, 6, 7, 8], "ha": [0, 7, 8], "bear": [0, 7, 8], "behavior": [0, 6, 7, 8], "begin": [0, 2, 7, 8], "new": [0, 2, 6, 7, 8], "listen_and_forward": [0, 2, 3, 7, 8], "to_url": [0, 2, 7, 8], "forward": [0, 1, 2, 3, 4, 7, 8], "them": [0, 1, 2, 7, 8], "given": [0, 2, 4, 5, 6, 7, 8], "url": [0, 1, 2, 3, 4, 7, 8], "listen_and_serv": [0, 2, 3, 7, 8], "server": [0, 1, 2, 4, 7, 8], "paramet": [0, 2, 4, 6, 7, 8], "httpserver": [0, 2, 4, 7, 8], "none": [0, 2, 4, 7, 8], "link": [0, 2, 4, 7, 8], "return": [0, 1, 2, 3, 4, 6, 7, 8], "A": [0, 1, 2, 4, 7, 8], "task": [0, 2, 3, 4, 6, 7, 8], "await": [0, 1, 2, 3, 4, 7, 8], "type": [0, 1, 2, 4, 6, 7, 8], "specif": [0, 2, 6, 7, 8], "opaqu": [0, 2, 6, 7, 8], "mutual_tlsca": [0, 8], "certif": [0, 1, 6, 8], "us": [0, 1, 2, 3, 4, 6, 7, 8], "client": [0, 6, 8], "oauth": [0, 1], "allow_email": 0, "allow_domain": 0, "scope": [0, 1], "configur": [0, 6, 7, 8], "provid": [0, 1, 6], "str": [0, 4, 7, 8], "name": [0, 1, 4], "list": [0, 5], "email": [0, 1], "address": [0, 1, 2, 3, 4, 6, 7, 8], "oidc": 0, "client_id": 0, "client_secret": 0, "issuer_url": 0, "issuer": 0, "id": [0, 1, 3, 5], "secret": [0, 1], "proxy_proto": [0, 1, 7, 8], "version": [0, 1, 3, 6, 7, 8], "proxi": [0, 6, 7, 8], "protocol": [0, 3, 4, 7, 8], "1": [0, 1, 2, 4, 7, 8], "2": [0, 1, 7, 8], "remove_request_head": 0, "remov": [0, 4], "header": [0, 1], "from": [0, 1, 4, 6], "remove_response_head": 0, "request_head": 0, "valu": [0, 2, 3, 6, 8], "all": [0, 4], "response_head": 0, "come": [0, 1], "scheme": [0, 1], "should": [0, 1], "default": [0, 1, 4], "webhook_verif": 0, "webhookverif": 0, "websocket_tcp_convers": 0, "convert": 0, "websocket": 0, "tcp": [0, 1, 2, 3, 4, 5, 8], "like": [0, 1, 4, 6], "stream": 0, "note": 1, "beta": [], "qualiti": [], "softwar": [], "interfac": 1, "mai": [1, 6], "chang": 1, "without": 1, "warn": 4, "global": 1, "distribut": 1, "revers": [], "commonli": [], "quickli": 1, "get": 4, "public": 1, "servic": [1, 6], "run": [1, 4], "insid": 6, "privat": [], "network": 6, "your": [1, 6], "local": [], "laptop": [], "usual": [], "deploi": [], "commun": [], "cloud": [], "librari": 6, "form": [], "suitabl": [], "integr": [], "directli": 1, "applic": [1, 6], "you": [0, 1, 3, 6, 7, 8], "build": [1, 5], "separ": [], "process": [1, 6], "manag": 1, "re": 1, "look": 1, "previou": [], "download": [], "project": 1, "": [1, 3, 4, 5], "over": 1, "here": 1, "guid": 1, "ar": [1, 6], "includ": [], "instal": [], "packag": [], "pypi": 1, "pip": 1, "m": 1, "after": [1, 6], "ve": [], "ll": 1, "need": 1, "authtoken": [1, 6], "retriev": [1, 5], "one": [1, 4, 6], "page": 1, "follow": [1, 6], "block": 6, "method": [1, 3], "expos": [], "port": [1, 4], "9000": 1, "localhost": [0, 1, 2, 4, 7, 8], "import": 1, "authtoken_from_env": [1, 6], "true": [1, 4], "print": 1, "f": 1, "ingress": [1, 4, 6], "establish": [1, 4, 6], "can": [0, 1, 2, 3, 4, 6, 7, 8], "find": [1, 6], "directori": [1, 4], "To": [0, 1, 3, 7, 8], "most": [1, 6], "featur": 1, "obtain": 1, "sign": 1, "up": 1, "free": 1, "com": [1, 6], "onc": 1, "have": [0, 1, 8], "copi": 1, "sever": 1, "wai": [1, 6], "set": [0, 1, 3, 4, 8], "ngrok_authtoken": [1, 6], "environ": [1, 4, 6], "variabl": [1, 4, 6], "pass": [1, 4, 6], "Or": 1, "token": 1, "set_auth_token": 1, "easiest": 1, "start": [3, 5], "specifi": 1, "asynchron": 1, "runtim": 1, "promis": 1, "resolv": 1, "object": [1, 4], "argument": 1, "http": [1, 2, 4, 5, 7, 8], "80": [1, 4], "number": 1, "4242": 1, "host": [1, 4], "string": [1, 3, 4, 6], "option": [0, 1, 4, 6], "custom": [0, 1, 6, 8], "8080": [0, 1, 2, 4, 7, 8], "online1lin": 1, "oauth_provid": 1, "googl": 1, "oauth_allow_domain": 1, "second": 1, "which": [1, 6], "creat": [1, 4, 6], "25565": 1, "sinc": [1, 3], "kwarg": 1, "also": [1, 3, 4, 6], "oper": [1, 6], "dictionari": 1, "response_header_add": 1, "x": 1, "awesom": 1, "ye": 1, "close": [1, 3, 5], "complet": 1, "omit": 1, "shut": [1, 4], "down": [1, 4], "stop": [1, 6], "longer": 1, "current": [1, 6], "non": [1, 5], "get_listen": [1, 5], "show": 1, "possibl": 1, "item": 1, "addr": [1, 3, 4, 6], "session_metadata": 1, "onlin": 1, "One": 1, "line": 1, "ip_restriction_allow_cidr": [], "ip_restriction_deny_cidr": [], "10": [1, 3], "32": 1, "mutual_tls_ca": 1, "load_fil": 1, "ca": 1, "crt": 1, "oauth_allow_email": 1, "oauth_scop": 1, "oidc_issuer_url": 1, "oidc_client_id": 1, "oidc_client_secret": 1, "oidc_allow_domain": 1, "oidc_allow_email": 1, "oidc_scop": 1, "request_header_remov": 1, "req": 1, "nope": 1, "response_header_remov": 1, "request_header_add": 1, "yup": 1, "verify_webhook_provid": 1, "twilio": 1, "verify_webhook_secret": 1, "asdf": 1, "websocket_tcp_convert": 1, "prefix": 1, "command": 1, "web": 1, "either": [0, 1, 2, 3, 7, 8], "ani": [0, 1, 8], "automat": [0, 1, 3, 7, 8], "There": [], "mani": [], "instanc": 1, "ad": 1, "auth": 1, "introduc": 1, "mysit": 1, "1234": 1, "ud": 1, "tmp": [1, 3], "sock": [0, 1, 2, 3, 4, 7, 8], "well": [1, 6], "bob": 1, "k": 1, "worker": 1, "uvicornwork": 1, "webhook": [0, 1], "verif": [0, 1], "s3cr3t": 1, "bind": 1, "aiohttp": 1, "aw": 1, "app": 1, "see": [0, 1, 2, 4, 6, 7, 8], "serverless": [], "repositori": [], "make": 1, "necessari": [], "instead": [1, 3, 6], "nodej": [], "singl": 1, "file": [0, 1, 2, 3, 4, 7, 8], "modifi": 1, "py": 1, "discuss": [], "abov": 1, "flask": 1, "streamlit": 1, "tornado": 1, "gradio": 1, "cli": 1, "share": [], "openplayground": 1, "llm": [], "playground": [], "gpt4all": 1, "l": [], "snoozi": [], "13b": [], "model": [], "frontend": [], "minim": 1, "label": [1, 3, 4, 5], "As": 1, "valid": [0, 1, 6, 8], "filepath": 1, "ssl_cert_fil": 1, "fall": 1, "o": 1, "trust": 1, "so": 1, "now": 1, "do": [1, 6], "127": 1, "3000": 1, "cert": 1, "self": 1, "befor": [1, 6], "path": [0, 1, 2, 3, 4, 7, 8], "choos": [1, 6], "view": 1, "123": 1, "For": [1, 3, 7], "control": 1, "async": [1, 4], "def": 1, "create_listen": 1, "ngroksessionbuild": 1, "http_endpoint": [1, 5], "pre": 1, "built": 1, "binari": 1, "i686": 1, "x64": 1, "aarch64": 1, "arm": 1, "window": [1, 4], "maco": 1, "linux": [0, 1, 2, 3, 7, 8], "musl": 1, "freebsd": 1, "rust": 1, "open": 1, "sourc": 1, "other": [1, 6], "next": 1, "releas": 1, "ring": 1, "won": 1, "t": 1, "accept": 1, "bsd": 1, "flavor": 1, "reli": 1, "pyo3": 1, "excel": 1, "system": [1, 4], "eas": 1, "develop": [], "plugin": 1, "thank": 1, "openiothub": 1, "hand": 1, "track": 1, "md": 1, "under": 1, "apach": 1, "www": [], "org": [], "mit": 1, "opensourc": [], "unless": 1, "explicitli": [1, 3], "state": 1, "otherwis": [1, 4], "intention": 1, "submit": 1, "inclus": 1, "defin": [0, 1], "shall": 1, "dual": 1, "term": 1, "condit": 1, "index": 1, "search": 1, "labeledlistenerbuild": 2, "pair": 2, "rpc": 3, "must": [3, 6], "ed": 3, "It": [3, 6], "equival": 3, "session": [3, 4, 7], "close_listen": [3, 5], "socket": [0, 2, 3, 4, 7, 8], "darwin": [0, 2, 3, 7, 8], "unix": [0, 2, 3, 4, 7, 8], "e": [3, 4, 6], "g": [3, 4, 6], "On": 0, "pipe": 4, "an_ngrok_pip": [], "human": 3, "readabl": [3, 6], "present": 3, "tcplistenerbuild": [3, 7], "etc": 3, "uniqu": [3, 6], "join": 3, "wait": [3, 6], "exit": [3, 4, 6], "wa": 3, "arbitrari": 3, "proto": [1, 3, 4], "listen": [4, 5], "int": 4, "traffic": [0, 2, 4, 7, 8], "integ": 4, "tl": [0, 4, 5, 6], "dict": 4, "loop": 4, "result": [4, 6], "disconnect": [4, 6], "fd": 4, "its": [4, 6], "descriptor": 4, "getsocknam": 4, "kill": 4, "server_address": 4, "attribut": 4, "previous": [0, 4, 8], "said": 4, "log_level": 4, "level": 4, "info": 4, "log": 4, "bridg": 4, "error": [4, 6], "debug": 4, "trace": 4, "pipe_nam": 4, "temp": 4, "program": 4, "werkzeug_develop": 4, "werkzeug_server_fd": 4, "werkzeug_run_main": 4, "engag": 4, "werkzeug": 4, "particular": 5, "order": 5, "labeled_listen": 5, "tcp_endpoint": 5, "tls_endpoint": 5, "sessionbuild": 6, "exist": 6, "doc": [0, 1, 2, 6, 7, 8], "detail": [0, 2, 6, 7, 8], "shortcut": 6, "ca_cert": 6, "cert_byt": 6, "while": 6, "through": [1, 6], "man": 6, "middl": 6, "deep": 6, "packet": 6, "inspect": 6, "byte": 6, "overrid": 6, "server_addr": 6, "roughli": 6, "correspond": 6, "root_ca": 6, "client_info": 6, "client_typ": 6, "comment": 6, "ellipsi": 6, "inform": 6, "consum": 6, "crate": 6, "identifi": 6, "themselv": 6, "entri": 6, "user": [0, 6], "field": 6, "signific": 6, "first": 6, "posit": 6, "rfc": 6, "7230": 6, "occur": 6, "attempt": 6, "handle_disconnect": 6, "handler": 6, "function": 6, "In": 6, "event": 6, "disrupt": 6, "each": 6, "reconnect": 6, "exampl": [0, 2, 3, 6, 7, 8], "443": 6, "messag": 6, "rais": 6, "except": 6, "caus": 6, "throw": 6, "uncaught": 6, "handle_heartbeat": 6, "whenev": 6, "heartbeat": 6, "receiv": 6, "latenc": 6, "millisecond": 6, "eventu": 6, "dy": 6, "handle_restart_command": 6, "updat": [1, 6], "interpret": 6, "callback": 6, "restart": 6, "entir": [1, 6], "visibl": 6, "out": [1, 6], "std": 6, "handle_stop_command": 6, "termin": [1, 6, 8], "handle_update_command": 6, "itself": 6, "invok": 6, "some": 6, "heartbeat_interv": 6, "how": 6, "often": 6, "send": 6, "check": [0, 1, 6], "live": 6, "heartbeat_toler": 6, "durat": 6, "assum": 6, "dead": 6, "machin": 6, "made": 6, "avail": [1, 6], "resourc": 6, "we": 6, "suggest": 6, "encod": 6, "structur": 6, "format": [6, 8], "json": 6, "metdata": 6, "dial": 6, "remote_addr": 7, "tlslistenerbuild": 8, "cert_pem": 8, "key_pem": 8, "kei": [1, 8], "pem": [1, 8], "circuit": 0, "breaker": 0, "ip": [0, 7, 8], "mutual": [0, 8], "openid": 0, "_": [], "hostnam": [0, 8], "regist": [0, 8], "requir": [0, 1, 8], "dn": [0, 8], "cname": [0, 8], "These": [3, 7], "reserv": 7, "across": 7, "io": 7, "21746": 7, "stabl": 1, "diffus": 1, "webui": 1, "automatic1111": 1, "text": 1, "gener": 1, "oobabooga": 1, "extens": 1, "allow_user_ag": [0, 1], "regex": 0, "regular": 0, "express": 0, "match": 0, "filter": 0, "modul": 0, "against": 0, "rule": 0, "deny_user_ag": [0, 1], "mozilla": 1, "curl": 1, "oauth_client_id": 1, "oauth_client_secret": 1, "offici": 1, "secur": 1, "product": 1, "readi": 1, "code": 1, "gatewai": 1, "export": 1, "output": 1, "consol": 1, "That": 1, "more": 1, "found": 1, "With": 1, "bundl": 1, "django": 1, "flag": 1, "usag": 1, "our": 1, "read": 1, "about": 1, "blog": 1, "issu": 1, "pull": 1, "slack": 1, "u": 1, "twitter": 1, "ngrokhq": 1, "subscrib": 1, "youtub": 1, "channel": 1, "between": 1, "work": 1, "192": [0, 2, 4, 7, 8], "168": [0, 2, 4, 7, 8], "100": [0, 2, 4, 7, 8], "8443": [0, 2, 4, 7, 8], "deprec": 3, "builder": 3, "forwrads_to": [], "author": 1, "alia": 4, "full": 4, "15555": [], "edghts_2g": 1, "along": 1, "polici": [0, 1, 7, 8], "policy_config": [0, 7, 8], "param": [0, 7, 8], "attach": [0, 7, 8], "policy_json": 1, "prerequisit": 1, "cargo": 1, "toml": 1, "latest": 1, "version_her": 1, "src": 1, "rust_files_her": 1, "r": 1, "happi": 1, "test": 1, "suit": 1, "your_authtoken_her": 1, "individu": 1, "test_class": 1, "name_of_test": 1, "makefil": 1}, "objects": {"": [[8, 0, 0, "-", "ngrok"]], "ngrok": [[0, 1, 1, "", "HttpListenerBuilder"], [2, 1, 1, "", "LabeledListenerBuilder"], [3, 1, 1, "", "Listener"], [5, 1, 1, "", "Session"], [6, 1, 1, "", "SessionBuilder"], [7, 1, 1, "", "TcpListenerBuilder"], [8, 1, 1, "", "TlsListenerBuilder"], [4, 3, 1, "", "connect"], [4, 3, 1, "", "default"], [4, 3, 1, "", "disconnect"], [4, 3, 1, "", "fd"], [4, 3, 1, "", "forward"], [4, 3, 1, "", "getsockname"], [4, 3, 1, "", "kill"], [4, 3, 1, "", "listen"], [4, 3, 1, "", "log_level"], [4, 3, 1, "", "pipe_name"], [4, 3, 1, "", "werkzeug_develop"]], "ngrok.HttpListenerBuilder": [[0, 2, 1, "", "allow_cidr"], [0, 2, 1, "", "allow_user_agent"], [0, 2, 1, "", "basic_auth"], [0, 2, 1, "", "circuit_breaker"], [0, 2, 1, "", "compression"], [0, 2, 1, "", "deny_cidr"], [0, 2, 1, "", "deny_user_agent"], [0, 2, 1, "", "domain"], [0, 2, 1, "", "forwards_to"], [0, 2, 1, "", "listen"], [0, 2, 1, "", "listen_and_forward"], [0, 2, 1, "", "listen_and_serve"], [0, 2, 1, "", "metadata"], [0, 2, 1, "", "mutual_tlsca"], [0, 2, 1, "", "oauth"], [0, 2, 1, "", "oidc"], [0, 2, 1, "", "policy"], [0, 2, 1, "", "proxy_proto"], [0, 2, 1, "", "remove_request_header"], [0, 2, 1, "", "remove_response_header"], [0, 2, 1, "", "request_header"], [0, 2, 1, "", "response_header"], [0, 2, 1, "", "scheme"], [0, 2, 1, "", "webhook_verification"], [0, 2, 1, "", "websocket_tcp_conversion"]], "ngrok.LabeledListenerBuilder": [[2, 2, 1, "", "label"], [2, 2, 1, "", "listen"], [2, 2, 1, "", "listen_and_forward"], [2, 2, 1, "", "listen_and_serve"], [2, 2, 1, "", "metadata"]], "ngrok.Listener": [[3, 2, 1, "", "close"], [3, 2, 1, "", "forward"], [3, 2, 1, "", "forwards_to"], [3, 2, 1, "", "id"], [3, 2, 1, "", "join"], [3, 2, 1, "", "labels"], [3, 2, 1, "", "metadata"], [3, 2, 1, "", "proto"], [3, 2, 1, "", "url"]], "ngrok.Session": [[5, 2, 1, "", "close"], [5, 2, 1, "", "close_listener"], [5, 2, 1, "", "get_listeners"], [5, 2, 1, "", "http_endpoint"], [5, 2, 1, "", "labeled_listener"], [5, 2, 1, "", "tcp_endpoint"], [5, 2, 1, "", "tls_endpoint"]], "ngrok.SessionBuilder": [[6, 2, 1, "", "authtoken"], [6, 2, 1, "", "authtoken_from_env"], [6, 2, 1, "", "ca_cert"], [6, 2, 1, "", "client_info"], [6, 2, 1, "", "connect"], [6, 2, 1, "", "handle_disconnection"], [6, 2, 1, "", "handle_heartbeat"], [6, 2, 1, "", "handle_restart_command"], [6, 2, 1, "", "handle_stop_command"], [6, 2, 1, "", "handle_update_command"], [6, 2, 1, "", "heartbeat_interval"], [6, 2, 1, "", "heartbeat_tolerance"], [6, 2, 1, "", "metadata"], [6, 2, 1, "", "server_addr"]], "ngrok.TcpListenerBuilder": [[7, 2, 1, "", "allow_cidr"], [7, 2, 1, "", "deny_cidr"], [7, 2, 1, "", "forwards_to"], [7, 2, 1, "", "listen"], [7, 2, 1, "", "listen_and_forward"], [7, 2, 1, "", "listen_and_serve"], [7, 2, 1, "", "metadata"], [7, 2, 1, "", "policy"], [7, 2, 1, "", "proxy_proto"], [7, 2, 1, "", "remote_addr"]], "ngrok.TlsListenerBuilder": [[8, 2, 1, "", "allow_cidr"], [8, 2, 1, "", "deny_cidr"], [8, 2, 1, "", "domain"], [8, 2, 1, "", "forwards_to"], [8, 2, 1, "", "listen"], [8, 2, 1, "", "listen_and_forward"], [8, 2, 1, "", "listen_and_serve"], [8, 2, 1, "", "metadata"], [8, 2, 1, "", "mutual_tlsca"], [8, 2, 1, "", "policy"], [8, 2, 1, "", "proxy_proto"], [8, 2, 1, "", "termination"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:method", "3": "py:function"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "method", "Python method"], "3": ["py", "function", "Python function"]}, "titleterms": {"http": 0, "listen": [0, 1, 2, 3, 7, 8], "builder": [0, 1, 2, 6, 7, 8], "The": [], "ngrok": [1, 4], "agent": [], "sdk": 1, "python": 1, "document": 1, "quickstart": 1, "author": [], "connect": 1, "disconnect": 1, "list": 1, "full": 1, "configur": 1, "asgi": 1, "runner": 1, "uvicorn": 1, "gunicorn": 1, "django": [], "more": [], "With": [], "No": [], "code": [], "exampl": 1, "framework": 1, "machin": 1, "learn": 1, "type": [], "tl": [1, 8], "backend": 1, "unix": 1, "socket": 1, "platform": 1, "support": 1, "depend": 1, "changelog": 1, "licens": 1, "contribut": 1, "api": 1, "refer": 1, "session": [1, 5, 6], "modul": [1, 4], "indic": 1, "tabl": 1, "label": 2, "tcp": 7, "instal": 1, "all": 1, "join": 1, "commun": 1, "authent": 1, "develop": 1, "get": 1, "start": 1}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 57}, "alltitles": {"HTTP Listener Builder": [[0, "module-ngrok"]], "Python SDK for ngrok": [[1, "python-sdk-for-ngrok"]], "Installation": [[1, "installation"]], "Quickstart": [[1, "quickstart"]], "Documentation": [[1, "documentation"]], "Authentication": [[1, "authentication"]], "Connection": [[1, "connection"]], "Disconnection": [[1, "disconnection"]], "List all Listeners": [[1, "list-all-listeners"]], "TLS Backends": [[1, "tls-backends"]], "Unix Sockets": [[1, "unix-sockets"]], "Builders": [[1, "builders"]], "Full Configuration": [[1, "full-configuration"]], "ASGI Runner": [[1, "asgi-runner"]], "Uvicorn": [[1, "uvicorn"]], "Gunicorn": [[1, "gunicorn"]], "Examples": [[1, "examples"]], "Listeners": [[1, "listeners"]], "Frameworks": [[1, "frameworks"]], "Machine Learning": [[1, "machine-learning"]], "Platform Support": [[1, "platform-support"]], "Dependencies": [[1, "dependencies"]], "Changelog": [[1, "changelog"]], "Join the ngrok Community": [[1, "join-the-ngrok-community"]], "License": [[1, "license"]], "Contributions": [[1, "contributions"]], "Development: Getting Started": [[1, "development-getting-started"]], "API Reference": [[1, "api-reference"]], "Listener and Sessions:": [[1, null]], "Listener Builders:": [[1, null]], "Module:": [[1, null]], "Indices and tables": [[1, "indices-and-tables"]], "Labeled Listener Builder": [[2, "module-ngrok"]], "Listener": [[3, "module-ngrok"]], "Ngrok Module": [[4, "module-ngrok"]], "Session": [[5, "module-ngrok"]], "Session Builder": [[6, "module-ngrok"]], "TCP Listener Builder": [[7, "module-ngrok"]], "TLS Listener Builder": [[8, "module-ngrok"]]}, "indexentries": {"httplistenerbuilder (class in ngrok)": [[0, "ngrok.HttpListenerBuilder"]], "allow_cidr() (ngrok.httplistenerbuilder method)": [[0, "ngrok.HttpListenerBuilder.allow_cidr"]], "allow_user_agent() (ngrok.httplistenerbuilder method)": [[0, "ngrok.HttpListenerBuilder.allow_user_agent"]], "basic_auth() (ngrok.httplistenerbuilder method)": [[0, "ngrok.HttpListenerBuilder.basic_auth"]], "circuit_breaker() (ngrok.httplistenerbuilder method)": [[0, "ngrok.HttpListenerBuilder.circuit_breaker"]], "compression() (ngrok.httplistenerbuilder method)": [[0, "ngrok.HttpListenerBuilder.compression"]], "deny_cidr() (ngrok.httplistenerbuilder method)": [[0, "ngrok.HttpListenerBuilder.deny_cidr"]], "deny_user_agent() (ngrok.httplistenerbuilder method)": [[0, "ngrok.HttpListenerBuilder.deny_user_agent"]], "domain() (ngrok.httplistenerbuilder method)": [[0, "ngrok.HttpListenerBuilder.domain"]], "forwards_to() (ngrok.httplistenerbuilder method)": [[0, "ngrok.HttpListenerBuilder.forwards_to"]], "listen() (ngrok.httplistenerbuilder method)": [[0, "ngrok.HttpListenerBuilder.listen"]], "listen_and_forward() (ngrok.httplistenerbuilder method)": [[0, "ngrok.HttpListenerBuilder.listen_and_forward"]], "listen_and_serve() (ngrok.httplistenerbuilder method)": [[0, "ngrok.HttpListenerBuilder.listen_and_serve"]], "metadata() (ngrok.httplistenerbuilder method)": [[0, "ngrok.HttpListenerBuilder.metadata"]], "module": [[0, "module-ngrok"], [2, "module-ngrok"], [3, "module-ngrok"], [4, "module-ngrok"], [5, "module-ngrok"], [6, "module-ngrok"], [7, "module-ngrok"], [8, "module-ngrok"]], "mutual_tlsca() (ngrok.httplistenerbuilder method)": [[0, "ngrok.HttpListenerBuilder.mutual_tlsca"]], "ngrok": [[0, "module-ngrok"], [2, "module-ngrok"], [3, "module-ngrok"], [4, "module-ngrok"], [5, "module-ngrok"], [6, "module-ngrok"], [7, "module-ngrok"], [8, "module-ngrok"]], "oauth() (ngrok.httplistenerbuilder method)": [[0, "ngrok.HttpListenerBuilder.oauth"]], "oidc() (ngrok.httplistenerbuilder method)": [[0, "ngrok.HttpListenerBuilder.oidc"]], "policy() (ngrok.httplistenerbuilder method)": [[0, "ngrok.HttpListenerBuilder.policy"]], "proxy_proto() (ngrok.httplistenerbuilder method)": [[0, "ngrok.HttpListenerBuilder.proxy_proto"]], "remove_request_header() (ngrok.httplistenerbuilder method)": [[0, "ngrok.HttpListenerBuilder.remove_request_header"]], "remove_response_header() (ngrok.httplistenerbuilder method)": [[0, "ngrok.HttpListenerBuilder.remove_response_header"]], "request_header() (ngrok.httplistenerbuilder method)": [[0, "ngrok.HttpListenerBuilder.request_header"]], "response_header() (ngrok.httplistenerbuilder method)": [[0, "ngrok.HttpListenerBuilder.response_header"]], "scheme() (ngrok.httplistenerbuilder method)": [[0, "ngrok.HttpListenerBuilder.scheme"]], "webhook_verification() (ngrok.httplistenerbuilder method)": [[0, "ngrok.HttpListenerBuilder.webhook_verification"]], "websocket_tcp_conversion() (ngrok.httplistenerbuilder method)": [[0, "ngrok.HttpListenerBuilder.websocket_tcp_conversion"]], "labeledlistenerbuilder (class in ngrok)": [[2, "ngrok.LabeledListenerBuilder"]], "label() (ngrok.labeledlistenerbuilder method)": [[2, "ngrok.LabeledListenerBuilder.label"]], "listen() (ngrok.labeledlistenerbuilder method)": [[2, "ngrok.LabeledListenerBuilder.listen"]], "listen_and_forward() (ngrok.labeledlistenerbuilder method)": [[2, "ngrok.LabeledListenerBuilder.listen_and_forward"]], "listen_and_serve() (ngrok.labeledlistenerbuilder method)": [[2, "ngrok.LabeledListenerBuilder.listen_and_serve"]], "metadata() (ngrok.labeledlistenerbuilder method)": [[2, "ngrok.LabeledListenerBuilder.metadata"]], "listener (class in ngrok)": [[3, "ngrok.Listener"]], "close() (ngrok.listener method)": [[3, "ngrok.Listener.close"]], "forward() (ngrok.listener method)": [[3, "ngrok.Listener.forward"]], "forwards_to() (ngrok.listener method)": [[3, "ngrok.Listener.forwards_to"]], "id() (ngrok.listener method)": [[3, "ngrok.Listener.id"]], "join() (ngrok.listener method)": [[3, "ngrok.Listener.join"]], "labels() (ngrok.listener method)": [[3, "ngrok.Listener.labels"]], "metadata() (ngrok.listener method)": [[3, "ngrok.Listener.metadata"]], "proto() (ngrok.listener method)": [[3, "ngrok.Listener.proto"]], "url() (ngrok.listener method)": [[3, "ngrok.Listener.url"]], "connect() (in module ngrok)": [[4, "ngrok.connect"]], "default() (in module ngrok)": [[4, "ngrok.default"]], "disconnect() (in module ngrok)": [[4, "ngrok.disconnect"]], "fd() (in module ngrok)": [[4, "ngrok.fd"]], "forward() (in module ngrok)": [[4, "ngrok.forward"]], "getsockname() (in module ngrok)": [[4, "ngrok.getsockname"]], "kill() (in module ngrok)": [[4, "ngrok.kill"]], "listen() (in module ngrok)": [[4, "ngrok.listen"]], "log_level() (in module ngrok)": [[4, "ngrok.log_level"]], "pipe_name() (in module ngrok)": [[4, "ngrok.pipe_name"]], "werkzeug_develop() (in module ngrok)": [[4, "ngrok.werkzeug_develop"]], "session (class in ngrok)": [[5, "ngrok.Session"]], "close() (ngrok.session method)": [[5, "ngrok.Session.close"]], "close_listener() (ngrok.session method)": [[5, "ngrok.Session.close_listener"]], "get_listeners() (ngrok.session method)": [[5, "ngrok.Session.get_listeners"]], "http_endpoint() (ngrok.session method)": [[5, "ngrok.Session.http_endpoint"]], "labeled_listener() (ngrok.session method)": [[5, "ngrok.Session.labeled_listener"]], "tcp_endpoint() (ngrok.session method)": [[5, "ngrok.Session.tcp_endpoint"]], "tls_endpoint() (ngrok.session method)": [[5, "ngrok.Session.tls_endpoint"]], "sessionbuilder (class in ngrok)": [[6, "ngrok.SessionBuilder"]], "authtoken() (ngrok.sessionbuilder method)": [[6, "ngrok.SessionBuilder.authtoken"]], "authtoken_from_env() (ngrok.sessionbuilder method)": [[6, "ngrok.SessionBuilder.authtoken_from_env"]], "ca_cert() (ngrok.sessionbuilder method)": [[6, "ngrok.SessionBuilder.ca_cert"]], "client_info() (ngrok.sessionbuilder method)": [[6, "ngrok.SessionBuilder.client_info"]], "connect() (ngrok.sessionbuilder method)": [[6, "ngrok.SessionBuilder.connect"]], "handle_disconnection() (ngrok.sessionbuilder method)": [[6, "ngrok.SessionBuilder.handle_disconnection"]], "handle_heartbeat() (ngrok.sessionbuilder method)": [[6, "ngrok.SessionBuilder.handle_heartbeat"]], "handle_restart_command() (ngrok.sessionbuilder method)": [[6, "ngrok.SessionBuilder.handle_restart_command"]], "handle_stop_command() (ngrok.sessionbuilder method)": [[6, "ngrok.SessionBuilder.handle_stop_command"]], "handle_update_command() (ngrok.sessionbuilder method)": [[6, "ngrok.SessionBuilder.handle_update_command"]], "heartbeat_interval() (ngrok.sessionbuilder method)": [[6, "ngrok.SessionBuilder.heartbeat_interval"]], "heartbeat_tolerance() (ngrok.sessionbuilder method)": [[6, "ngrok.SessionBuilder.heartbeat_tolerance"]], "metadata() (ngrok.sessionbuilder method)": [[6, "ngrok.SessionBuilder.metadata"]], "server_addr() (ngrok.sessionbuilder method)": [[6, "ngrok.SessionBuilder.server_addr"]], "tcplistenerbuilder (class in ngrok)": [[7, "ngrok.TcpListenerBuilder"]], "allow_cidr() (ngrok.tcplistenerbuilder method)": [[7, "ngrok.TcpListenerBuilder.allow_cidr"]], "deny_cidr() (ngrok.tcplistenerbuilder method)": [[7, "ngrok.TcpListenerBuilder.deny_cidr"]], "forwards_to() (ngrok.tcplistenerbuilder method)": [[7, "ngrok.TcpListenerBuilder.forwards_to"]], "listen() (ngrok.tcplistenerbuilder method)": [[7, "ngrok.TcpListenerBuilder.listen"]], "listen_and_forward() (ngrok.tcplistenerbuilder method)": [[7, "ngrok.TcpListenerBuilder.listen_and_forward"]], "listen_and_serve() (ngrok.tcplistenerbuilder method)": [[7, "ngrok.TcpListenerBuilder.listen_and_serve"]], "metadata() (ngrok.tcplistenerbuilder method)": [[7, "ngrok.TcpListenerBuilder.metadata"]], "policy() (ngrok.tcplistenerbuilder method)": [[7, "ngrok.TcpListenerBuilder.policy"]], "proxy_proto() (ngrok.tcplistenerbuilder method)": [[7, "ngrok.TcpListenerBuilder.proxy_proto"]], "remote_addr() (ngrok.tcplistenerbuilder method)": [[7, "ngrok.TcpListenerBuilder.remote_addr"]], "tlslistenerbuilder (class in ngrok)": [[8, "ngrok.TlsListenerBuilder"]], "allow_cidr() (ngrok.tlslistenerbuilder method)": [[8, "ngrok.TlsListenerBuilder.allow_cidr"]], "deny_cidr() (ngrok.tlslistenerbuilder method)": [[8, "ngrok.TlsListenerBuilder.deny_cidr"]], "domain() (ngrok.tlslistenerbuilder method)": [[8, "ngrok.TlsListenerBuilder.domain"]], "forwards_to() (ngrok.tlslistenerbuilder method)": [[8, "ngrok.TlsListenerBuilder.forwards_to"]], "listen() (ngrok.tlslistenerbuilder method)": [[8, "ngrok.TlsListenerBuilder.listen"]], "listen_and_forward() (ngrok.tlslistenerbuilder method)": [[8, "ngrok.TlsListenerBuilder.listen_and_forward"]], "listen_and_serve() (ngrok.tlslistenerbuilder method)": [[8, "ngrok.TlsListenerBuilder.listen_and_serve"]], "metadata() (ngrok.tlslistenerbuilder method)": [[8, "ngrok.TlsListenerBuilder.metadata"]], "mutual_tlsca() (ngrok.tlslistenerbuilder method)": [[8, "ngrok.TlsListenerBuilder.mutual_tlsca"]], "policy() (ngrok.tlslistenerbuilder method)": [[8, "ngrok.TlsListenerBuilder.policy"]], "proxy_proto() (ngrok.tlslistenerbuilder method)": [[8, "ngrok.TlsListenerBuilder.proxy_proto"]], "termination() (ngrok.tlslistenerbuilder method)": [[8, "ngrok.TlsListenerBuilder.termination"]]}})
\ No newline at end of file
+Search.setIndex({"docnames": ["http_listener_builder", "index", "labeled_listener_builder", "listener", "module", "session", "session_builder", "tcp_listener_builder", "tls_listener_builder"], "filenames": ["http_listener_builder.rst", "index.rst", "labeled_listener_builder.rst", "listener.rst", "module.rst", "session.rst", "session_builder.rst", "tcp_listener_builder.rst", "tls_listener_builder.rst"], "titles": ["HTTP Listener Builder", "Python SDK for ngrok", "Labeled Listener Builder", "Listener", "Ngrok Module", "Session", "Session Builder", "TCP Listener Builder", "TLS Listener Builder"], "terms": {"The": [0, 1, 2, 3, 4, 5, 6, 7, 8], "ngrok": [0, 2, 3, 5, 6, 7, 8], "agent": [0, 1, 2, 3, 4, 5, 6, 7, 8], "sdk": [0, 2, 3, 4, 5, 6, 7, 8], "python": [0, 2, 3, 4, 5, 6, 7, 8], "class": [0, 1, 2, 3, 5, 6, 7, 8], "httplistenerbuild": [0, 3], "an": [0, 1, 3, 4, 5, 6, 7, 8], "back": [0, 1, 3, 5, 7, 8], "endpoint": [0, 1, 3, 5, 7, 8], "allow_cidr": [0, 1, 7, 8], "cidr": [0, 7, 8], "restrict": [0, 7, 8], "place": [0, 7, 8], "origin": [0, 7, 8], "incom": [0, 3, 7, 8], "connect": [0, 2, 3, 4, 6, 7, 8], "edg": [0, 1, 7, 8], "onli": [0, 6, 7, 8], "allow": [0, 1, 6, 7, 8], "rang": [0, 7, 8], "call": [0, 1, 3, 6, 7, 8], "multipl": [0, 7, 8], "time": [0, 6, 7, 8], "add": [0, 1, 2, 6, 7, 8], "addit": [0, 1, 2, 6, 7, 8], "basic_auth": [0, 1], "usernam": 0, "password": 0, "credenti": 0, "basic": [0, 1], "authent": [0, 6, 8], "If": [0, 1, 6, 8], "i": [0, 1, 2, 3, 4, 6], "disabl": 0, "circuit_break": [0, 1], "reject": 0, "request": [0, 1, 6, 7, 8], "when": [0, 1, 6], "5xx": 0, "respons": [0, 1, 6], "exce": 0, "thi": [0, 1, 2, 3, 4, 5, 6, 7, 8], "ratio": 0, "0": [0, 1, 3], "compress": [0, 1], "enabl": [0, 1], "gzip": 0, "deny_cidr": [0, 1, 7, 8], "deni": [0, 7, 8], "domain": [0, 1, 3, 8], "forwards_to": [0, 3, 7, 8], "backend": [0, 7, 8], "metadata": [0, 1, 2, 3, 6, 7, 8], "viewabl": [0, 2, 7, 8], "via": [0, 1, 2, 6, 7, 8], "dashboard": [0, 1, 3, 6, 7, 8], "api": [0, 2, 3, 6, 7, 8], "ha": [0, 7, 8], "bear": [0, 7, 8], "behavior": [0, 6, 7, 8], "begin": [0, 2, 7, 8], "new": [0, 2, 6, 7, 8], "listen_and_forward": [0, 2, 3, 7, 8], "to_url": [0, 2, 7, 8], "forward": [0, 1, 2, 3, 4, 7, 8], "them": [0, 1, 2, 7, 8], "given": [0, 2, 4, 5, 6, 7, 8], "url": [0, 1, 2, 3, 4, 7, 8], "listen_and_serv": [0, 2, 3, 7, 8], "server": [0, 1, 2, 4, 7, 8], "paramet": [0, 2, 4, 6, 7, 8], "httpserver": [0, 2, 4, 7, 8], "none": [0, 2, 4, 7, 8], "link": [0, 2, 4, 7, 8], "return": [0, 1, 2, 3, 4, 6, 7, 8], "A": [0, 1, 2, 4, 7, 8], "task": [0, 2, 3, 4, 6, 7, 8], "await": [0, 1, 2, 3, 4, 7, 8], "type": [0, 1, 2, 4, 6, 7, 8], "specif": [0, 2, 6, 7, 8], "opaqu": [0, 2, 6, 7, 8], "mutual_tlsca": [0, 8], "certif": [0, 1, 6, 8], "us": [0, 1, 2, 3, 4, 6, 7, 8], "client": [0, 6, 8], "oauth": [0, 1], "allow_email": 0, "allow_domain": 0, "scope": [0, 1], "configur": [0, 6, 7, 8], "provid": [0, 1, 6], "str": [0, 4, 7, 8], "name": [0, 1, 4], "list": [0, 5], "email": [0, 1], "address": [0, 1, 2, 3, 4, 6, 7, 8], "oidc": 0, "client_id": 0, "client_secret": 0, "issuer_url": 0, "issuer": 0, "id": [0, 1, 3, 5], "secret": [0, 1], "proxy_proto": [0, 1, 7, 8], "version": [0, 1, 3, 6, 7, 8], "proxi": [0, 6, 7, 8], "protocol": [0, 2, 3, 4, 7, 8], "1": [0, 1, 2, 4, 7, 8], "2": [0, 1, 7, 8], "remove_request_head": 0, "remov": [0, 4], "header": [0, 1], "from": [0, 1, 4, 6], "remove_response_head": 0, "request_head": 0, "valu": [0, 2, 3, 6, 8], "all": [0, 4], "response_head": 0, "come": [0, 1], "scheme": [0, 1], "should": [0, 1], "default": [0, 1, 2, 4], "webhook_verif": 0, "webhookverif": 0, "websocket_tcp_convers": 0, "convert": 0, "websocket": 0, "tcp": [0, 1, 2, 3, 4, 5, 8], "like": [0, 1, 4, 6], "stream": 0, "note": 1, "beta": [], "qualiti": [], "softwar": [], "interfac": 1, "mai": [1, 6], "chang": 1, "without": 1, "warn": 4, "global": 1, "distribut": 1, "revers": [], "commonli": [], "quickli": 1, "get": 4, "public": 1, "servic": [1, 6], "run": [1, 4], "insid": 6, "privat": [], "network": 6, "your": [1, 6], "local": [], "laptop": [], "usual": [], "deploi": [], "commun": [], "cloud": [], "librari": 6, "form": [], "suitabl": [], "integr": [], "directli": 1, "applic": [1, 2, 6], "you": [0, 1, 3, 6, 7, 8], "build": [1, 5], "separ": [], "process": [1, 6], "manag": 1, "re": 1, "look": 1, "previou": [], "download": [], "project": 1, "": [1, 3, 4, 5], "over": 1, "here": 1, "guid": 1, "ar": [1, 6], "includ": 1, "instal": [], "packag": [], "pypi": 1, "pip": 1, "m": 1, "after": [1, 6], "ve": [], "ll": 1, "need": 1, "authtoken": [1, 6], "retriev": [1, 5], "one": [1, 4, 6], "page": 1, "follow": [1, 6], "block": 6, "method": [1, 3], "expos": [], "port": [1, 4], "9000": 1, "localhost": [0, 1, 2, 4, 7, 8], "import": 1, "authtoken_from_env": [1, 6], "true": [1, 4], "print": 1, "f": 1, "ingress": [1, 4, 6], "establish": [1, 4, 6], "can": [0, 1, 2, 3, 4, 6, 7, 8], "find": [1, 6], "directori": [1, 4], "To": [0, 1, 3, 7, 8], "most": [1, 6], "featur": 1, "obtain": 1, "sign": 1, "up": 1, "free": 1, "com": [1, 6], "onc": 1, "have": [0, 1, 8], "copi": 1, "sever": 1, "wai": [1, 6], "set": [0, 1, 2, 3, 4, 8], "ngrok_authtoken": [1, 6], "environ": [1, 4, 6], "variabl": [1, 4, 6], "pass": [1, 4, 6], "Or": 1, "token": 1, "set_auth_token": 1, "easiest": 1, "start": [3, 5], "specifi": 1, "asynchron": 1, "runtim": 1, "promis": 1, "resolv": 1, "object": [1, 4], "argument": 1, "http": [1, 2, 4, 5, 7, 8], "80": [1, 4], "number": 1, "4242": 1, "host": [1, 4], "string": [1, 3, 4, 6], "option": [0, 1, 4, 6], "custom": [0, 1, 6, 8], "8080": [0, 1, 2, 4, 7, 8], "online1lin": 1, "oauth_provid": 1, "googl": 1, "oauth_allow_domain": 1, "second": 1, "which": [1, 6], "creat": [1, 4, 6], "25565": 1, "sinc": [1, 3], "kwarg": 1, "also": [1, 3, 4, 6], "oper": [1, 6], "dictionari": 1, "response_header_add": 1, "x": 1, "awesom": 1, "ye": 1, "close": [1, 3, 5], "complet": 1, "omit": 1, "shut": [1, 4], "down": [1, 4], "stop": [1, 6], "longer": 1, "current": [1, 6], "non": [1, 5], "get_listen": [1, 5], "show": 1, "possibl": 1, "item": 1, "addr": [1, 3, 4, 6], "session_metadata": 1, "onlin": 1, "One": 1, "line": 1, "ip_restriction_allow_cidr": [], "ip_restriction_deny_cidr": [], "10": [1, 3], "32": 1, "mutual_tls_ca": 1, "load_fil": 1, "ca": 1, "crt": 1, "oauth_allow_email": 1, "oauth_scop": 1, "oidc_issuer_url": 1, "oidc_client_id": 1, "oidc_client_secret": 1, "oidc_allow_domain": 1, "oidc_allow_email": 1, "oidc_scop": 1, "request_header_remov": 1, "req": 1, "nope": 1, "response_header_remov": 1, "request_header_add": 1, "yup": 1, "verify_webhook_provid": 1, "twilio": 1, "verify_webhook_secret": 1, "asdf": 1, "websocket_tcp_convert": 1, "prefix": 1, "command": 1, "web": 1, "either": [0, 1, 2, 3, 7, 8], "ani": [0, 1, 8], "automat": [0, 1, 3, 7, 8], "There": [], "mani": [], "instanc": 1, "ad": 1, "auth": 1, "introduc": 1, "mysit": 1, "1234": 1, "ud": 1, "tmp": [1, 3], "sock": [0, 1, 2, 3, 4, 7, 8], "well": [1, 6], "bob": 1, "k": 1, "worker": 1, "uvicornwork": 1, "webhook": [0, 1], "verif": [0, 1], "s3cr3t": 1, "bind": 1, "aiohttp": 1, "aw": 1, "app": 1, "see": [0, 1, 2, 4, 6, 7, 8], "serverless": [], "repositori": [], "make": 1, "necessari": [], "instead": [1, 3, 6], "nodej": [], "singl": 1, "file": [0, 1, 2, 3, 4, 7, 8], "modifi": 1, "py": 1, "discuss": [], "abov": 1, "flask": 1, "streamlit": 1, "tornado": 1, "gradio": 1, "cli": 1, "share": [], "openplayground": 1, "llm": [], "playground": [], "gpt4all": 1, "l": [], "snoozi": [], "13b": [], "model": [], "frontend": [], "minim": 1, "label": [1, 3, 4, 5], "As": 1, "valid": [0, 1, 6, 8], "filepath": 1, "ssl_cert_fil": 1, "fall": 1, "o": 1, "trust": 1, "so": 1, "now": 1, "do": [1, 6], "127": 1, "3000": 1, "cert": 1, "self": 1, "befor": [1, 6], "path": [0, 1, 2, 3, 4, 7, 8], "choos": [1, 6], "view": 1, "123": 1, "For": [1, 3, 7], "control": 1, "async": [1, 4], "def": 1, "create_listen": 1, "ngroksessionbuild": 1, "http_endpoint": [1, 5], "pre": 1, "built": 1, "binari": 1, "i686": 1, "x64": 1, "aarch64": 1, "arm": 1, "window": [1, 4], "maco": 1, "linux": [0, 1, 2, 3, 7, 8], "musl": 1, "freebsd": 1, "rust": 1, "open": 1, "sourc": 1, "other": [1, 6], "next": 1, "releas": 1, "ring": 1, "won": 1, "t": 1, "accept": 1, "bsd": 1, "flavor": 1, "reli": 1, "pyo3": 1, "excel": 1, "system": [1, 4], "eas": 1, "develop": [], "plugin": 1, "thank": 1, "openiothub": 1, "hand": 1, "track": 1, "md": 1, "under": 1, "apach": 1, "www": [], "org": [], "mit": 1, "opensourc": [], "unless": 1, "explicitli": [1, 3], "state": 1, "otherwis": [1, 4], "intention": 1, "submit": 1, "inclus": 1, "defin": [0, 1], "shall": 1, "dual": 1, "term": 1, "condit": 1, "index": 1, "search": 1, "labeledlistenerbuild": 2, "pair": 2, "rpc": 3, "must": [3, 6], "ed": 3, "It": [3, 6], "equival": 3, "session": [3, 4, 7], "close_listen": [3, 5], "socket": [0, 2, 3, 4, 7, 8], "darwin": [0, 2, 3, 7, 8], "unix": [0, 2, 3, 4, 7, 8], "e": [2, 3, 4, 6], "g": [3, 4, 6], "On": 0, "pipe": 4, "an_ngrok_pip": [], "human": 3, "readabl": [3, 6], "present": 3, "tcplistenerbuild": [3, 7], "etc": 3, "uniqu": [3, 6], "join": 3, "wait": [3, 6], "exit": [3, 4, 6], "wa": 3, "arbitrari": 3, "proto": [1, 3, 4], "listen": [4, 5], "int": 4, "traffic": [0, 2, 4, 7, 8], "integ": 4, "tl": [0, 4, 5, 6], "dict": 4, "loop": 4, "result": [4, 6], "disconnect": [4, 6], "fd": 4, "its": [4, 6], "descriptor": 4, "getsocknam": 4, "kill": 4, "server_address": 4, "attribut": 4, "previous": [0, 4, 8], "said": 4, "log_level": 4, "level": 4, "info": [1, 4], "log": [1, 4], "bridg": 4, "error": [4, 6], "debug": 4, "trace": [1, 4], "pipe_nam": 4, "temp": 4, "program": 4, "werkzeug_develop": 4, "werkzeug_server_fd": 4, "werkzeug_run_main": 4, "engag": 4, "werkzeug": 4, "particular": 5, "order": 5, "labeled_listen": 5, "tcp_endpoint": 5, "tls_endpoint": 5, "sessionbuild": 6, "exist": 6, "doc": [0, 1, 2, 6, 7, 8], "detail": [0, 2, 6, 7, 8], "shortcut": 6, "ca_cert": 6, "cert_byt": 6, "while": 6, "through": [1, 6], "man": 6, "middl": 6, "deep": 6, "packet": 6, "inspect": 6, "byte": 6, "overrid": 6, "server_addr": 6, "roughli": 6, "correspond": 6, "root_ca": 6, "client_info": 6, "client_typ": 6, "comment": 6, "ellipsi": 6, "inform": 6, "consum": 6, "crate": 6, "identifi": 6, "themselv": 6, "entri": 6, "user": [0, 1, 6], "field": 6, "signific": 6, "first": 6, "posit": 6, "rfc": 6, "7230": 6, "occur": 6, "attempt": 6, "handle_disconnect": 6, "handler": 6, "function": 6, "In": 6, "event": 6, "disrupt": 6, "each": 6, "reconnect": 6, "exampl": [0, 2, 3, 6, 7, 8], "443": [1, 6], "messag": 6, "rais": 6, "except": 6, "caus": 6, "throw": 6, "uncaught": 6, "handle_heartbeat": 6, "whenev": 6, "heartbeat": 6, "receiv": 6, "latenc": 6, "millisecond": 6, "eventu": 6, "dy": 6, "handle_restart_command": 6, "updat": [1, 6], "interpret": 6, "callback": 6, "restart": 6, "entir": [1, 6], "visibl": 6, "out": [1, 6], "std": 6, "handle_stop_command": 6, "termin": [1, 6, 8], "handle_update_command": 6, "itself": 6, "invok": 6, "some": 6, "heartbeat_interv": 6, "how": 6, "often": 6, "send": 6, "check": [0, 1, 6], "live": 6, "heartbeat_toler": 6, "durat": 6, "assum": 6, "dead": 6, "machin": 6, "made": 6, "avail": [1, 6], "resourc": 6, "we": 6, "suggest": 6, "encod": 6, "structur": 6, "format": [6, 8], "json": 6, "metdata": 6, "dial": 6, "remote_addr": 7, "tlslistenerbuild": 8, "cert_pem": 8, "key_pem": 8, "kei": [1, 8], "pem": [1, 8], "circuit": 0, "breaker": 0, "ip": [0, 1, 7, 8], "mutual": [0, 8], "openid": 0, "_": [], "hostnam": [0, 8], "regist": [0, 8], "requir": [0, 1, 8], "dn": [0, 8], "cname": [0, 8], "These": [3, 7], "reserv": 7, "across": 7, "io": 7, "21746": 7, "stabl": 1, "diffus": 1, "webui": 1, "automatic1111": 1, "text": 1, "gener": 1, "oobabooga": 1, "extens": 1, "allow_user_ag": [0, 1], "regex": 0, "regular": 0, "express": 0, "match": 0, "filter": 0, "modul": 0, "against": 0, "rule": 0, "deny_user_ag": [0, 1], "mozilla": 1, "curl": 1, "oauth_client_id": 1, "oauth_client_secret": 1, "offici": 1, "secur": 1, "product": 1, "readi": 1, "code": 1, "gatewai": 1, "export": 1, "output": 1, "consol": 1, "That": 1, "more": 1, "found": 1, "With": 1, "bundl": 1, "django": 1, "flag": 1, "usag": 1, "our": 1, "read": 1, "about": 1, "blog": 1, "issu": 1, "pull": 1, "slack": 1, "u": 1, "twitter": 1, "ngrokhq": 1, "subscrib": 1, "youtub": 1, "channel": 1, "between": 1, "work": 1, "192": [0, 2, 4, 7, 8], "168": [0, 2, 4, 7, 8], "100": [0, 2, 4, 7, 8], "8443": [0, 2, 4, 7, 8], "deprec": 3, "builder": 3, "forwrads_to": [], "author": 1, "alia": 4, "full": 4, "15555": [], "edghts_2g": 1, "along": 1, "polici": [0, 1, 7, 8], "policy_config": [0, 7, 8], "param": [0, 7, 8], "attach": [0, 7, 8], "policy_json": 1, "prerequisit": 1, "cargo": 1, "toml": 1, "latest": 1, "version_her": 1, "src": 1, "rust_files_her": 1, "r": 1, "happi": 1, "test": 1, "suit": 1, "your_authtoken_her": 1, "individu": 1, "test_class": 1, "name_of_test": 1, "makefil": 1, "app_protocol": [0, 1, 2], "l7": [0, 2], "http1": [0, 2], "http2": [0, 2], "hypercorn": 1, "verifi": 1, "v": 1, "your_listener_url": 1, "try": 1, "your_ip": 1, "a6278d6c07c": 1, "alpn": 1, "offer": 1, "h2": 1, "7": 1, "81": 1, "200": 1, "content": 1, "plain": 1, "date": 1, "fri": 1, "01": 1, "mar": 1, "2024": 1, "18": 1, "50": 1, "23": 1, "gmt": 1, "your_agent_ip": 1, "ed038ace04876818149cf0769bd43e38": 1, "tlsv1": 1, "IN": 1, "supplement": 1, "data": 1, "left": 1, "intact": 1, "hello": 1}, "objects": {"": [[8, 0, 0, "-", "ngrok"]], "ngrok": [[0, 1, 1, "", "HttpListenerBuilder"], [2, 1, 1, "", "LabeledListenerBuilder"], [3, 1, 1, "", "Listener"], [5, 1, 1, "", "Session"], [6, 1, 1, "", "SessionBuilder"], [7, 1, 1, "", "TcpListenerBuilder"], [8, 1, 1, "", "TlsListenerBuilder"], [4, 3, 1, "", "connect"], [4, 3, 1, "", "default"], [4, 3, 1, "", "disconnect"], [4, 3, 1, "", "fd"], [4, 3, 1, "", "forward"], [4, 3, 1, "", "getsockname"], [4, 3, 1, "", "kill"], [4, 3, 1, "", "listen"], [4, 3, 1, "", "log_level"], [4, 3, 1, "", "pipe_name"], [4, 3, 1, "", "werkzeug_develop"]], "ngrok.HttpListenerBuilder": [[0, 2, 1, "", "allow_cidr"], [0, 2, 1, "", "allow_user_agent"], [0, 2, 1, "", "app_protocol"], [0, 2, 1, "", "basic_auth"], [0, 2, 1, "", "circuit_breaker"], [0, 2, 1, "", "compression"], [0, 2, 1, "", "deny_cidr"], [0, 2, 1, "", "deny_user_agent"], [0, 2, 1, "", "domain"], [0, 2, 1, "", "forwards_to"], [0, 2, 1, "", "listen"], [0, 2, 1, "", "listen_and_forward"], [0, 2, 1, "", "listen_and_serve"], [0, 2, 1, "", "metadata"], [0, 2, 1, "", "mutual_tlsca"], [0, 2, 1, "", "oauth"], [0, 2, 1, "", "oidc"], [0, 2, 1, "", "policy"], [0, 2, 1, "", "proxy_proto"], [0, 2, 1, "", "remove_request_header"], [0, 2, 1, "", "remove_response_header"], [0, 2, 1, "", "request_header"], [0, 2, 1, "", "response_header"], [0, 2, 1, "", "scheme"], [0, 2, 1, "", "webhook_verification"], [0, 2, 1, "", "websocket_tcp_conversion"]], "ngrok.LabeledListenerBuilder": [[2, 2, 1, "", "app_protocol"], [2, 2, 1, "", "label"], [2, 2, 1, "", "listen"], [2, 2, 1, "", "listen_and_forward"], [2, 2, 1, "", "listen_and_serve"], [2, 2, 1, "", "metadata"]], "ngrok.Listener": [[3, 2, 1, "", "close"], [3, 2, 1, "", "forward"], [3, 2, 1, "", "forwards_to"], [3, 2, 1, "", "id"], [3, 2, 1, "", "join"], [3, 2, 1, "", "labels"], [3, 2, 1, "", "metadata"], [3, 2, 1, "", "proto"], [3, 2, 1, "", "url"]], "ngrok.Session": [[5, 2, 1, "", "close"], [5, 2, 1, "", "close_listener"], [5, 2, 1, "", "get_listeners"], [5, 2, 1, "", "http_endpoint"], [5, 2, 1, "", "labeled_listener"], [5, 2, 1, "", "tcp_endpoint"], [5, 2, 1, "", "tls_endpoint"]], "ngrok.SessionBuilder": [[6, 2, 1, "", "authtoken"], [6, 2, 1, "", "authtoken_from_env"], [6, 2, 1, "", "ca_cert"], [6, 2, 1, "", "client_info"], [6, 2, 1, "", "connect"], [6, 2, 1, "", "handle_disconnection"], [6, 2, 1, "", "handle_heartbeat"], [6, 2, 1, "", "handle_restart_command"], [6, 2, 1, "", "handle_stop_command"], [6, 2, 1, "", "handle_update_command"], [6, 2, 1, "", "heartbeat_interval"], [6, 2, 1, "", "heartbeat_tolerance"], [6, 2, 1, "", "metadata"], [6, 2, 1, "", "server_addr"]], "ngrok.TcpListenerBuilder": [[7, 2, 1, "", "allow_cidr"], [7, 2, 1, "", "deny_cidr"], [7, 2, 1, "", "forwards_to"], [7, 2, 1, "", "listen"], [7, 2, 1, "", "listen_and_forward"], [7, 2, 1, "", "listen_and_serve"], [7, 2, 1, "", "metadata"], [7, 2, 1, "", "policy"], [7, 2, 1, "", "proxy_proto"], [7, 2, 1, "", "remote_addr"]], "ngrok.TlsListenerBuilder": [[8, 2, 1, "", "allow_cidr"], [8, 2, 1, "", "deny_cidr"], [8, 2, 1, "", "domain"], [8, 2, 1, "", "forwards_to"], [8, 2, 1, "", "listen"], [8, 2, 1, "", "listen_and_forward"], [8, 2, 1, "", "listen_and_serve"], [8, 2, 1, "", "metadata"], [8, 2, 1, "", "mutual_tlsca"], [8, 2, 1, "", "policy"], [8, 2, 1, "", "proxy_proto"], [8, 2, 1, "", "termination"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:method", "3": "py:function"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "method", "Python method"], "3": ["py", "function", "Python function"]}, "titleterms": {"http": 0, "listen": [0, 1, 2, 3, 7, 8], "builder": [0, 1, 2, 6, 7, 8], "The": [], "ngrok": [1, 4], "agent": [], "sdk": 1, "python": 1, "document": 1, "quickstart": 1, "author": [], "connect": 1, "disconnect": 1, "list": 1, "full": 1, "configur": 1, "asgi": 1, "runner": 1, "uvicorn": 1, "gunicorn": 1, "django": [], "more": [], "With": [], "No": [], "code": [], "exampl": 1, "framework": 1, "machin": 1, "learn": 1, "type": [], "tl": [1, 8], "backend": 1, "unix": 1, "socket": 1, "platform": 1, "support": 1, "depend": 1, "changelog": 1, "licens": 1, "contribut": 1, "api": 1, "refer": 1, "session": [1, 5, 6], "modul": [1, 4], "indic": 1, "tabl": 1, "label": 2, "tcp": 7, "instal": 1, "all": 1, "join": 1, "commun": 1, "authent": 1, "develop": 1, "get": 1, "start": 1, "http2": 1}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 57}, "alltitles": {"HTTP Listener Builder": [[0, "module-ngrok"]], "Python SDK for ngrok": [[1, "python-sdk-for-ngrok"]], "Installation": [[1, "installation"]], "Quickstart": [[1, "quickstart"]], "Documentation": [[1, "documentation"]], "Authentication": [[1, "authentication"]], "Connection": [[1, "connection"]], "Disconnection": [[1, "disconnection"]], "List all Listeners": [[1, "list-all-listeners"]], "TLS Backends": [[1, "tls-backends"]], "Unix Sockets": [[1, "unix-sockets"]], "Builders": [[1, "builders"]], "Full Configuration": [[1, "full-configuration"]], "ASGI Runner": [[1, "asgi-runner"]], "Uvicorn": [[1, "uvicorn"]], "Gunicorn": [[1, "gunicorn"]], "Examples": [[1, "examples"]], "Listeners": [[1, "listeners"]], "Frameworks": [[1, "frameworks"]], "Machine Learning": [[1, "machine-learning"]], "Platform Support": [[1, "platform-support"]], "Dependencies": [[1, "dependencies"]], "Changelog": [[1, "changelog"]], "Join the ngrok Community": [[1, "join-the-ngrok-community"]], "License": [[1, "license"]], "Contributions": [[1, "contributions"]], "Development: Getting Started": [[1, "development-getting-started"]], "HTTP2": [[1, "http2"]], "API Reference": [[1, "api-reference"]], "Listener and Sessions:": [[1, null]], "Listener Builders:": [[1, null]], "Module:": [[1, null]], "Indices and tables": [[1, "indices-and-tables"]], "Labeled Listener Builder": [[2, "module-ngrok"]], "Listener": [[3, "module-ngrok"]], "Ngrok Module": [[4, "module-ngrok"]], "Session": [[5, "module-ngrok"]], "Session Builder": [[6, "module-ngrok"]], "TCP Listener Builder": [[7, "module-ngrok"]], "TLS Listener Builder": [[8, "module-ngrok"]]}, "indexentries": {"httplistenerbuilder (class in ngrok)": [[0, "ngrok.HttpListenerBuilder"]], "allow_cidr() (ngrok.httplistenerbuilder method)": [[0, "ngrok.HttpListenerBuilder.allow_cidr"]], "allow_user_agent() (ngrok.httplistenerbuilder method)": [[0, "ngrok.HttpListenerBuilder.allow_user_agent"]], "app_protocol() (ngrok.httplistenerbuilder method)": [[0, "ngrok.HttpListenerBuilder.app_protocol"]], "basic_auth() (ngrok.httplistenerbuilder method)": [[0, "ngrok.HttpListenerBuilder.basic_auth"]], "circuit_breaker() (ngrok.httplistenerbuilder method)": [[0, "ngrok.HttpListenerBuilder.circuit_breaker"]], "compression() (ngrok.httplistenerbuilder method)": [[0, "ngrok.HttpListenerBuilder.compression"]], "deny_cidr() (ngrok.httplistenerbuilder method)": [[0, "ngrok.HttpListenerBuilder.deny_cidr"]], "deny_user_agent() (ngrok.httplistenerbuilder method)": [[0, "ngrok.HttpListenerBuilder.deny_user_agent"]], "domain() (ngrok.httplistenerbuilder method)": [[0, "ngrok.HttpListenerBuilder.domain"]], "forwards_to() (ngrok.httplistenerbuilder method)": [[0, "ngrok.HttpListenerBuilder.forwards_to"]], "listen() (ngrok.httplistenerbuilder method)": [[0, "ngrok.HttpListenerBuilder.listen"]], "listen_and_forward() (ngrok.httplistenerbuilder method)": [[0, "ngrok.HttpListenerBuilder.listen_and_forward"]], "listen_and_serve() (ngrok.httplistenerbuilder method)": [[0, "ngrok.HttpListenerBuilder.listen_and_serve"]], "metadata() (ngrok.httplistenerbuilder method)": [[0, "ngrok.HttpListenerBuilder.metadata"]], "module": [[0, "module-ngrok"], [2, "module-ngrok"], [3, "module-ngrok"], [4, "module-ngrok"], [5, "module-ngrok"], [6, "module-ngrok"], [7, "module-ngrok"], [8, "module-ngrok"]], "mutual_tlsca() (ngrok.httplistenerbuilder method)": [[0, "ngrok.HttpListenerBuilder.mutual_tlsca"]], "ngrok": [[0, "module-ngrok"], [2, "module-ngrok"], [3, "module-ngrok"], [4, "module-ngrok"], [5, "module-ngrok"], [6, "module-ngrok"], [7, "module-ngrok"], [8, "module-ngrok"]], "oauth() (ngrok.httplistenerbuilder method)": [[0, "ngrok.HttpListenerBuilder.oauth"]], "oidc() (ngrok.httplistenerbuilder method)": [[0, "ngrok.HttpListenerBuilder.oidc"]], "policy() (ngrok.httplistenerbuilder method)": [[0, "ngrok.HttpListenerBuilder.policy"]], "proxy_proto() (ngrok.httplistenerbuilder method)": [[0, "ngrok.HttpListenerBuilder.proxy_proto"]], "remove_request_header() (ngrok.httplistenerbuilder method)": [[0, "ngrok.HttpListenerBuilder.remove_request_header"]], "remove_response_header() (ngrok.httplistenerbuilder method)": [[0, "ngrok.HttpListenerBuilder.remove_response_header"]], "request_header() (ngrok.httplistenerbuilder method)": [[0, "ngrok.HttpListenerBuilder.request_header"]], "response_header() (ngrok.httplistenerbuilder method)": [[0, "ngrok.HttpListenerBuilder.response_header"]], "scheme() (ngrok.httplistenerbuilder method)": [[0, "ngrok.HttpListenerBuilder.scheme"]], "webhook_verification() (ngrok.httplistenerbuilder method)": [[0, "ngrok.HttpListenerBuilder.webhook_verification"]], "websocket_tcp_conversion() (ngrok.httplistenerbuilder method)": [[0, "ngrok.HttpListenerBuilder.websocket_tcp_conversion"]], "labeledlistenerbuilder (class in ngrok)": [[2, "ngrok.LabeledListenerBuilder"]], "app_protocol() (ngrok.labeledlistenerbuilder method)": [[2, "ngrok.LabeledListenerBuilder.app_protocol"]], "label() (ngrok.labeledlistenerbuilder method)": [[2, "ngrok.LabeledListenerBuilder.label"]], "listen() (ngrok.labeledlistenerbuilder method)": [[2, "ngrok.LabeledListenerBuilder.listen"]], "listen_and_forward() (ngrok.labeledlistenerbuilder method)": [[2, "ngrok.LabeledListenerBuilder.listen_and_forward"]], "listen_and_serve() (ngrok.labeledlistenerbuilder method)": [[2, "ngrok.LabeledListenerBuilder.listen_and_serve"]], "metadata() (ngrok.labeledlistenerbuilder method)": [[2, "ngrok.LabeledListenerBuilder.metadata"]], "listener (class in ngrok)": [[3, "ngrok.Listener"]], "close() (ngrok.listener method)": [[3, "ngrok.Listener.close"]], "forward() (ngrok.listener method)": [[3, "ngrok.Listener.forward"]], "forwards_to() (ngrok.listener method)": [[3, "ngrok.Listener.forwards_to"]], "id() (ngrok.listener method)": [[3, "ngrok.Listener.id"]], "join() (ngrok.listener method)": [[3, "ngrok.Listener.join"]], "labels() (ngrok.listener method)": [[3, "ngrok.Listener.labels"]], "metadata() (ngrok.listener method)": [[3, "ngrok.Listener.metadata"]], "proto() (ngrok.listener method)": [[3, "ngrok.Listener.proto"]], "url() (ngrok.listener method)": [[3, "ngrok.Listener.url"]], "connect() (in module ngrok)": [[4, "ngrok.connect"]], "default() (in module ngrok)": [[4, "ngrok.default"]], "disconnect() (in module ngrok)": [[4, "ngrok.disconnect"]], "fd() (in module ngrok)": [[4, "ngrok.fd"]], "forward() (in module ngrok)": [[4, "ngrok.forward"]], "getsockname() (in module ngrok)": [[4, "ngrok.getsockname"]], "kill() (in module ngrok)": [[4, "ngrok.kill"]], "listen() (in module ngrok)": [[4, "ngrok.listen"]], "log_level() (in module ngrok)": [[4, "ngrok.log_level"]], "pipe_name() (in module ngrok)": [[4, "ngrok.pipe_name"]], "werkzeug_develop() (in module ngrok)": [[4, "ngrok.werkzeug_develop"]], "session (class in ngrok)": [[5, "ngrok.Session"]], "close() (ngrok.session method)": [[5, "ngrok.Session.close"]], "close_listener() (ngrok.session method)": [[5, "ngrok.Session.close_listener"]], "get_listeners() (ngrok.session method)": [[5, "ngrok.Session.get_listeners"]], "http_endpoint() (ngrok.session method)": [[5, "ngrok.Session.http_endpoint"]], "labeled_listener() (ngrok.session method)": [[5, "ngrok.Session.labeled_listener"]], "tcp_endpoint() (ngrok.session method)": [[5, "ngrok.Session.tcp_endpoint"]], "tls_endpoint() (ngrok.session method)": [[5, "ngrok.Session.tls_endpoint"]], "sessionbuilder (class in ngrok)": [[6, "ngrok.SessionBuilder"]], "authtoken() (ngrok.sessionbuilder method)": [[6, "ngrok.SessionBuilder.authtoken"]], "authtoken_from_env() (ngrok.sessionbuilder method)": [[6, "ngrok.SessionBuilder.authtoken_from_env"]], "ca_cert() (ngrok.sessionbuilder method)": [[6, "ngrok.SessionBuilder.ca_cert"]], "client_info() (ngrok.sessionbuilder method)": [[6, "ngrok.SessionBuilder.client_info"]], "connect() (ngrok.sessionbuilder method)": [[6, "ngrok.SessionBuilder.connect"]], "handle_disconnection() (ngrok.sessionbuilder method)": [[6, "ngrok.SessionBuilder.handle_disconnection"]], "handle_heartbeat() (ngrok.sessionbuilder method)": [[6, "ngrok.SessionBuilder.handle_heartbeat"]], "handle_restart_command() (ngrok.sessionbuilder method)": [[6, "ngrok.SessionBuilder.handle_restart_command"]], "handle_stop_command() (ngrok.sessionbuilder method)": [[6, "ngrok.SessionBuilder.handle_stop_command"]], "handle_update_command() (ngrok.sessionbuilder method)": [[6, "ngrok.SessionBuilder.handle_update_command"]], "heartbeat_interval() (ngrok.sessionbuilder method)": [[6, "ngrok.SessionBuilder.heartbeat_interval"]], "heartbeat_tolerance() (ngrok.sessionbuilder method)": [[6, "ngrok.SessionBuilder.heartbeat_tolerance"]], "metadata() (ngrok.sessionbuilder method)": [[6, "ngrok.SessionBuilder.metadata"]], "server_addr() (ngrok.sessionbuilder method)": [[6, "ngrok.SessionBuilder.server_addr"]], "tcplistenerbuilder (class in ngrok)": [[7, "ngrok.TcpListenerBuilder"]], "allow_cidr() (ngrok.tcplistenerbuilder method)": [[7, "ngrok.TcpListenerBuilder.allow_cidr"]], "deny_cidr() (ngrok.tcplistenerbuilder method)": [[7, "ngrok.TcpListenerBuilder.deny_cidr"]], "forwards_to() (ngrok.tcplistenerbuilder method)": [[7, "ngrok.TcpListenerBuilder.forwards_to"]], "listen() (ngrok.tcplistenerbuilder method)": [[7, "ngrok.TcpListenerBuilder.listen"]], "listen_and_forward() (ngrok.tcplistenerbuilder method)": [[7, "ngrok.TcpListenerBuilder.listen_and_forward"]], "listen_and_serve() (ngrok.tcplistenerbuilder method)": [[7, "ngrok.TcpListenerBuilder.listen_and_serve"]], "metadata() (ngrok.tcplistenerbuilder method)": [[7, "ngrok.TcpListenerBuilder.metadata"]], "policy() (ngrok.tcplistenerbuilder method)": [[7, "ngrok.TcpListenerBuilder.policy"]], "proxy_proto() (ngrok.tcplistenerbuilder method)": [[7, "ngrok.TcpListenerBuilder.proxy_proto"]], "remote_addr() (ngrok.tcplistenerbuilder method)": [[7, "ngrok.TcpListenerBuilder.remote_addr"]], "tlslistenerbuilder (class in ngrok)": [[8, "ngrok.TlsListenerBuilder"]], "allow_cidr() (ngrok.tlslistenerbuilder method)": [[8, "ngrok.TlsListenerBuilder.allow_cidr"]], "deny_cidr() (ngrok.tlslistenerbuilder method)": [[8, "ngrok.TlsListenerBuilder.deny_cidr"]], "domain() (ngrok.tlslistenerbuilder method)": [[8, "ngrok.TlsListenerBuilder.domain"]], "forwards_to() (ngrok.tlslistenerbuilder method)": [[8, "ngrok.TlsListenerBuilder.forwards_to"]], "listen() (ngrok.tlslistenerbuilder method)": [[8, "ngrok.TlsListenerBuilder.listen"]], "listen_and_forward() (ngrok.tlslistenerbuilder method)": [[8, "ngrok.TlsListenerBuilder.listen_and_forward"]], "listen_and_serve() (ngrok.tlslistenerbuilder method)": [[8, "ngrok.TlsListenerBuilder.listen_and_serve"]], "metadata() (ngrok.tlslistenerbuilder method)": [[8, "ngrok.TlsListenerBuilder.metadata"]], "mutual_tlsca() (ngrok.tlslistenerbuilder method)": [[8, "ngrok.TlsListenerBuilder.mutual_tlsca"]], "policy() (ngrok.tlslistenerbuilder method)": [[8, "ngrok.TlsListenerBuilder.policy"]], "proxy_proto() (ngrok.tlslistenerbuilder method)": [[8, "ngrok.TlsListenerBuilder.proxy_proto"]], "termination() (ngrok.tlslistenerbuilder method)": [[8, "ngrok.TlsListenerBuilder.termination"]]}})
\ No newline at end of file
diff --git a/examples/hypercorn-http2-ngrok.py b/examples/hypercorn-http2-ngrok.py
index 995f92f..63e89b8 100644
--- a/examples/hypercorn-http2-ngrok.py
+++ b/examples/hypercorn-http2-ngrok.py
@@ -6,21 +6,26 @@
config = Config()
+
async def app(scope, receive, send):
- await send({
- 'type': 'http.response.start',
- 'status': 200,
- 'headers': [
- (b'content-type', b'text/plain'),
- ],
- })
- await send({
- 'type': 'http.response.body',
- 'body': b'hello',
- })
+ await send(
+ {
+ "type": "http.response.start",
+ "status": 200,
+ "headers": [
+ (b"content-type", b"text/plain"),
+ ],
+ }
+ )
+ await send(
+ {
+ "type": "http.response.body",
+ "body": b"hello",
+ }
+ )
logging.basicConfig(level=logging.INFO)
ngrok.forward(addr="localhost:8080", authtoken_from_env=True, app_protocol="http2")
config.bind = ["localhost:8080"]
-asyncio.run(serve(app, config))
\ No newline at end of file
+asyncio.run(serve(app, config))
diff --git a/python/ngrok/ngrok.pyi b/python/ngrok/ngrok.pyi
index 57c3316..72a4c56 100644
--- a/python/ngrok/ngrok.pyi
+++ b/python/ngrok/ngrok.pyi
@@ -69,6 +69,7 @@ class SessionBuilder:
class HttpListenerBuilder:
def allow_cidr(self, cidr: str) -> HttpListenerBuilder: ...
def allow_user_agent(self, regex: str) -> HttpListenerBuilder: ...
+ def app_protocol(self, app_protocol: str) -> HttpListenerBuilder: ...
def basic_auth(self, username: str, password: str) -> HttpListenerBuilder: ...
def circuit_breaker(self, circuit_breaker: float) -> HttpListenerBuilder: ...
def compression(self) -> HttpListenerBuilder: ...
@@ -112,6 +113,7 @@ class HttpListenerBuilder:
def websocket_tcp_conversion(self) -> HttpListenerBuilder: ...
class LabeledListenerBuilder:
+ def app_protocol(self, app_protocol: str) -> LabeledListenerBuilder: ...
def label(self, label: str, value: str) -> LabeledListenerBuilder: ...
def listen(self) -> Awaitable[Listener]: ...
def listen_and_forward(self, url: str) -> Awaitable[Listener]: ...
|