cramp 0.8 → 0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'rainbows'
|
2
|
+
|
3
|
+
class Rainbows::EventMachine::Client
|
4
|
+
include Cramp::Controller::WebsocketExtension
|
5
|
+
|
6
|
+
def websocket_handshake!
|
7
|
+
@state = :websocket
|
8
|
+
end
|
9
|
+
|
10
|
+
def receive_data_with_websocket(data)
|
11
|
+
case @state
|
12
|
+
when :websocket
|
13
|
+
callback = @env[WEBSOCKET_RECEIVE_CALLBACK]
|
14
|
+
callback.call(data) if callback
|
15
|
+
else
|
16
|
+
receive_data_without_websocket(data)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
alias_method_chain :receive_data, :websocket
|
21
|
+
end
|
22
|
+
|
23
|
+
class Rainbows::HttpResponse
|
24
|
+
class << self
|
25
|
+
|
26
|
+
def write_with_magic(socket, rack_response, out = [])
|
27
|
+
if socket.websocket?
|
28
|
+
socket.write socket.websocket_upgrade_data
|
29
|
+
socket.websocket_handshake!
|
30
|
+
|
31
|
+
out = nil # To make sure Rainbows! doesn't send back regular HTTP headers
|
32
|
+
end
|
33
|
+
|
34
|
+
write_without_magic(socket, rack_response, out)
|
35
|
+
end
|
36
|
+
|
37
|
+
alias_method_chain :write, :magic
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
@@ -1,19 +1,20 @@
|
|
1
1
|
require 'thin'
|
2
2
|
|
3
|
-
|
4
|
-
WEBSOCKET_RECEIVE_CALLBACK = 'websocket.receive_callback'.freeze
|
3
|
+
silence_warnings { Thin::Server::DEFAULT_TIMEOUT = 0 }
|
5
4
|
|
5
|
+
class Thin::Connection
|
6
6
|
# Called when data is received from the client.
|
7
7
|
def receive_data(data)
|
8
8
|
trace { data }
|
9
9
|
|
10
10
|
case @serving
|
11
11
|
when :websocket
|
12
|
-
callback = @request.env[WEBSOCKET_RECEIVE_CALLBACK]
|
12
|
+
callback = @request.env[Thin::Request::WEBSOCKET_RECEIVE_CALLBACK]
|
13
13
|
callback.call(data) if callback
|
14
14
|
else
|
15
15
|
if @request.parse(data)
|
16
16
|
if @request.websocket?
|
17
|
+
@response.persistent!
|
17
18
|
@response.websocket_upgrade_data = @request.websocket_upgrade_data
|
18
19
|
@serving = :websocket
|
19
20
|
end
|
@@ -21,7 +22,7 @@ class Thin::Connection
|
|
21
22
|
process
|
22
23
|
end
|
23
24
|
end
|
24
|
-
rescue InvalidRequest => e
|
25
|
+
rescue Thin::InvalidRequest => e
|
25
26
|
log "!! Invalid request"
|
26
27
|
log_error e
|
27
28
|
close_connection
|
@@ -29,22 +30,7 @@ class Thin::Connection
|
|
29
30
|
end
|
30
31
|
|
31
32
|
class Thin::Request
|
32
|
-
|
33
|
-
@env['HTTP_CONNECTION'] == 'Upgrade' && @env['HTTP_UPGRADE'] == 'WebSocket'
|
34
|
-
end
|
35
|
-
|
36
|
-
# upgrade headers for websocket connections
|
37
|
-
def websocket_upgrade_data
|
38
|
-
location = "ws://#{@env['HTTP_HOST']}#{@env['REQUEST_PATH']}"
|
39
|
-
|
40
|
-
upgrade = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n"
|
41
|
-
upgrade << "Upgrade: WebSocket\r\n"
|
42
|
-
upgrade << "Connection: Upgrade\r\n"
|
43
|
-
upgrade << "WebSocket-Origin: #{@env['HTTP_ORIGIN']}\r\n"
|
44
|
-
upgrade << "WebSocket-Location: #{location}\r\n\r\n"
|
45
|
-
|
46
|
-
upgrade
|
47
|
-
end
|
33
|
+
include Cramp::Controller::WebsocketExtension
|
48
34
|
end
|
49
35
|
|
50
36
|
class Thin::Response
|
@@ -1,5 +1,25 @@
|
|
1
1
|
module Cramp
|
2
2
|
module Controller
|
3
|
+
module WebsocketExtension
|
4
|
+
WEBSOCKET_RECEIVE_CALLBACK = 'websocket.receive_callback'.freeze
|
5
|
+
|
6
|
+
def websocket?
|
7
|
+
@env['HTTP_CONNECTION'] == 'Upgrade' && @env['HTTP_UPGRADE'] == 'WebSocket'
|
8
|
+
end
|
9
|
+
|
10
|
+
def websocket_upgrade_data
|
11
|
+
location = "ws://#{@env['HTTP_HOST']}#{@env['REQUEST_PATH']}"
|
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: #{@env['HTTP_ORIGIN']}\r\n"
|
17
|
+
upgrade << "WebSocket-Location: #{location}\r\n\r\n"
|
18
|
+
|
19
|
+
upgrade
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
3
23
|
class Websocket < Abstract
|
4
24
|
|
5
25
|
include PeriodicTimer
|
@@ -9,7 +29,7 @@ module Cramp
|
|
9
29
|
|
10
30
|
class << self
|
11
31
|
def backend=(backend)
|
12
|
-
raise "Websocket backend #{backend} is unknown" unless [:thin].include?(backend.to_sym)
|
32
|
+
raise "Websocket backend #{backend} is unknown" unless [:thin, :rainbows].include?(backend.to_sym)
|
13
33
|
require "cramp/controller/websocket/#{backend}_backend.rb"
|
14
34
|
end
|
15
35
|
|
data/lib/cramp.rb
CHANGED
@@ -2,11 +2,12 @@ require 'eventmachine'
|
|
2
2
|
EM.epoll
|
3
3
|
|
4
4
|
require 'active_support'
|
5
|
-
require 'active_support/core_ext'
|
5
|
+
require 'active_support/core_ext/class/inheritable_attributes'
|
6
|
+
require 'active_support/core_ext/class/attribute_accessors'
|
7
|
+
require 'active_support/core_ext/module/aliasing'
|
8
|
+
require 'active_support/core_ext/kernel/reporting'
|
6
9
|
require 'active_support/concern'
|
7
10
|
|
8
|
-
require 'cramp/core_ext'
|
9
|
-
|
10
11
|
module Cramp
|
11
|
-
VERSION = '0.
|
12
|
+
VERSION = '0.9'
|
12
13
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cramp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: "0.
|
4
|
+
version: "0.9"
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pratik Naik
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-01-
|
12
|
+
date: 2010-01-11 00:00:00 +05:30
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -100,10 +100,10 @@ files:
|
|
100
100
|
- lib/cramp/controller/periodic_timer.rb
|
101
101
|
- lib/cramp/controller/rendering.rb
|
102
102
|
- lib/cramp/controller/test_case.rb
|
103
|
+
- lib/cramp/controller/websocket/rainbows_backend.rb
|
103
104
|
- lib/cramp/controller/websocket/thin_backend.rb
|
104
105
|
- lib/cramp/controller/websocket.rb
|
105
106
|
- lib/cramp/controller.rb
|
106
|
-
- lib/cramp/core_ext.rb
|
107
107
|
- lib/cramp/model/arel_monkey_patches.rb
|
108
108
|
- lib/cramp/model/attribute.rb
|
109
109
|
- lib/cramp/model/attribute_methods.rb
|
data/lib/cramp/core_ext.rb
DELETED