1- [manualfree ]
21module websocket
32
43import 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
4338fn (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 {
137123fn (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