Class: Tubesock
- Inherits:
-
Object
show all
- Defined in:
- lib/tubesock.rb,
lib/tubesock/hijack.rb,
lib/tubesock/version.rb
Defined Under Namespace
Modules: Hijack
Classes: HijackNotAvailable
Constant Summary
collapse
- VERSION =
"0.1.0"
Class Method Summary
collapse
Instance Method Summary
collapse
Constructor Details
#initialize(socket, version) ⇒ Tubesock
Returns a new instance of Tubesock.
8
9
10
11
|
# File 'lib/tubesock.rb', line 8
def initialize(socket, version)
@socket = socket
@version = version
end
|
Class Method Details
.hijack(env) ⇒ Object
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
# File 'lib/tubesock.rb', line 13
def self.hijack(env)
if env['rack.hijack']
env['rack.hijack'].call
socket = env['rack.hijack_io']
handshake = WebSocket::Handshake::Server.new
handshake.["sec-websocket-version"] = env["HTTP_SEC_WEBSOCKET_VERSION"]
handshake.["sec-websocket-draft"] = env["HTTP_SEC_WEBSOCKET_DRAFT"]
handshake.["sec-websocket-key"] = env["HTTP_SEC_WEBSOCKET_KEY"]
handshake.["sec-websocket-extensions"] = env["HTTP_SEC_WEBSOCKET_EXTENSIONS"]
handshake.["host"] = env["HTTP_HOST"]
handshake.path = env["REQUEST_PATH"]
handshake.query = env["QUERY_STRING"]
handshake.set_version
socket.write handshake.to_s
self.new socket, handshake.version
else
raise Tubesock::HijackNotAvailable
end
end
|
.websocket?(env) ⇒ Boolean
36
37
38
39
40
41
|
# File 'lib/tubesock.rb', line 36
def self.websocket?(env)
env['REQUEST_METHOD'] == 'GET' and
env['HTTP_CONNECTION'] and
env['HTTP_CONNECTION'].split(/\s*,\s*/).include?('Upgrade') and
env['HTTP_UPGRADE'].downcase == 'websocket'
end
|
Instance Method Details
#close ⇒ Object
86
87
88
89
|
# File 'lib/tubesock.rb', line 86
def close
@socket.close if @socket.open?
@closehandler.call
end
|
#listen ⇒ Object
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
# File 'lib/tubesock.rb', line 62
def listen
Thread.new do
Thread.current.abort_on_exception = true
framebuffer = WebSocket::Frame::Incoming::Server.new(version: @version)
running = true
while running
data, addrinfo = @socket.recvfrom(2000)
running = false if data == ""
framebuffer << data
while frame = framebuffer.next
data = frame.data
if data == ""
running = false
else
@messagehandler.call(HashWithIndifferentAccess.new(JSON.load(data))) if @messagehandler
end
end
end
@closehandler.call if @closehandler
@socket.close
end
@openhandler.call if @openhandler
end
|
#onclose(&block) ⇒ Object
58
59
60
|
# File 'lib/tubesock.rb', line 58
def onclose(&block)
@closehandler = block
end
|
#onmessage(&block) ⇒ Object
54
55
56
|
# File 'lib/tubesock.rb', line 54
def onmessage(&block)
@messagehandler = block
end
|
#onopen(&block) ⇒ Object
50
51
52
|
# File 'lib/tubesock.rb', line 50
def onopen(&block)
@openhandler = block
end
|
#send_data(data, type = :text) ⇒ Object
43
44
45
46
47
48
|
# File 'lib/tubesock.rb', line 43
def send_data data, type = :text
frame = WebSocket::Frame::Outgoing::Server.new(version: @version, data: JSON.dump(data), type: type)
@socket.write frame.to_s
rescue IOError
close
end
|