stomping_ground-celluloid 0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,6 @@
1
+ require 'json'
2
+ require 'celluloid/io'
3
+ require 'fileutils'
4
+
5
+ require 'stomping_ground/server'
6
+ require 'stomping_ground/connection'
@@ -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
@@ -0,0 +1,5 @@
1
+ module StompingGround
2
+ MAJOR=0
3
+ MINOR=1
4
+ VERSION="#{MAJOR}.#{MINOR}"
5
+ 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: []