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

# User Rev Content
1 root 1.1 #! perl # mandatory depends=tcp
2    
3 root 1.2 # websocket protocol server, actually only the handshake part
4    
5     use Digest::SHA1 ();
6 root 1.1
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 root 1.3 m{^(?i:GET) \ (?i:http://[^/]+)? /ws \ (?:(?i)HTTP/[0-9\.]+).*\015\012\015\012}xs
10 root 1.1 }, sub {
11 root 1.2 my ($id, $fh, $buf) = @_;
12    
13     $buf =~ /^Sec-WebSocket-Version\s*:\s*([0-9]+)/mi
14     or return;
15 root 1.3 my $version = $1; # 8=ff10, 13=rfc
16 root 1.2
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 root 1.1 };
40