ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/ext/tcp_websocket.ext
Revision: 1.3
Committed: Tue Nov 6 15:11:16 2012 UTC (11 years, 6 months ago) by root
Branch: MAIN
Changes since 1.2: +2 -2 lines
Log Message:
*** empty log message ***

File Contents

# Content
1 #! perl # mandatory depends=tcp
2
3 # websocket protocol server, actually only the handshake part
4
5 use Digest::SHA1 ();
6
7 # websocket requests can be very long, and we want the tcp code to buffer for us
8 our $detector = ext::tcp::register websocket => 4096, sub {
9 m{^(?i:GET) \ (?i:http://[^/]+)? /ws \ (?:(?i)HTTP/[0-9\.]+).*\015\012\015\012}xs
10 }, sub {
11 my ($id, $fh, $buf) = @_;
12
13 $buf =~ /^Sec-WebSocket-Version\s*:\s*([0-9]+)/mi
14 or return;
15 my $version = $1; # 8=ff10, 13=rfc
16
17 $buf =~ /^Sec-WebSocket-Key\s*:\s*(\S+)/mi
18 or return;
19 my $key = $1;
20
21 if ($version != 8 && $version != 13) {
22 syswrite $fh, "HTTP/1.1 400 version mismatch\015\012"
23 . "connection: close\015\012"
24 . "sec-websocket-version: 13, 8\015\012\015\012";
25 return;
26 }
27
28 my $res = "HTTP/1.1 101 upgrading\015\012"
29 . "connection: upgrade\015\012"
30 . "upgrade: websocket\015\012"
31 . "sec-websocket-accept: " . (Digest::SHA1::sha1_base64 $key . "258EAFA5-E914-47DA-95CA-C5AB0DC85B11") . "=\015\012"
32 . "\015\012";
33
34 syswrite $fh, $res;
35
36 my $ns = cf::client::create fileno $_[1], $_[0];
37 $ns->ws_version ($version);
38 $ns->run;
39 };
40