code wiki / (root) / nx_html_extract_imgs_test.nx

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}