v / vlib / net / http / http_test.v
203 lines · 189 sloc · 4.68 KB · 6d796798eb8923f5c72ffb9ee953208183c30246
Raw
1import net
2import net.http
3import time
4
5fn test_https_get() {
6 $if !network ? {
7 return
8 }
9 assert http.get_text('https://vlang.io/version') == '0.1.5'
10 println('https ok')
11}
12
13fn test_http_get_from_vlang_utc_now() {
14 $if !network ? {
15 return
16 }
17 url := 'http://vlang.io/utc_now'
18 println('Test getting current time from HTTP ${url} by http.get')
19 res := http.get(url) or { panic(err) }
20 assert res.status() == .ok
21 assert res.body != ''
22 assert res.body.int() > 1566403696
23 println('Current time is: ${res.body.int()}')
24}
25
26fn test_https_get_from_vlang_utc_now() {
27 $if !network ? {
28 return
29 }
30 url := 'https://vlang.io/utc_now'
31 println('Test getting current time from HTTPS ${url} by http.get')
32 res := http.get(url) or { panic(err) }
33 assert res.status() == .ok
34 assert res.body != ''
35 assert res.body.int() > 1566403696
36 println('Current time is: ${res.body.int()}')
37}
38
39fn test_http_public_servers() {
40 $if !network ? {
41 return
42 }
43 urls := [
44 'http://github.com/robots.txt',
45 'http://google.com/robots.txt',
46 // 'http://yahoo.com/robots.txt',
47 ]
48 for url in urls {
49 println('Testing http.get on public HTTP url: ${url} ')
50 res := http.get(url) or { panic(err) }
51 assert res.status() == .ok
52 assert res.body != ''
53 }
54}
55
56fn test_https_public_servers() {
57 $if !network ? {
58 return
59 }
60 urls := [
61 'https://github.com/robots.txt',
62 'https://google.com/robots.txt',
63 // 'https://yahoo.com/robots.txt',
64 ]
65 for url in urls {
66 println('Testing http.get on public HTTPS url: ${url} ')
67 res := http.get(url) or { panic(err) }
68 assert res.status() == .ok
69 assert res.body != ''
70 }
71}
72
73struct RelativeRedirectHandler {}
74
75fn (mut handler RelativeRedirectHandler) handle(req http.Request) http.Response {
76 mut res := http.Response{}
77 match req.url {
78 '/relative-redirect/3?abc=xyz' {
79 res.header = http.new_header(key: .location, value: '/relative-redirect/2?abc=xyz')
80 res.set_status(.found)
81 }
82 '/relative-redirect/2?abc=xyz' {
83 res.header = http.new_header(key: .location, value: '/relative-redirect/1?abc=xyz')
84 res.set_status(.found)
85 }
86 '/relative-redirect/1?abc=xyz' {
87 res.header = http.new_header(key: .location, value: '/get?abc=xyz')
88 res.set_status(.found)
89 }
90 '/get?abc=xyz' {
91 res.body = '{"args": {"abc": "xyz"}}'
92 res.set_status(.ok)
93 }
94 else {
95 res.body = req.url
96 res.set_status(.not_found)
97 }
98 }
99
100 res.set_version(req.version)
101 return res
102}
103
104fn test_relative_redirects() {
105 $if !network ? {
106 return
107 }
108 mut server := &http.Server{
109 accept_timeout: 100 * time.millisecond
110 handler: RelativeRedirectHandler{}
111 addr: '127.0.0.1:0'
112 show_startup_message: false
113 }
114 t := spawn server.listen_and_serve()
115 server.wait_till_running() or {
116 server.stop()
117 t.wait()
118 panic(err)
119 }
120 defer {
121 server.stop()
122 t.wait()
123 }
124 res := http.get('http://${server.addr}/relative-redirect/3?abc=xyz') or { panic(err) }
125 assert res.status() == .ok
126 assert res.body != ''
127 assert res.body.contains('"abc": "xyz"')
128}
129
130fn user_agent_response_body(request string) string {
131 for line in request.split('\r\n') {
132 if line.to_lower().starts_with('user-agent:') {
133 user_agent := line.all_after(':').trim_space()
134 return '{"user-agent": "${user_agent}"}'
135 }
136 }
137 return '{"user-agent": ""}'
138}
139
140fn serve_user_agent_once(mut listener net.TcpListener) {
141 mut conn := listener.accept() or {
142 listener.close() or {}
143 return
144 }
145 defer {
146 conn.close() or {}
147 listener.close() or {}
148 }
149 mut request := ''
150 mut buf := []u8{len: 4096}
151 for {
152 n := conn.read(mut buf) or { return }
153 if n <= 0 {
154 return
155 }
156 request += buf[..n].bytestr()
157 if request.contains('\r\n\r\n') {
158 break
159 }
160 }
161 body := user_agent_response_body(request)
162 response := 'HTTP/1.1 200 OK\r\nContent-Type: application/json\r\nContent-Length: ${body.len}\r\nConnection: close\r\n\r\n${body}'
163 conn.write(response.bytes()) or {}
164}
165
166fn start_user_agent_server() !(int, thread) {
167 mut listener := net.listen_tcp(.ip, '127.0.0.1:0')!
168 port := listener.addr()!.port()!
169 return port, spawn serve_user_agent_once(mut listener)
170}
171
172fn test_default_user_agent() {
173 $if !network ? {
174 return
175 }
176 port, server := start_user_agent_server()!
177 res := http.get('http://127.0.0.1:${port}/user-agent') or {
178 server.wait()
179 panic(err)
180 }
181 server.wait()
182 assert res.status() == .ok
183 assert res.body != ''
184 assert res.body.contains('"user-agent": "v.http"')
185}
186
187fn test_custom_user_agent() {
188 $if !network ? {
189 return
190 }
191 ua := 'V http test for UA'
192 port, server := start_user_agent_server()!
193 mut req := http.new_request(.get, 'http://127.0.0.1:${port}/user-agent', '')
194 req.user_agent = ua
195 res := req.do() or {
196 server.wait()
197 panic(err)
198 }
199 server.wait()
200 assert res.status() == .ok
201 assert res.body != ''
202 assert res.body.contains('"user-agent": "${ua}"')
203}
204