vweb: use Response struct for 302 response (#11245)
parent
67e8031a08
commit
2cb0db633d
|
@ -47,6 +47,7 @@ const (
|
||||||
'vlib/vweb/tests/vweb_test.v',
|
'vlib/vweb/tests/vweb_test.v',
|
||||||
'vlib/vweb/request_test.v',
|
'vlib/vweb/request_test.v',
|
||||||
'vlib/net/http/request_test.v',
|
'vlib/net/http/request_test.v',
|
||||||
|
'vlib/net/http/response_test.v',
|
||||||
'vlib/vweb/route_test.v',
|
'vlib/vweb/route_test.v',
|
||||||
'vlib/net/websocket/websocket_test.v',
|
'vlib/net/websocket/websocket_test.v',
|
||||||
'vlib/crypto/rand/crypto_rand_read_test.v',
|
'vlib/crypto/rand/crypto_rand_read_test.v',
|
||||||
|
@ -89,6 +90,7 @@ const (
|
||||||
'vlib/net/http/http_httpbin_test.v',
|
'vlib/net/http/http_httpbin_test.v',
|
||||||
'vlib/net/http/header_test.v',
|
'vlib/net/http/header_test.v',
|
||||||
'vlib/net/http/server_test.v',
|
'vlib/net/http/server_test.v',
|
||||||
|
'vlib/net/http/response_test.v',
|
||||||
]
|
]
|
||||||
skip_on_linux = [
|
skip_on_linux = [
|
||||||
'do_not_remove',
|
'do_not_remove',
|
||||||
|
|
|
@ -0,0 +1,36 @@
|
||||||
|
module http
|
||||||
|
|
||||||
|
fn test_response_bytestr() ? {
|
||||||
|
{
|
||||||
|
resp := new_response(
|
||||||
|
status: .ok
|
||||||
|
text: 'Foo'
|
||||||
|
)
|
||||||
|
assert resp.bytestr() == 'HTTP/1.1 200 OK\r\n' + 'Content-Length: 3\r\n' + '\r\n' + 'Foo'
|
||||||
|
}
|
||||||
|
{
|
||||||
|
resp := new_response(
|
||||||
|
status: .found
|
||||||
|
text: 'Foo'
|
||||||
|
header: new_header(key: .location, value: '/')
|
||||||
|
)
|
||||||
|
lines := resp.bytestr().split_into_lines()
|
||||||
|
assert lines[0] == 'HTTP/1.1 302 Found'
|
||||||
|
// header order is not guaranteed
|
||||||
|
check_headers(['Location: /', 'Content-Length: 3'], lines[1..3]) ?
|
||||||
|
assert lines[3] == ''
|
||||||
|
assert lines[4] == 'Foo'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// check_headers is a helper function for asserting all expected headers
|
||||||
|
// are found because rendered header order is not guaranteed. The check
|
||||||
|
// is O(n^2) which is fine for small lists.
|
||||||
|
fn check_headers(expected []string, found []string) ? {
|
||||||
|
assert expected.len == found.len
|
||||||
|
for header in expected {
|
||||||
|
if !found.contains(header) {
|
||||||
|
return error('expected header "$header" not in $found')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -17,6 +17,11 @@ pub const (
|
||||||
http.CommonHeader.connection.str(): 'close'
|
http.CommonHeader.connection.str(): 'close'
|
||||||
}) or { panic('should never fail') }
|
}) or { panic('should never fail') }
|
||||||
|
|
||||||
|
http_302 = http.new_response(
|
||||||
|
status: .found
|
||||||
|
text: '302 Found'
|
||||||
|
header: headers_close
|
||||||
|
)
|
||||||
http_400 = http.new_response(
|
http_400 = http.new_response(
|
||||||
status: .bad_request
|
status: .bad_request
|
||||||
text: '400 Bad Request'
|
text: '400 Bad Request'
|
||||||
|
@ -246,9 +251,10 @@ pub fn (mut ctx Context) redirect(url string) Result {
|
||||||
return Result{}
|
return Result{}
|
||||||
}
|
}
|
||||||
ctx.done = true
|
ctx.done = true
|
||||||
send_string(mut ctx.conn, 'HTTP/1.1 302 Found\r\nLocation: $url\r\n$ctx.header\r\n$vweb.headers_close\r\n') or {
|
mut resp := vweb.http_302
|
||||||
return Result{}
|
resp.header = resp.header.join(ctx.header)
|
||||||
}
|
resp.header.add(.location, url)
|
||||||
|
send_string(mut ctx.conn, resp.bytestr()) or { return Result{} }
|
||||||
return Result{}
|
return Result{}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue