mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
websocket: simplify and better handle handshake (#16829)
This commit is contained in:
parent
d3a196977f
commit
aaf3e25c3f
@ -1,4 +1,3 @@
|
|||||||
[manualfree]
|
|
||||||
module websocket
|
module websocket
|
||||||
|
|
||||||
import encoding.base64
|
import encoding.base64
|
||||||
@ -29,21 +28,16 @@ fn (mut ws Client) handshake() ! {
|
|||||||
}
|
}
|
||||||
sb.write_string('\r\n\r\n')
|
sb.write_string('\r\n\r\n')
|
||||||
handshake := sb.str()
|
handshake := sb.str()
|
||||||
defer {
|
|
||||||
unsafe { handshake.free() }
|
|
||||||
}
|
|
||||||
handshake_bytes := handshake.bytes()
|
handshake_bytes := handshake.bytes()
|
||||||
ws.debug_log('sending handshake: ${handshake}')
|
ws.debug_log('sending handshake: ${handshake}')
|
||||||
ws.socket_write(handshake_bytes)!
|
ws.socket_write(handshake_bytes)!
|
||||||
ws.read_handshake(seckey)!
|
ws.read_handshake(seckey)!
|
||||||
unsafe { handshake_bytes.free() }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// handle_server_handshake manages websocket server handshake process
|
// handle_server_handshake manages websocket server handshake process
|
||||||
fn (mut s Server) handle_server_handshake(mut c Client) !(string, &ServerClient) {
|
fn (mut s Server) handle_server_handshake(mut c Client) !(string, &ServerClient) {
|
||||||
msg := c.read_handshake_str()!
|
msg := c.read_handshake_str()!
|
||||||
handshake_response, client := s.parse_client_handshake(msg, mut c)!
|
handshake_response, client := s.parse_client_handshake(msg, mut c)!
|
||||||
unsafe { msg.free() }
|
|
||||||
return handshake_response, client
|
return handshake_response, client
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -70,26 +64,25 @@ fn (mut s Server) parse_client_handshake(client_handshake string, mut c Client)
|
|||||||
if lines[i].len <= 0 || lines[i] == '\r\n' {
|
if lines[i].len <= 0 || lines[i] == '\r\n' {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
keys := lines[i].split(':')
|
keys := lines[i].split(':').map(it.trim_space())
|
||||||
match keys[0] {
|
match keys[0].to_lower() {
|
||||||
'Upgrade', 'upgrade' {
|
'upgrade' {
|
||||||
flags << .has_upgrade
|
flags << .has_upgrade
|
||||||
}
|
}
|
||||||
'Connection', 'connection' {
|
'connection' {
|
||||||
flags << .has_connection
|
flags << .has_connection
|
||||||
}
|
}
|
||||||
'Sec-WebSocket-Key', 'sec-websocket-key' {
|
'sec-websocket-key' {
|
||||||
key = keys[1].trim_space()
|
key = keys[1]
|
||||||
s.logger.debug('server-> got key: ${key}')
|
s.logger.debug('server-> got key: ${key}')
|
||||||
seckey = create_key_challenge_response(key)!
|
seckey = create_key_challenge_response(key)!
|
||||||
s.logger.debug('server-> challenge: ${seckey}, response: ${keys[1]}')
|
s.logger.debug('server-> challenge: ${seckey}, response: ${key}')
|
||||||
flags << .has_accept
|
flags << .has_accept
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// we ignore other headers like protocol for now
|
// we ignore other headers like protocol for now
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
unsafe { keys.free() }
|
|
||||||
}
|
}
|
||||||
if flags.len < 3 {
|
if flags.len < 3 {
|
||||||
return error_with_code('invalid client handshake, ${client_handshake}', 4)
|
return error_with_code('invalid client handshake, ${client_handshake}', 4)
|
||||||
@ -101,13 +94,6 @@ fn (mut s Server) parse_client_handshake(client_handshake string, mut c Client)
|
|||||||
client: unsafe { c }
|
client: unsafe { c }
|
||||||
server: unsafe { s }
|
server: unsafe { s }
|
||||||
}
|
}
|
||||||
unsafe {
|
|
||||||
lines.free()
|
|
||||||
flags.free()
|
|
||||||
get_tokens.free()
|
|
||||||
seckey.free()
|
|
||||||
key.free()
|
|
||||||
}
|
|
||||||
return server_handshake, server_client
|
return server_handshake, server_client
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -137,7 +123,6 @@ fn (mut ws Client) read_handshake_str() !string {
|
|||||||
fn (mut ws Client) read_handshake(seckey string) ! {
|
fn (mut ws Client) read_handshake(seckey string) ! {
|
||||||
mut msg := ws.read_handshake_str()!
|
mut msg := ws.read_handshake_str()!
|
||||||
ws.check_handshake_response(msg, seckey)!
|
ws.check_handshake_response(msg, seckey)!
|
||||||
unsafe { msg.free() }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// check_handshake_response checks the response from handshake and returns
|
// check_handshake_response checks the response from handshake and returns
|
||||||
@ -154,15 +139,15 @@ fn (mut ws Client) check_handshake_response(handshake_response string, seckey st
|
|||||||
if lines[i].len <= 0 || lines[i] == '\r\n' {
|
if lines[i].len <= 0 || lines[i] == '\r\n' {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
keys := lines[i].split(':')
|
keys := lines[i].split(':').map(it.trim_space())
|
||||||
match keys[0] {
|
match keys[0].to_lower() {
|
||||||
'Upgrade', 'upgrade' {
|
'upgrade' {
|
||||||
ws.flags << .has_upgrade
|
ws.flags << .has_upgrade
|
||||||
}
|
}
|
||||||
'Connection', 'connection' {
|
'connection' {
|
||||||
ws.flags << .has_connection
|
ws.flags << .has_connection
|
||||||
}
|
}
|
||||||
'Sec-WebSocket-Accept', 'sec-websocket-accept' {
|
'sec-websocket-accept' {
|
||||||
ws.debug_log('seckey: ${seckey}')
|
ws.debug_log('seckey: ${seckey}')
|
||||||
challenge := create_key_challenge_response(seckey)!
|
challenge := create_key_challenge_response(seckey)!
|
||||||
ws.debug_log('challenge: ${challenge}, response: ${keys[1]}')
|
ws.debug_log('challenge: ${challenge}, response: ${keys[1]}')
|
||||||
@ -171,13 +156,10 @@ fn (mut ws Client) check_handshake_response(handshake_response string, seckey st
|
|||||||
7)
|
7)
|
||||||
}
|
}
|
||||||
ws.flags << .has_accept
|
ws.flags << .has_accept
|
||||||
unsafe { challenge.free() }
|
|
||||||
}
|
}
|
||||||
else {}
|
else {}
|
||||||
}
|
}
|
||||||
unsafe { keys.free() }
|
|
||||||
}
|
}
|
||||||
unsafe { lines.free() }
|
|
||||||
if ws.flags.len < 3 {
|
if ws.flags.len < 3 {
|
||||||
ws.close(1002, 'invalid websocket HTTP headers')!
|
ws.close(1002, 'invalid websocket HTTP headers')!
|
||||||
return error_with_code('invalid websocket HTTP headers', 8)
|
return error_with_code('invalid websocket HTTP headers', 8)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user