cramp 0.7 → 0.8
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,62 @@
|
|
1
|
+
require 'thin'
|
2
|
+
|
3
|
+
class Thin::Connection
|
4
|
+
WEBSOCKET_RECEIVE_CALLBACK = 'websocket.receive_callback'.freeze
|
5
|
+
|
6
|
+
# Called when data is received from the client.
|
7
|
+
def receive_data(data)
|
8
|
+
trace { data }
|
9
|
+
|
10
|
+
case @serving
|
11
|
+
when :websocket
|
12
|
+
callback = @request.env[WEBSOCKET_RECEIVE_CALLBACK]
|
13
|
+
callback.call(data) if callback
|
14
|
+
else
|
15
|
+
if @request.parse(data)
|
16
|
+
if @request.websocket?
|
17
|
+
@response.websocket_upgrade_data = @request.websocket_upgrade_data
|
18
|
+
@serving = :websocket
|
19
|
+
end
|
20
|
+
|
21
|
+
process
|
22
|
+
end
|
23
|
+
end
|
24
|
+
rescue InvalidRequest => e
|
25
|
+
log "!! Invalid request"
|
26
|
+
log_error e
|
27
|
+
close_connection
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
class Thin::Request
|
32
|
+
def websocket?
|
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
|
48
|
+
end
|
49
|
+
|
50
|
+
class Thin::Response
|
51
|
+
# Headers for sending Websocket upgrade
|
52
|
+
attr_accessor :websocket_upgrade_data
|
53
|
+
|
54
|
+
def each
|
55
|
+
websocket_upgrade_data ? yield(websocket_upgrade_data) : yield(head)
|
56
|
+
if @body.is_a?(String)
|
57
|
+
yield @body
|
58
|
+
else
|
59
|
+
@body.each { |chunk| yield chunk }
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Cramp
|
2
|
+
module Controller
|
3
|
+
class Websocket < Abstract
|
4
|
+
|
5
|
+
include PeriodicTimer
|
6
|
+
|
7
|
+
class_inheritable_accessor :on_data_callbacks, :instance_reader => false
|
8
|
+
self.on_data_callbacks = []
|
9
|
+
|
10
|
+
class << self
|
11
|
+
def backend=(backend)
|
12
|
+
raise "Websocket backend #{backend} is unknown" unless [:thin].include?(backend.to_sym)
|
13
|
+
require "cramp/controller/websocket/#{backend}_backend.rb"
|
14
|
+
end
|
15
|
+
|
16
|
+
def on_data(*methods)
|
17
|
+
self.on_data_callbacks += methods
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def process
|
22
|
+
@env['websocket.receive_callback'] = method(:_on_data_receive)
|
23
|
+
super
|
24
|
+
end
|
25
|
+
|
26
|
+
def render(body)
|
27
|
+
@body.call("\x00#{body}\xff")
|
28
|
+
end
|
29
|
+
|
30
|
+
def _on_data_receive(data)
|
31
|
+
data = data.slice(/\000([^\377]*)\377/).gsub(/^\x00|\xff$/, '')
|
32
|
+
|
33
|
+
self.on_data_callbacks.each do |callback|
|
34
|
+
EM.next_tick { send(callback, data) }
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/lib/cramp/controller.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
require 'cramp'
|
2
|
-
require 'usher'
|
3
2
|
require 'rack'
|
4
3
|
|
5
4
|
module Cramp
|
6
5
|
module Controller
|
7
6
|
autoload :Action, "cramp/controller/action"
|
7
|
+
autoload :Websocket, "cramp/controller/websocket"
|
8
8
|
autoload :Body, "cramp/controller/body"
|
9
9
|
autoload :PeriodicTimer, "cramp/controller/periodic_timer"
|
10
10
|
autoload :KeepConnectionAlive, "cramp/controller/keep_connection_alive"
|
data/lib/cramp.rb
CHANGED
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.8"
|
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-10 00:00:00 +05:30
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -50,7 +50,7 @@ dependencies:
|
|
50
50
|
requirements:
|
51
51
|
- - ~>
|
52
52
|
- !ruby/object:Gem::Version
|
53
|
-
version: 1.
|
53
|
+
version: 1.1.0
|
54
54
|
version:
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: mysqlplus
|
@@ -100,6 +100,8 @@ 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/thin_backend.rb
|
104
|
+
- lib/cramp/controller/websocket.rb
|
103
105
|
- lib/cramp/controller.rb
|
104
106
|
- lib/cramp/core_ext.rb
|
105
107
|
- lib/cramp/model/arel_monkey_patches.rb
|