Skip to content

Commit 6c3a3e4

Browse files
authored
Expose OHTTP key fetch for Python (#1386)
2 parents 762fbaf + 3e5d171 commit 6c3a3e4

2 files changed

Lines changed: 32 additions & 2 deletions

File tree

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import ssl
2+
from urllib.parse import urljoin
3+
4+
import httpx
5+
6+
from .payjoin import OhttpKeys
7+
8+
9+
async def fetch_ohttp_keys(
10+
ohttp_relay_url: str,
11+
directory_url: str,
12+
certificate: bytes,
13+
) -> OhttpKeys:
14+
keys_url = urljoin(directory_url, "/.well-known/ohttp-gateway")
15+
ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
16+
ssl_context.check_hostname = True
17+
ssl_context.verify_mode = ssl.CERT_REQUIRED
18+
pem_certificate = ssl.DER_cert_to_PEM_cert(certificate)
19+
ssl_context.load_verify_locations(cadata=pem_certificate)
20+
async with httpx.AsyncClient(
21+
proxy=ohttp_relay_url, verify=ssl_context, timeout=30.0
22+
) as client:
23+
response = await client.get(
24+
keys_url,
25+
headers={"Accept": "application/ohttp-keys"},
26+
)
27+
response.raise_for_status()
28+
return OhttpKeys.decode(response.content)

payjoin-ffi/python/test/test_payjoin_integration_test.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import json
55

66
from payjoin import *
7+
from payjoin.http import fetch_ohttp_keys
78
from typing import Optional
89
import unittest
910

@@ -98,7 +99,8 @@ async def test_ffi_validation(self):
9899
services = TestServices.initialize()
99100
services.wait_for_services_ready()
100101
directory = services.directory_url()
101-
ohttp_keys = services.fetch_ohttp_keys()
102+
ohttp_relay = services.ohttp_relay_url()
103+
ohttp_keys = await fetch_ohttp_keys(ohttp_relay, directory, services.cert())
102104
recv_persister = InMemoryReceiverSessionEventLog(999)
103105
pj_uri = self.create_receiver_context(
104106
receiver_address, directory, ohttp_keys, recv_persister
@@ -261,8 +263,8 @@ async def test_integration_v2_to_v2(self):
261263

262264
services.wait_for_services_ready()
263265
directory = services.directory_url()
264-
ohttp_keys = services.fetch_ohttp_keys()
265266
ohttp_relay = services.ohttp_relay_url()
267+
ohttp_keys = await fetch_ohttp_keys(ohttp_relay, directory, services.cert())
266268
agent = httpx.AsyncClient()
267269

268270
# **********************

0 commit comments

Comments
 (0)