64 lines
1.8 KiB
Plaintext
64 lines
1.8 KiB
Plaintext
func main[argc: I64, argv: Ptr] : I64
|
|
if argc < 2
|
|
dbg.panic("url missing")
|
|
|
|
let url: String = mem.deref64(argv + 8)
|
|
|
|
if c.strncmp(url, "http://", 7) != 0
|
|
dbg.panic("invalid url scheme")
|
|
|
|
let url_len: I64 = str.len(url)
|
|
let host_start: I64 = 7
|
|
let i: I64 = host_start
|
|
while i < url_len
|
|
if str.nth(url, i) == '/'
|
|
break
|
|
i = i + 1
|
|
|
|
let host: String = str.substr(url, host_start, i - host_start)
|
|
let path: String = "/"
|
|
if i < url_len
|
|
path = str.substr(url, i, url_len - i)
|
|
|
|
let s: I64 = net.connect(host, 80)
|
|
if s < 0
|
|
dbg.panic("failed to connect")
|
|
|
|
let req: String = mem.alloc(2048)
|
|
c.snprintf(req, 2048, "GET %s HTTP/1.0\r\nHost: %s\r\nConnection: close\r\n\r\n", path, host)
|
|
c.send(s, req, str.len(req), 0)
|
|
mem.free(req)
|
|
|
|
let header_buf: Ptr = mem.alloc(8192)
|
|
let header_size: I64 = 0
|
|
let found: Bool = false
|
|
let end_index: I64 = -1
|
|
|
|
while !found & header_size < 8192
|
|
let n: I64 = c.read(s, header_buf + header_size, 8192 - header_size)
|
|
if n <= 0
|
|
break
|
|
let current_size: I64 = header_size + n
|
|
i = 0
|
|
while i <= current_size - 4
|
|
let p: Ptr = header_buf + i
|
|
if str.nth(p, 0) == 13 & str.nth(p, 1) == 10 & str.nth(p, 2) == 13 & str.nth(p, 3) == 10
|
|
found = true
|
|
end_index = i + 4
|
|
break
|
|
i = i + 1
|
|
header_size = current_size
|
|
|
|
if end_index < header_size
|
|
c.write(1, header_buf + end_index, header_size - end_index)
|
|
mem.free(header_buf)
|
|
|
|
let buffer: Ptr = mem.alloc(4096)
|
|
while true
|
|
let n: I64 = c.read(s, buffer, 4096)
|
|
if n <= 0
|
|
break
|
|
c.write(1, buffer, n)
|
|
mem.free(buffer)
|
|
|
|
c.close(s) |