Skip to content

Commit aaf3e25

Browse files
authored
websocket: simplify and better handle handshake (#16829)
1 parent d3a1969 commit aaf3e25

File tree

1 file changed

+12
-30
lines changed

1 file changed

+12
-30
lines changed

vlib/net/websocket/handshake.v

Lines changed: 12 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
[manualfree]
21
module websocket
32

43
import encoding.base64
@@ -29,21 +28,16 @@ fn (mut ws Client) handshake() ! {
2928
}
3029
sb.write_string('\r\n\r\n')
3130
handshake := sb.str()
32-
defer {
33-
unsafe { handshake.free() }
34-
}
3531
handshake_bytes := handshake.bytes()
3632
ws.debug_log('sending handshake: ${handshake}')
3733
ws.socket_write(handshake_bytes)!
3834
ws.read_handshake(seckey)!
39-
unsafe { handshake_bytes.free() }
4035
}
4136

4237
// handle_server_handshake manages websocket server handshake process
4338
fn (mut s Server) handle_server_handshake(mut c Client) !(string, &ServerClient) {
4439
msg := c.read_handshake_str()!
4540
handshake_response, client := s.parse_client_handshake(msg, mut c)!
46-
unsafe { msg.free() }
4741
return handshake_response, client
4842
}
4943

@@ -70,26 +64,25 @@ fn (mut s Server) parse_client_handshake(client_handshake string, mut c Client)
7064
if lines[i].len <= 0 || lines[i] == '\r\n' {
7165
continue
7266
}
73-
keys := lines[i].split(':')
74-
match keys[0] {
75-
'Upgrade', 'upgrade' {
67+
keys := lines[i].split(':').map(it.trim_space())
68+
match keys[0].to_lower() {
69+
'upgrade' {
7670
flags << .has_upgrade
7771
}
78-
'Connection', 'connection' {
72+
'connection' {
7973
flags << .has_connection
8074
}
81-
'Sec-WebSocket-Key', 'sec-websocket-key' {
82-
key = keys[1].trim_space()
75+
'sec-websocket-key' {
76+
key = keys[1]
8377
s.logger.debug('server-> got key: ${key}')
8478
seckey = create_key_challenge_response(key)!
85-
s.logger.debug('server-> challenge: ${seckey}, response: ${keys[1]}')
79+
s.logger.debug('server-> challenge: ${seckey}, response: ${key}')
8680
flags << .has_accept
8781
}
8882
else {
8983
// we ignore other headers like protocol for now
9084
}
9185
}
92-
unsafe { keys.free() }
9386
}
9487
if flags.len < 3 {
9588
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)
10194
client: unsafe { c }
10295
server: unsafe { s }
10396
}
104-
unsafe {
105-
lines.free()
106-
flags.free()
107-
get_tokens.free()
108-
seckey.free()
109-
key.free()
110-
}
11197
return server_handshake, server_client
11298
}
11399

@@ -137,7 +123,6 @@ fn (mut ws Client) read_handshake_str() !string {
137123
fn (mut ws Client) read_handshake(seckey string) ! {
138124
mut msg := ws.read_handshake_str()!
139125
ws.check_handshake_response(msg, seckey)!
140-
unsafe { msg.free() }
141126
}
142127

143128
// 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
154139
if lines[i].len <= 0 || lines[i] == '\r\n' {
155140
continue
156141
}
157-
keys := lines[i].split(':')
158-
match keys[0] {
159-
'Upgrade', 'upgrade' {
142+
keys := lines[i].split(':').map(it.trim_space())
143+
match keys[0].to_lower() {
144+
'upgrade' {
160145
ws.flags << .has_upgrade
161146
}
162-
'Connection', 'connection' {
147+
'connection' {
163148
ws.flags << .has_connection
164149
}
165-
'Sec-WebSocket-Accept', 'sec-websocket-accept' {
150+
'sec-websocket-accept' {
166151
ws.debug_log('seckey: ${seckey}')
167152
challenge := create_key_challenge_response(seckey)!
168153
ws.debug_log('challenge: ${challenge}, response: ${keys[1]}')
@@ -171,13 +156,10 @@ fn (mut ws Client) check_handshake_response(handshake_response string, seckey st
171156
7)
172157
}
173158
ws.flags << .has_accept
174-
unsafe { challenge.free() }
175159
}
176160
else {}
177161
}
178-
unsafe { keys.free() }
179162
}
180-
unsafe { lines.free() }
181163
if ws.flags.len < 3 {
182164
ws.close(1002, 'invalid websocket HTTP headers')!
183165
return error_with_code('invalid websocket HTTP headers', 8)

0 commit comments

Comments
 (0)