code wiki / _hdl_build / _h2_reach_probe.nx
_h2_reach_probe.nx source
↩ module page · 40 lines · 2974 B
1// _h2_reach_probe.nx -- does HTTP/2 (ALPN h2) grow REACH vs our h1.1 path? Fetches argv[1] over the
2// sovereign h2 stack (run_h2 + h2_tls_get) and reports :status + body-bytes. Compares against the h1.1
3// sweep (reuters 401 / imdb 202 soft-blocks) to see if looking like a browser (h2) unlocks them.
4import "nx_x509_trust_store.nx"
5import "nx_trust_store_load_from_certdata.nx"
6import "nx_tls13_client_validate_certificate.nx"
7import "nx_tls13_client_h2run.nx"
8import "nx_https_url_for_fetch.nx"
9import "nx_https_url_connect.nx"
10import "nx_h2_client_over_tls.nx"
11func p(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
12func pn(v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m;sys_write(1,"-" as *u8,1)}; let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=48;k=1}; while m>0{t[k]=48+(m%10);m=m/10;k=k+1}; var i: i64=0; while i<k{bb[i]=t[k-1-i];i=i+1}; sys_write(1,bb,k); return 0 }
13func main(argc: i64, argv: *i64) -> i64 {
14 if argc < 2 { p("usage: _h2_reach_probe <url>\n" as *u8); return 1 }
15 let url0: *u8 = argv[1] as *u8
16 let r: i64 = nx_trust_store_load_from_certdata("/tmp/mozilla_certdata.txt" as *u8, 512, 4194304)
17 if r <= 0 { p(" trust-store FAIL\n" as *u8); return 2 }
18 let store: *TrustStore = r as *TrustStore
19 let target_raw: *u8 = sys_mmap(64); let target: *NxHttpsTarget = target_raw as *NxHttpsTarget
20 target.url = nx_url_new(); target.port = 0
21 let urlbuf: *u8 = sys_mmap(4096); var ui: i64=0; while url0[ui]!=0 as u8 { urlbuf[ui]=url0[ui]; ui=ui+1 } urlbuf[ui]=0 as u8
22 p("h2 "); p(urlbuf); p(" -> ")
23 if nx_https_url_for_fetch(urlbuf, target) != NX_HTTPS_URL_OK { p("URL-parse FAIL\n" as *u8); return 3 }
24 let fd_p: *i64 = sys_mmap(16) as *i64
25 if nx_https_url_connect(target, urlbuf, sys_now_realtime_sec(), fd_p) != NX_HTTPS_CONNECT_OK { p("CONNECT FAIL\n" as *u8); return 4 }
26 let cfd: i64 = fd_p[0]
27 let vc_raw: *u8 = sys_mmap(64); let vc: *TlsValidationContext = vc_raw as *TlsValidationContext
28 vc.store = store; vc.sni_host = urlbuf + target.url.host_off; vc.sni_host_len = target.url.host_len; vc.now_epoch = sys_now_realtime_sec()
29 let cr2: *u8 = sys_mmap(32); var ei: i64=0; while ei<32 { cr2[ei]=(0xC0+ei) as u8; ei=ei+1 }
30 let priv2: *u8 = sys_mmap(32); ei=0; while ei<32 { priv2[ei]=(0xA0+ei) as u8; ei=ei+1 }
31 let sr: i64 = nx_tls13_client_session_run_h2(cfd, urlbuf + target.url.host_off, target.url.host_len, cr2, priv2, vc)
32 if sr <= 0 { p("h2-ALPN handshake FAIL rc="); pn(sr); p(" (host refused h2)\n" as *u8); sys_close(cfd); return 5 }
33 let session: *Tls13ClientSession = sr as *Tls13ClientSession
34 let body: *u8 = sys_mmap(1048576)
35 let st: *i64 = sys_mmap(16) as *i64
36 let bl: i64 = h2_tls_get(session, cfd, urlbuf + target.url.host_off, target.url.host_len, "/" as *u8, 1, body, 1048576, st)
37 sys_close(cfd)
38 p("h2 :status="); pn(st[0]); p(" body="); pn(bl); p("\n" as *u8)
39 return 0
40}