nx_html_extract_imgs_test.nx source
↩ module page · 77 lines · 3117 B
1// nx_html_extract_imgs_test.nx -- exercise nx_html_extract_imgs
2// against a synthetic HTML document containing:
3// - mixed absolute / scheme-relative / path-relative img URLs
4// - <script> body containing literal "<img src='trap.png'>" that
5// must NOT be extracted (proves Arc B1 raw-text mode integration)
6// - case-variant <IMG> tag name
7//
8// expect_exit: 0
9// license_tier: ORIGINAL
10
11import "nx_syscalls.nx"
12import "nx_html_extract_imgs.nx"
13
14func _fail(n: i64) -> i64 {
15 let b: *u8 = sys_mmap(16)
16 b[0]=0x46; b[1]=0x41; b[2]=0x49; b[3]=0x4C; b[4]=0x3D
17 sys_write(2, b, 5)
18 var x: i64 = n
19 if x < 0 { let m: *u8 = sys_mmap(4); m[0]=0x2D; sys_write(2, m, 1); x = 0 - x }
20 if x == 0 { let z: *u8 = sys_mmap(4); z[0]=0x30; sys_write(2, z, 1) }
21 else {
22 let buf: *u8 = sys_mmap(16)
23 var pos: i64 = 0
24 while x > 0 { buf[pos] = (0x30 + (x % 10)) as u8; x = x / 10; pos = pos + 1 }
25 let out: *u8 = sys_mmap(16)
26 var i: i64 = 0
27 while i < pos { out[i] = buf[pos - 1 - i]; i = i + 1 }
28 sys_write(2, out, pos)
29 }
30 let nl: *u8 = sys_mmap(4); nl[0]=0x0A; sys_write(2, nl, 1)
31 return 0
32}
33
34func _bytes_eq_lit(buf: *u8, off: i64, n: i64, lit: *u8) -> i64 {
35 var i: i64 = 0
36 while i < n {
37 if buf[off + i] != lit[i] { return 0 }
38 i = i + 1
39 }
40 if lit[n] != 0 { return 0 }
41 return 1
42}
43
44func main() -> i64 {
45 let html: *u8 = "<html><head><script>var s='<img src=\"trap.png\">';</script></head><body><img src=\"hero.png\"><p>x</p><IMG src='/static/logo.png'><img src=\"https://cdn.com/a.png\"><img src=\"//other.com/b.png\"></body></html>"
46 var hlen: i64 = 0
47 while html[hlen] != 0 { hlen = hlen + 1 }
48
49 let base: *u8 = "https://www.example.com/page/index.html"
50 var blen: i64 = 0
51 while base[blen] != 0 { blen = blen + 1 }
52
53 let url_buf: *u8 = sys_mmap(2048)
54 let offsets: *i64 = sys_mmap(256) as *i64
55 let lengths: *i64 = sys_mmap(256) as *i64
56
57 let n: i64 = nx_html_extract_imgs(html, hlen, base, blen,
58 url_buf, 2048, offsets, lengths, 32)
59 if n != 4 { _fail(1); return 1 } // 4 real imgs, NOT the script trap
60
61 // 0: hero.png -> https://www.example.com/page/hero.png
62 if _bytes_eq_lit(url_buf, offsets[0], lengths[0], "https://www.example.com/page/hero.png" as *u8) != 1 { _fail(2); return 2 }
63
64 // 1: /static/logo.png -> https://www.example.com/static/logo.png (case-insensitive IMG)
65 if _bytes_eq_lit(url_buf, offsets[1], lengths[1], "https://www.example.com/static/logo.png" as *u8) != 1 { _fail(3); return 3 }
66
67 // 2: absolute https://cdn.com/a.png -> verbatim
68 if _bytes_eq_lit(url_buf, offsets[2], lengths[2], "https://cdn.com/a.png" as *u8) != 1 { _fail(4); return 4 }
69
70 // 3: scheme-relative //other.com/b.png -> https://other.com/b.png
71 if _bytes_eq_lit(url_buf, offsets[3], lengths[3], "https://other.com/b.png" as *u8) != 1 { _fail(5); return 5 }
72
73 let pass: *u8 = sys_mmap(16)
74 pass[0]=0x50; pass[1]=0x41; pass[2]=0x53; pass[3]=0x53; pass[4]=0x0A
75 sys_write(1, pass, 5)
76 return 0
77}