204 lines
4.7 KiB
V
204 lines
4.7 KiB
V
import net
|
|
import net.http
|
|
import time
|
|
|
|
fn test_https_get() {
|
|
$if !network ? {
|
|
return
|
|
}
|
|
assert http.get_text('https://vlang.io/version') == '0.1.5'
|
|
println('https ok')
|
|
}
|
|
|
|
fn test_http_get_from_vlang_utc_now() {
|
|
$if !network ? {
|
|
return
|
|
}
|
|
url := 'http://vlang.io/utc_now'
|
|
println('Test getting current time from HTTP ${url} by http.get')
|
|
res := http.get(url) or { panic(err) }
|
|
assert res.status() == .ok
|
|
assert res.body != ''
|
|
assert res.body.int() > 1566403696
|
|
println('Current time is: ${res.body.int()}')
|
|
}
|
|
|
|
fn test_https_get_from_vlang_utc_now() {
|
|
$if !network ? {
|
|
return
|
|
}
|
|
url := 'https://vlang.io/utc_now'
|
|
println('Test getting current time from HTTPS ${url} by http.get')
|
|
res := http.get(url) or { panic(err) }
|
|
assert res.status() == .ok
|
|
assert res.body != ''
|
|
assert res.body.int() > 1566403696
|
|
println('Current time is: ${res.body.int()}')
|
|
}
|
|
|
|
fn test_http_public_servers() {
|
|
$if !network ? {
|
|
return
|
|
}
|
|
urls := [
|
|
'http://github.com/robots.txt',
|
|
'http://google.com/robots.txt',
|
|
// 'http://yahoo.com/robots.txt',
|
|
]
|
|
for url in urls {
|
|
println('Testing http.get on public HTTP url: ${url} ')
|
|
res := http.get(url) or { panic(err) }
|
|
assert res.status() == .ok
|
|
assert res.body != ''
|
|
}
|
|
}
|
|
|
|
fn test_https_public_servers() {
|
|
$if !network ? {
|
|
return
|
|
}
|
|
urls := [
|
|
'https://github.com/robots.txt',
|
|
'https://google.com/robots.txt',
|
|
// 'https://yahoo.com/robots.txt',
|
|
]
|
|
for url in urls {
|
|
println('Testing http.get on public HTTPS url: ${url} ')
|
|
res := http.get(url) or { panic(err) }
|
|
assert res.status() == .ok
|
|
assert res.body != ''
|
|
}
|
|
}
|
|
|
|
struct RelativeRedirectHandler {}
|
|
|
|
fn (mut handler RelativeRedirectHandler) handle(req http.Request) http.Response {
|
|
mut res := http.Response{}
|
|
match req.url {
|
|
'/relative-redirect/3?abc=xyz' {
|
|
res.header = http.new_header(key: .location, value: '/relative-redirect/2?abc=xyz')
|
|
res.set_status(.found)
|
|
}
|
|
'/relative-redirect/2?abc=xyz' {
|
|
res.header = http.new_header(key: .location, value: '/relative-redirect/1?abc=xyz')
|
|
res.set_status(.found)
|
|
}
|
|
'/relative-redirect/1?abc=xyz' {
|
|
res.header = http.new_header(key: .location, value: '/get?abc=xyz')
|
|
res.set_status(.found)
|
|
}
|
|
'/get?abc=xyz' {
|
|
res.body = '{"args": {"abc": "xyz"}}'
|
|
res.set_status(.ok)
|
|
}
|
|
else {
|
|
res.body = req.url
|
|
res.set_status(.not_found)
|
|
}
|
|
}
|
|
|
|
res.set_version(req.version)
|
|
return res
|
|
}
|
|
|
|
fn test_relative_redirects() {
|
|
$if !network ? {
|
|
return
|
|
}
|
|
mut server := &http.Server{
|
|
accept_timeout: 100 * time.millisecond
|
|
handler: RelativeRedirectHandler{}
|
|
addr: '127.0.0.1:0'
|
|
show_startup_message: false
|
|
}
|
|
t := spawn server.listen_and_serve()
|
|
server.wait_till_running() or {
|
|
server.stop()
|
|
t.wait()
|
|
panic(err)
|
|
}
|
|
defer {
|
|
server.stop()
|
|
t.wait()
|
|
}
|
|
res := http.get('http://${server.addr}/relative-redirect/3?abc=xyz') or { panic(err) }
|
|
assert res.status() == .ok
|
|
assert res.body != ''
|
|
assert res.body.contains('"abc": "xyz"')
|
|
}
|
|
|
|
fn user_agent_response_body(request string) string {
|
|
for line in request.split('\r\n') {
|
|
if line.to_lower().starts_with('user-agent:') {
|
|
user_agent := line.all_after(':').trim_space()
|
|
return '{"user-agent": "${user_agent}"}'
|
|
}
|
|
}
|
|
return '{"user-agent": ""}'
|
|
}
|
|
|
|
fn serve_user_agent_once(mut listener net.TcpListener) {
|
|
mut conn := listener.accept() or {
|
|
listener.close() or {}
|
|
return
|
|
}
|
|
defer {
|
|
conn.close() or {}
|
|
listener.close() or {}
|
|
}
|
|
mut request := ''
|
|
mut buf := []u8{len: 4096}
|
|
for {
|
|
n := conn.read(mut buf) or { return }
|
|
if n <= 0 {
|
|
return
|
|
}
|
|
request += buf[..n].bytestr()
|
|
if request.contains('\r\n\r\n') {
|
|
break
|
|
}
|
|
}
|
|
body := user_agent_response_body(request)
|
|
response := 'HTTP/1.1 200 OK\r\nContent-Type: application/json\r\nContent-Length: ${body.len}\r\nConnection: close\r\n\r\n${body}'
|
|
conn.write(response.bytes()) or {}
|
|
}
|
|
|
|
fn start_user_agent_server() !(int, thread) {
|
|
mut listener := net.listen_tcp(.ip, '127.0.0.1:0')!
|
|
port := listener.addr()!.port()!
|
|
return port, spawn serve_user_agent_once(mut listener)
|
|
}
|
|
|
|
fn test_default_user_agent() {
|
|
$if !network ? {
|
|
return
|
|
}
|
|
port, server := start_user_agent_server()!
|
|
res := http.get('http://127.0.0.1:${port}/user-agent') or {
|
|
server.wait()
|
|
panic(err)
|
|
}
|
|
server.wait()
|
|
assert res.status() == .ok
|
|
assert res.body != ''
|
|
assert res.body.contains('"user-agent": "v.http"')
|
|
}
|
|
|
|
fn test_custom_user_agent() {
|
|
$if !network ? {
|
|
return
|
|
}
|
|
ua := 'V http test for UA'
|
|
port, server := start_user_agent_server()!
|
|
mut req := http.new_request(.get, 'http://127.0.0.1:${port}/user-agent', '')
|
|
req.user_agent = ua
|
|
res := req.do() or {
|
|
server.wait()
|
|
panic(err)
|
|
}
|
|
server.wait()
|
|
assert res.status() == .ok
|
|
assert res.body != ''
|
|
assert res.body.contains('"user-agent": "${ua}"')
|
|
}
|