code wiki / _hdl_build / nx_host_range_gate.nx
nx_host_range_gate.nx source
↩ module page · 65 lines · 5521 B
1import "nx_host_router.nx"
2import "nx_gate_verdict.nx"
3static hrg_plan: *i64
4const HRG_CASES: *u8="range-response-status-and-length\nrange-body-exact-and-reader-closed\nrange-reader-transferred-once\nrange-security-headers-retained\nunsatisfiable-416-and-total\nunsatisfiable-response-not-cacheable\nordinary-get-retains-body\nmultiple-ranges-retain-full-response\nif-range-retains-full-response\nhtml-transformation-path-retained\nexact-header-capacity\nundersized-header-retains-output\n"
5func hrg_has(b: *u8,n: i64,s: *u8) -> i64 {
6 let sn: i64=hr_slen(s);var i: i64=0;while i+sn<=n { if hr_eq(b+i,s,sn)==1 { return 1 };i=i+1 };return 0
7}
8func hrg_check(name: *u8,ok: i64,c: *i64) -> i64 { return gv_plan_check(hrg_plan,name,ok,c) }
9func hrg_write(p: *u8,b: *u8) -> i64 {
10 let fd: i64=sys_openat_wr(p,0x180);if fd<0 { return fd }
11 let r: *NxFileWriteResult=sys_mmap(__size_of(NxFileWriteResult)) as *NxFileWriteResult
12 let rc: i64=fio_write_sync_fd(fd,b,hr_slen(b),r);sys_munmap(r as *u8,__size_of(NxFileWriteResult));return rc
13}
14func hrg_serve(req: *u8,b: *u8,cap: i64,n: *i64) -> i64 {
15 let cfg: *u8="test.local .\n";let injected: *i64=sys_mmap(__size_of(i64)) as *i64
16 let result: i64=hr_serve3_slot(cfg,hr_slen(cfg),req,hr_slen(req),b,cap,n,0 as *u8,0,injected)
17 sys_munmap(injected as *u8,__size_of(i64));return result
18}
19func main(argc: i64,argv: *i64) -> i64 {
20 if argc!=2 { return 2 };if sys_mkdir(argv[1] as *u8,0x1c0)!=0 { return 2 };if sys_chdir(argv[1] as *u8)!=0 { return 2 }
21 if hrg_write("asset.nxa","NXANIM01payload")!=0 { return 3 }
22 if hrg_write("page.html","<html><body>page</body></html>")!=0 { return 3 }
23 let count: *i64=gv_ctr();hrg_plan=gv_plan_new(HRG_CASES)
24 let meta: *NxFileReadRegion=sys_mmap(__size_of(NxFileReadRegion)) as *NxFileReadRegion
25 fio_region_init(meta);meta.total=hr_slen("NXANIM01payload");meta.start=0;meta.length=hr_slen("NXANIM01")
26 let exact: i64=hr_emit_range_head(0 as *u8,0,"application/octet-stream",meta,0)
27 // Compatibility cases must satisfy the existing full-response emitter's minimum.
28 let cap: i64=HR_MAGIC_1024+exact+hr_slen("<html><body>page</body></html>")+meta.total
29 let b: *u8=sys_mmap(cap+1);let n: *i64=sys_mmap(__size_of(i64)) as *i64
30 let request: *u8="GET /asset.nxa HTTP/1.1\r\nHost: test.local\r\nRange: bytes=0-7\r\n\r\n"
31 let result: i64=hrg_serve(request,b,cap,n)
32 hrg_check("range-response-status-and-length",((result==HR_S2_FILE_STREAM)&&(hrg_has(b,n[0],"206 Partial Content")==1)&&(hrg_has(b,n[0],"Content-Length: 8\r\n")==1)&&(hrg_has(b,n[0],"Content-Range: bytes 0-7/15\r\n")==1)) as i64,count)
33 hrg_check("range-security-headers-retained",((hrg_has(b,n[0],"Cross-Origin-Embedder-Policy: require-corp")==1)&&(hrg_has(b,n[0],"Content-Security-Policy:")==1)) as i64,count)
34 let reader: *NxFileReadRegion=hr_take_file_reader()
35 var good: i64=0
36 if (reader as i64)!=0 {
37 let got: i64=fio_region_next(reader,b,cap)
38 good=((got==8)&&(reader.read_bytes==8)&&(reader.fd<0)&&(hr_eq(b,"NXANIM01",8)==1)) as i64
39 fio_region_close(reader);sys_munmap(reader as *u8,__size_of(NxFileReadRegion))
40 }
41 hrg_check("range-body-exact-and-reader-closed",good,count)
42 hrg_check("range-reader-transferred-once",((hr_take_file_reader() as i64)==0) as i64,count)
43 let unsat: *u8="GET /asset.nxa HTTP/1.1\r\nHost: test.local\r\nRange: bytes=900-\r\n\r\n"
44 let ur: i64=hrg_serve(unsat,b,cap,n)
45 hrg_check("unsatisfiable-416-and-total",((ur==HR_S2_FILE_STREAM)&&(hrg_has(b,n[0],"416 Range Not Satisfiable")==1)&&(hrg_has(b,n[0],"Content-Length: 0\r\n")==1)&&(hrg_has(b,n[0],"Content-Range: bytes */15\r\n")==1)) as i64,count)
46 hrg_check("unsatisfiable-response-not-cacheable",((hrg_has(b,n[0],"Cache-Control: no-cache")==1)&&(hrg_has(b,n[0],"public, max-age=")==0)) as i64,count)
47 let ureader: *NxFileReadRegion=hr_take_file_reader();if (ureader as i64)!=0 { fio_region_close(ureader);sys_munmap(ureader as *u8,__size_of(NxFileReadRegion)) }
48 let normal: *u8="GET /asset.nxa HTTP/1.1\r\nHost: test.local\r\n\r\n"
49 hrg_check("ordinary-get-retains-body",((hrg_serve(normal,b,cap,n)==HR_S2_OK)&&(hrg_has(b,n[0],"NXANIM01payload")==1)) as i64,count)
50 let multi: *u8="GET /asset.nxa HTTP/1.1\r\nHost: test.local\r\nRange: bytes=0-1,4-5\r\n\r\n"
51 hrg_check("multiple-ranges-retain-full-response",((hrg_serve(multi,b,cap,n)==HR_S2_OK)&&(hrg_has(b,n[0],"200 OK")==1)&&(hrg_has(b,n[0],"NXANIM01payload")==1)) as i64,count)
52 let conditional: *u8="GET /asset.nxa HTTP/1.1\r\nHost: test.local\r\nRange: bytes=0-7\r\nIf-Range: \"old\"\r\n\r\n"
53 hrg_check("if-range-retains-full-response",((hrg_serve(conditional,b,cap,n)==HR_S2_OK)&&(hrg_has(b,n[0],"NXANIM01payload")==1)) as i64,count)
54 let html: *u8="GET /page.html HTTP/1.1\r\nHost: test.local\r\nRange: bytes=0-7\r\n\r\n"
55 hrg_check("html-transformation-path-retained",(hr_try_file_range(".",1,"/page.html",hr_slen("/page.html"),html,hr_slen(html),b,cap,n)==HR_S2_MISS) as i64,count)
56 b[exact]=77 as u8
57 let written: i64=hr_emit_range_head(b,exact,"application/octet-stream",meta,0)
58 hrg_check("exact-header-capacity",((written==exact)&&(b[exact]==(77 as u8))) as i64,count)
59 b[0]=77 as u8
60 let refused: i64=hr_emit_range_head(b,exact-1,"application/octet-stream",meta,0)
61 hrg_check("undersized-header-retains-output",((refused<0)&&(b[0]==(77 as u8))) as i64,count)
62 sys_munmap(meta as *u8,__size_of(NxFileReadRegion));sys_munmap(b,cap+1);sys_munmap(n as *u8,__size_of(i64))
63 gv_plan_finish(hrg_plan,count)
64 return gv_verdict("HOST-RANGE-GATE",count,"real static router and bounded file reader; daemon transport separate")
65}