stomping_ground-celluloid 0.1
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.
- data/lib/stomping_ground.rb +6 -0
- data/lib/stomping_ground/connection.rb +114 -0
- data/lib/stomping_ground/server.rb +39 -0
- data/lib/stomping_ground/version.rb +5 -0
- metadata +150 -0
@@ -0,0 +1,114 @@
|
|
1
|
+
module StompingGround
|
2
|
+
class Connection
|
3
|
+
attr_accessor :server, :socket, :frame, :frame_info
|
4
|
+
|
5
|
+
def initialize(server, socket)
|
6
|
+
@server = server
|
7
|
+
@socket = socket
|
8
|
+
end
|
9
|
+
|
10
|
+
def handle
|
11
|
+
loop do
|
12
|
+
break if @socket.closed?
|
13
|
+
|
14
|
+
data = @socket.readpartial 4096
|
15
|
+
|
16
|
+
append_data(data)
|
17
|
+
|
18
|
+
each_frame do |frame|
|
19
|
+
@frame = frame
|
20
|
+
@frame_info = parse(frame)
|
21
|
+
case frame_info[:command]
|
22
|
+
when "CONNECT"
|
23
|
+
connect_frame
|
24
|
+
when "SUBSCRIBE"
|
25
|
+
subscribe_frame
|
26
|
+
when "DISCONNECT"
|
27
|
+
disconnect_frame
|
28
|
+
when "SEND"
|
29
|
+
send_frame
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
rescue EOFError
|
34
|
+
@socket.close
|
35
|
+
end
|
36
|
+
|
37
|
+
def connect_frame
|
38
|
+
write "CONNECTED\n"
|
39
|
+
write "version:1.1\n"
|
40
|
+
write "heart-beat:0,0\n" if frame_info[:'heart-beat']
|
41
|
+
write "\n"
|
42
|
+
write "\0"
|
43
|
+
end
|
44
|
+
|
45
|
+
def subscribe_frame
|
46
|
+
if @server.queue_name.nil? || frame_info[:destination] == @server.queue_name
|
47
|
+
message = @server.message_body || "hello"
|
48
|
+
write "MESSAGE\n"
|
49
|
+
write "subscription:#{frame_info[:id]}\n"
|
50
|
+
write "message-id:007\n"
|
51
|
+
write "destination:#{frame_info[:destination]}\n"
|
52
|
+
write "content-type:text/plain\n"
|
53
|
+
write "content-length:#{message.length}\n"
|
54
|
+
write "\n"
|
55
|
+
write "#{message}\0"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def disconnect_frame
|
60
|
+
if frame_info[:'receipt-id']
|
61
|
+
write "RECEIPT\n"
|
62
|
+
write "receipt-id:#{frame_info[:'receipt-id']}\n"
|
63
|
+
write "\0"
|
64
|
+
end
|
65
|
+
@socket.close
|
66
|
+
end
|
67
|
+
|
68
|
+
def send_frame
|
69
|
+
filename = sent_message_filename_for(frame)
|
70
|
+
if filename
|
71
|
+
dirname = File.dirname(filename)
|
72
|
+
FileUtils.mkdir_p(dirname) if !File.exists?(dirname)
|
73
|
+
File.open(filename, "w") { |file| file.write(frame) }
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def write(data)
|
78
|
+
@socket.write data
|
79
|
+
end
|
80
|
+
|
81
|
+
private
|
82
|
+
|
83
|
+
def sent_message_filename_for(frame)
|
84
|
+
return nil unless @server.sent_message_dir
|
85
|
+
md5 = OpenSSL::Digest::MD5.new(frame)
|
86
|
+
"#{@server.sent_message_dir}/#{md5}.msg"
|
87
|
+
end
|
88
|
+
|
89
|
+
def parse(frame)
|
90
|
+
frame_info = {}
|
91
|
+
data_array = frame.split("\n").reject { |line| line =~ /^\s+$/ }
|
92
|
+
frame_info[:command] = data_array.shift
|
93
|
+
data_array.each do |info|
|
94
|
+
if info.include?(':')
|
95
|
+
frame_info[info.split(':')[0].to_sym] = info.split(':')[1]
|
96
|
+
end
|
97
|
+
end
|
98
|
+
frame_info
|
99
|
+
end
|
100
|
+
|
101
|
+
def append_data data
|
102
|
+
(@data ||= '') << data
|
103
|
+
end
|
104
|
+
|
105
|
+
def each_frame(&block)
|
106
|
+
while eoframe = @data.index("\0")
|
107
|
+
block.call(@data.slice!(0, eoframe + 1))
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
114
|
+
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module StompingGround
|
2
|
+
class Server
|
3
|
+
include Celluloid::IO
|
4
|
+
|
5
|
+
attr_accessor :message_body
|
6
|
+
attr_accessor :queue_name
|
7
|
+
attr_accessor :sent_message_dir
|
8
|
+
|
9
|
+
def initialize(host, port, options = {})
|
10
|
+
@host = host
|
11
|
+
@port = port
|
12
|
+
|
13
|
+
@message_body = options[:message]
|
14
|
+
@queue_name = options[:queue_name]
|
15
|
+
@sent_message_dir = options[:sent_message_dir]
|
16
|
+
|
17
|
+
@server = TCPServer.new(@host, @port)
|
18
|
+
|
19
|
+
async.run
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.start(*opts)
|
23
|
+
supervise(*opts)
|
24
|
+
end
|
25
|
+
|
26
|
+
def run
|
27
|
+
loop { async.handle_connection @server.accept }
|
28
|
+
end
|
29
|
+
|
30
|
+
def handle_connection(socket)
|
31
|
+
Connection.new(self, socket).handle
|
32
|
+
end
|
33
|
+
|
34
|
+
def finalize
|
35
|
+
@server.close if @server
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
metadata
ADDED
@@ -0,0 +1,150 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: stomping_ground-celluloid
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '0.1'
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Francisco Trindade
|
9
|
+
- Geoffrey Giesemann
|
10
|
+
- Emilien Taque
|
11
|
+
autorequire:
|
12
|
+
bindir: bin
|
13
|
+
cert_chain: []
|
14
|
+
date: 2013-01-03 00:00:00.000000000 Z
|
15
|
+
dependencies:
|
16
|
+
- !ruby/object:Gem::Dependency
|
17
|
+
name: onstomp
|
18
|
+
requirement: !ruby/object:Gem::Requirement
|
19
|
+
none: false
|
20
|
+
requirements:
|
21
|
+
- - ! '>='
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: '0'
|
24
|
+
type: :development
|
25
|
+
prerelease: false
|
26
|
+
version_requirements: !ruby/object:Gem::Requirement
|
27
|
+
none: false
|
28
|
+
requirements:
|
29
|
+
- - ! '>='
|
30
|
+
- !ruby/object:Gem::Version
|
31
|
+
version: '0'
|
32
|
+
- !ruby/object:Gem::Dependency
|
33
|
+
name: rspec
|
34
|
+
requirement: !ruby/object:Gem::Requirement
|
35
|
+
none: false
|
36
|
+
requirements:
|
37
|
+
- - ! '>='
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0'
|
40
|
+
type: :development
|
41
|
+
prerelease: false
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
none: false
|
44
|
+
requirements:
|
45
|
+
- - ! '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: json
|
50
|
+
requirement: !ruby/object:Gem::Requirement
|
51
|
+
none: false
|
52
|
+
requirements:
|
53
|
+
- - ! '>='
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
56
|
+
type: :development
|
57
|
+
prerelease: false
|
58
|
+
version_requirements: !ruby/object:Gem::Requirement
|
59
|
+
none: false
|
60
|
+
requirements:
|
61
|
+
- - ! '>='
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: '0'
|
64
|
+
- !ruby/object:Gem::Dependency
|
65
|
+
name: rake
|
66
|
+
requirement: !ruby/object:Gem::Requirement
|
67
|
+
none: false
|
68
|
+
requirements:
|
69
|
+
- - ! '>='
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: '0'
|
72
|
+
type: :development
|
73
|
+
prerelease: false
|
74
|
+
version_requirements: !ruby/object:Gem::Requirement
|
75
|
+
none: false
|
76
|
+
requirements:
|
77
|
+
- - ! '>='
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: '0'
|
80
|
+
- !ruby/object:Gem::Dependency
|
81
|
+
name: pry
|
82
|
+
requirement: !ruby/object:Gem::Requirement
|
83
|
+
none: false
|
84
|
+
requirements:
|
85
|
+
- - ! '>='
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '0'
|
88
|
+
type: :development
|
89
|
+
prerelease: false
|
90
|
+
version_requirements: !ruby/object:Gem::Requirement
|
91
|
+
none: false
|
92
|
+
requirements:
|
93
|
+
- - ! '>='
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '0'
|
96
|
+
- !ruby/object:Gem::Dependency
|
97
|
+
name: celluloid-io
|
98
|
+
requirement: !ruby/object:Gem::Requirement
|
99
|
+
none: false
|
100
|
+
requirements:
|
101
|
+
- - ! '>='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
none: false
|
108
|
+
requirements:
|
109
|
+
- - ! '>='
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '0'
|
112
|
+
description:
|
113
|
+
email:
|
114
|
+
- francisco.trindade@rea-group.com
|
115
|
+
- geoffrey.giesemann@rea-group.com
|
116
|
+
- e.taque@alphalink.fr
|
117
|
+
executables: []
|
118
|
+
extensions: []
|
119
|
+
extra_rdoc_files: []
|
120
|
+
files:
|
121
|
+
- lib/stomping_ground/connection.rb
|
122
|
+
- lib/stomping_ground/server.rb
|
123
|
+
- lib/stomping_ground/version.rb
|
124
|
+
- lib/stomping_ground.rb
|
125
|
+
homepage: http://github.com/etaque/stomping_ground
|
126
|
+
licenses: []
|
127
|
+
post_install_message:
|
128
|
+
rdoc_options: []
|
129
|
+
require_paths:
|
130
|
+
- lib
|
131
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
132
|
+
none: false
|
133
|
+
requirements:
|
134
|
+
- - ! '>='
|
135
|
+
- !ruby/object:Gem::Version
|
136
|
+
version: '0'
|
137
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
138
|
+
none: false
|
139
|
+
requirements:
|
140
|
+
- - ! '>='
|
141
|
+
- !ruby/object:Gem::Version
|
142
|
+
version: '0'
|
143
|
+
requirements: []
|
144
|
+
rubyforge_project:
|
145
|
+
rubygems_version: 1.8.24
|
146
|
+
signing_key:
|
147
|
+
specification_version: 3
|
148
|
+
summary: Mock Stomp server to be used when testing stomp consumers, Celluloid::IO
|
149
|
+
version.
|
150
|
+
test_files: []
|