cool.io-websocket 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,103 @@
1
+ require 'digest/md5'
2
+
3
+ module Coolio
4
+ class WebSocket < TCPSocket
5
+
6
+ module Spec75
7
+ protected
8
+
9
+ def handshake
10
+ schema = (ssl? ? 'wss' : 'ws')
11
+ location = "#{schema}://#{@request['HTTP_HOST']}#{@request['REQUEST_URI']}"
12
+
13
+ upgrade = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n"
14
+ upgrade << "Upgrade: WebSocket\r\n"
15
+ upgrade << "Connection: Upgrade\r\n"
16
+ upgrade << "WebSocket-Origin: #{@request['HTTP_ORIGIN']}\r\n"
17
+ upgrade << "WebSocket-Location: #{location}\r\n\r\n"
18
+
19
+ write upgrade
20
+
21
+ return true # opened
22
+ end
23
+ end
24
+
25
+ module Spec76
26
+ protected
27
+
28
+ def handshake
29
+ @state_save = @state
30
+ @state = :process_challenge_response
31
+
32
+ return false # not yet opened
33
+ end
34
+
35
+ def process_challenge_response
36
+ return false if @data.size < 8
37
+
38
+ key_3 = @data.read(8)
39
+
40
+ @state = remove_instance_variable(:@state_save)
41
+
42
+ challenge_response = do_challenge_response(
43
+ @request['HTTP_SEC_WEBSOCKET_KEY1'],
44
+ @request['HTTP_SEC_WEBSOCKET_KEY2'],
45
+ key_3)
46
+
47
+ schema = (ssl? ? 'wss' : 'ws')
48
+ location = "#{schema}://#{@request['HTTP_HOST']}#{@request['REQUEST_URI']}"
49
+
50
+ upgrade = "HTTP/1.1 101 WebSocket Protocol Handshake\r\n"
51
+ upgrade << "Upgrade: WebSocket\r\n"
52
+ upgrade << "Connection: Upgrade\r\n"
53
+ upgrade << "Sec-WebSocket-Location: #{location}\r\n"
54
+ upgrade << "Sec-WebSocket-Origin: #{@request['HTTP_ORIGIN']}\r\n"
55
+ if proto = @request['HTTP_SEC_WEBSOCKET_PROTOCOL']
56
+ # FIXME server is requed to confirm the subprotocol of the connection
57
+ upgrade << "Sec-WebSocket-Protocol: #{proto}\r\n"
58
+ end
59
+ upgrade << "\r\n"
60
+ upgrade << challenge_response
61
+
62
+ write upgrade
63
+
64
+ on_open
65
+
66
+ return true
67
+
68
+ rescue
69
+ on_bad_request
70
+ return false
71
+ end
72
+
73
+ private
74
+ def do_challenge_response(key_1, key_2, key_3)
75
+ key_number_1 = key_1.scan(/[0-9]/).join.to_i
76
+ key_number_2 = key_2.scan(/[0-9]/).join.to_i
77
+ spaces_1 = key_1.count(' ')
78
+ spaces_2 = key_2.count(' ')
79
+
80
+ if spaces_1 == 0 || spaces_2 == 0
81
+ raise RuntimeError, "invalid challenge key"
82
+ end
83
+
84
+ if key_number_1 % spaces_1 != 0 || key_number_2 % spaces_2 != 0
85
+ raise RuntimeError, "invalid challenge key"
86
+ end
87
+
88
+ part_1 = key_number_1 / spaces_1
89
+ part_2 = key_number_2 / spaces_2
90
+
91
+ challenge = [part_1, part_2].pack('NN') + key_3[0,8]
92
+ response = Digest::MD5.digest(challenge)
93
+
94
+ return response
95
+
96
+ rescue
97
+ on_bad_request
98
+ end
99
+ end
100
+
101
+ end
102
+ end
103
+
metadata ADDED
@@ -0,0 +1,121 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cool.io-websocket
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 1
8
+ - 4
9
+ version: 0.1.4
10
+ platform: ruby
11
+ authors:
12
+ - FURUHASHI Sadayuki
13
+ - Max Justus Spransy
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-01-15 00:00:00 -06:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: cool.io
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ segments:
30
+ - 0
31
+ - 3
32
+ - 2
33
+ version: 0.3.2
34
+ type: :runtime
35
+ version_requirements: *id001
36
+ - !ruby/object:Gem::Dependency
37
+ name: thin
38
+ prerelease: false
39
+ requirement: &id002 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ segments:
45
+ - 1
46
+ - 2
47
+ - 7
48
+ version: 1.2.7
49
+ type: :runtime
50
+ version_requirements: *id002
51
+ description: Cool.io-WebSocket is a WebSocket server implementation based on Cool.io, a high performance event-driven I/O library for Ruby. This library conforms to WebSocket draft-75 and draft-76.
52
+ email: frsyuki@users.sourceforge.jp
53
+ executables: []
54
+
55
+ extensions: []
56
+
57
+ extra_rdoc_files:
58
+ - ChangeLog
59
+ - README.rdoc
60
+ files:
61
+ - ChangeLog
62
+ - README.rdoc
63
+ - Rakefile
64
+ - VERSION
65
+ - examples/README.md
66
+ - examples/echo
67
+ - examples/echo.rb
68
+ - examples/public/echo.css
69
+ - examples/public/echo.html
70
+ - examples/public/js/FABridge.js
71
+ - examples/public/js/WebSocketMain.swf
72
+ - examples/public/js/jquery.min.js
73
+ - examples/public/js/json2.js
74
+ - examples/public/js/swfobject.js
75
+ - examples/public/js/web_socket.js
76
+ - examples/public/shoutchat.css
77
+ - examples/public/shoutchat.html
78
+ - examples/rpc
79
+ - examples/rpc.rb
80
+ - examples/shoutchat
81
+ - examples/shoutchat.rb
82
+ - examples/views/rpc.erb
83
+ - lib/cool.io-websocket.rb
84
+ - lib/coolio/websocket.rb
85
+ - lib/coolio/websocket/spec.rb
86
+ has_rdoc: true
87
+ homepage: http://github.com/maxjustus/cool.io-websocket
88
+ licenses: []
89
+
90
+ post_install_message:
91
+ rdoc_options: []
92
+
93
+ require_paths:
94
+ - lib
95
+ required_ruby_version: !ruby/object:Gem::Requirement
96
+ none: false
97
+ requirements:
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ segments:
101
+ - 0
102
+ version: "0"
103
+ required_rubygems_version: !ruby/object:Gem::Requirement
104
+ none: false
105
+ requirements:
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ segments:
109
+ - 0
110
+ version: "0"
111
+ requirements: []
112
+
113
+ rubyforge_project:
114
+ rubygems_version: 1.3.7
115
+ signing_key:
116
+ specification_version: 3
117
+ summary: WebSocket server based on Coolio
118
+ test_files:
119
+ - examples/echo.rb
120
+ - examples/rpc.rb
121
+ - examples/shoutchat.rb