carnivore-http 0.2.0 → 0.2.2
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -1
- data/Gemfile.lock +6 -9
- data/lib/carnivore-http/http_paths.rb +39 -5
- data/lib/carnivore-http/http_source.rb +8 -4
- data/lib/carnivore-http/version.rb +1 -1
- data/test/specs/paths.rb +41 -4
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 2f249ff2bcc32e656dea42855b1c9f5002c7f7c5
|
|
4
|
+
data.tar.gz: da5167bc1fa804b63b741da4bea7483d2d544653
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 5f6975483b01d2f7060cc6d213bd9513eb345b4c268fe0ddb0ab76b5a81026edb4bf421dcdb6fa07746ec647a3e9dd09f21a8846268e2dee8e90f0bdb4bacc1f
|
|
7
|
+
data.tar.gz: f1d1f7147463224541388146d95c9e19e7a4f8a5d86f045fa947e15c5f2db939e4655475bd476d8ab7ac05b24e0d8157cc2aedbc73ac5d8f29103132ca02843b
|
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
carnivore-http (0.1
|
|
4
|
+
carnivore-http (0.2.1)
|
|
5
5
|
blockenspiel
|
|
6
6
|
carnivore (>= 0.1.8)
|
|
7
7
|
htauth
|
|
@@ -12,15 +12,15 @@ GEM
|
|
|
12
12
|
specs:
|
|
13
13
|
attribute_struct (0.2.8)
|
|
14
14
|
blockenspiel (0.4.5)
|
|
15
|
-
bogo (0.1.
|
|
15
|
+
bogo (0.1.8)
|
|
16
16
|
hashie
|
|
17
17
|
multi_json
|
|
18
|
-
bogo-config (0.1.
|
|
18
|
+
bogo-config (0.1.8)
|
|
19
19
|
attribute_struct
|
|
20
20
|
bogo (>= 0.1.4, < 1.0)
|
|
21
21
|
multi_json
|
|
22
22
|
multi_xml
|
|
23
|
-
carnivore (0.3.
|
|
23
|
+
carnivore (0.3.6)
|
|
24
24
|
bogo-config
|
|
25
25
|
celluloid
|
|
26
26
|
hashie
|
|
@@ -31,21 +31,18 @@ GEM
|
|
|
31
31
|
celluloid (>= 0.16.0)
|
|
32
32
|
nio4r (>= 1.1.0)
|
|
33
33
|
form_data (0.1.0)
|
|
34
|
-
hashie (3.
|
|
35
|
-
highline (1.
|
|
34
|
+
hashie (3.4.0)
|
|
35
|
+
highline (1.7.0)
|
|
36
36
|
hitimes (1.2.2)
|
|
37
|
-
hitimes (1.2.2-java)
|
|
38
37
|
htauth (1.1.0)
|
|
39
38
|
highline (~> 1.6)
|
|
40
39
|
http (0.7.1)
|
|
41
40
|
form_data (~> 0.1.0)
|
|
42
41
|
http_parser.rb (~> 0.6.0)
|
|
43
42
|
http_parser.rb (0.6.0)
|
|
44
|
-
http_parser.rb (0.6.0-java)
|
|
45
43
|
multi_json (1.10.1)
|
|
46
44
|
multi_xml (0.5.5)
|
|
47
45
|
nio4r (1.1.0)
|
|
48
|
-
nio4r (1.1.0-java)
|
|
49
46
|
reel (0.5.0)
|
|
50
47
|
celluloid (>= 0.15.1)
|
|
51
48
|
celluloid-io (>= 0.15.0)
|
|
@@ -7,6 +7,11 @@ module Carnivore
|
|
|
7
7
|
# Carnivore HTTP paths
|
|
8
8
|
class HttpPaths < HttpSource
|
|
9
9
|
|
|
10
|
+
# Default max wait time for message response
|
|
11
|
+
DEFAULT_RESPONSE_TIMEOUT = 10
|
|
12
|
+
# Default response wait time stepping
|
|
13
|
+
DEFAULT_RESPONSE_WAIT_STEP = 0.1
|
|
14
|
+
|
|
10
15
|
finalizer :halt_listener
|
|
11
16
|
include Bogo::Memoization
|
|
12
17
|
|
|
@@ -32,9 +37,14 @@ module Carnivore
|
|
|
32
37
|
if(message_queues[queue_key])
|
|
33
38
|
raise ArgumentError.new "Conflicting HTTP path source provided! path: #{http_path} method: #{http_method}"
|
|
34
39
|
else
|
|
35
|
-
message_queues[queue_key] =
|
|
40
|
+
message_queues[queue_key] = Smash.new(
|
|
41
|
+
:queue => Queue.new
|
|
42
|
+
)
|
|
36
43
|
end
|
|
37
44
|
super
|
|
45
|
+
message_queues[queue_key].merge!(
|
|
46
|
+
Smash.new(:config => args.to_smash)
|
|
47
|
+
)
|
|
38
48
|
end
|
|
39
49
|
|
|
40
50
|
# Setup the HTTP listener source
|
|
@@ -66,11 +76,35 @@ module Carnivore
|
|
|
66
76
|
con.each_request do |req|
|
|
67
77
|
begin
|
|
68
78
|
msg = build_message(con, req)
|
|
69
|
-
|
|
79
|
+
# Start with static path lookup since it's the
|
|
80
|
+
# cheapest, then fallback to iterative globbing
|
|
81
|
+
msg_queue = nil
|
|
82
|
+
unless(msg_queue = message_queues["#{req.path}-#{req.method.to_s.downcase}"])
|
|
83
|
+
message_queues.each do |k,v|
|
|
84
|
+
path_glob, http_method = k.split('-')
|
|
85
|
+
if(req.method.to_s.downcase == http_method && File.fnmatch(path_glob, req.path))
|
|
86
|
+
msg_queue = v
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
70
90
|
if(msg_queue)
|
|
71
91
|
if(authorized?(msg))
|
|
72
|
-
msg_queue << msg
|
|
73
|
-
|
|
92
|
+
msg_queue[:queue] << msg
|
|
93
|
+
if(msg_queue[:config][:auto_respond])
|
|
94
|
+
code = msg_queue[:config].fetch(:response, :code, 'ok').to_sym
|
|
95
|
+
response = msg_queue[:config].fetch(:response, :message, 'So long and thanks for all the fish!')
|
|
96
|
+
req.respond(code, response)
|
|
97
|
+
else
|
|
98
|
+
wait_time = msg_queue[:config].fetch(:response_timeout, DEFAULT_RESPONSE_TIMEOUT).to_f
|
|
99
|
+
wait_step = msg_queue[:config].fetch(:response_wait_step, DEFAULT_RESPONSE_WAIT_STEP).to_f
|
|
100
|
+
while(con.response_state == :headers && wait_time > 0)
|
|
101
|
+
sleep(wait_step)
|
|
102
|
+
wait_time -= wait_step
|
|
103
|
+
end
|
|
104
|
+
if(con.response_state == :headers)
|
|
105
|
+
raise "Timeout has been exceeded waiting for response! (#{msg})"
|
|
106
|
+
end
|
|
107
|
+
end
|
|
74
108
|
else
|
|
75
109
|
req.respond(:unauthorized, 'You are not authorized to perform requested action!')
|
|
76
110
|
end
|
|
@@ -89,7 +123,7 @@ module Carnivore
|
|
|
89
123
|
def receive(*_)
|
|
90
124
|
val = nil
|
|
91
125
|
until(val)
|
|
92
|
-
val = Celluloid::Future.new{ message_queue.pop }.value
|
|
126
|
+
val = Celluloid::Future.new{ message_queue[:queue].pop }.value
|
|
93
127
|
end
|
|
94
128
|
val
|
|
95
129
|
end
|
|
@@ -273,10 +273,14 @@ module Carnivore
|
|
|
273
273
|
# @param args [Hash]
|
|
274
274
|
# @option args [Symbol] :code return code
|
|
275
275
|
def confirm(message, args={})
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
276
|
+
if(message[:message][:connection].response_state != :headers)
|
|
277
|
+
code = args.delete(:code) || :ok
|
|
278
|
+
args[:response_body] = 'Thanks' if code == :ok && args.empty?
|
|
279
|
+
debug "Confirming #{message} with: Code: #{code.inspect} Args: #{args.inspect}"
|
|
280
|
+
message[:message][:request].respond(code, args[:response_body] || args)
|
|
281
|
+
else
|
|
282
|
+
warn "Message was already confimed. Confirmation not sent! (#{message})"
|
|
283
|
+
end
|
|
280
284
|
end
|
|
281
285
|
|
|
282
286
|
# Initialize http listener correctly based on configuration
|
data/test/specs/paths.rb
CHANGED
|
@@ -16,11 +16,12 @@ describe 'Carnivore::Source::Http' do
|
|
|
16
16
|
:path => '/fubar',
|
|
17
17
|
:method => :post,
|
|
18
18
|
:bind => '127.0.0.1',
|
|
19
|
-
:port => '8706'
|
|
19
|
+
:port => '8706',
|
|
20
|
+
:auto_respond => false
|
|
20
21
|
}
|
|
21
22
|
).add_callback(:store) do |message|
|
|
22
23
|
MessageStore.messages.push(message[:message][:body])
|
|
23
|
-
message.confirm!
|
|
24
|
+
message.confirm!(:response_body => 'custom response')
|
|
24
25
|
end
|
|
25
26
|
Carnivore::Source.build(
|
|
26
27
|
:type => :http_paths,
|
|
@@ -33,7 +34,18 @@ describe 'Carnivore::Source::Http' do
|
|
|
33
34
|
}
|
|
34
35
|
).add_callback(:store) do |message|
|
|
35
36
|
MessageStore.messages.push(message[:message][:body])
|
|
36
|
-
|
|
37
|
+
end
|
|
38
|
+
Carnivore::Source.build(
|
|
39
|
+
:type => :http_paths,
|
|
40
|
+
:args => {
|
|
41
|
+
:name => :glob_source,
|
|
42
|
+
:path => '/glob/v*/*',
|
|
43
|
+
:method => :get,
|
|
44
|
+
:bind => '127.0.0.1',
|
|
45
|
+
:port => '8706'
|
|
46
|
+
}
|
|
47
|
+
).add_callback(:store) do |message|
|
|
48
|
+
MessageStore.messages.push(message[:message][:body])
|
|
37
49
|
end
|
|
38
50
|
@runner = Thread.new{ Carnivore.start! }
|
|
39
51
|
source_wait
|
|
@@ -59,7 +71,7 @@ describe 'Carnivore::Source::Http' do
|
|
|
59
71
|
|
|
60
72
|
end
|
|
61
73
|
|
|
62
|
-
describe 'message transmissions' do
|
|
74
|
+
describe 'source message transmissions' do
|
|
63
75
|
|
|
64
76
|
it 'should accept message transmits' do
|
|
65
77
|
Carnivore::Supervisor.supervisor[:fubar_source].transmit('test message')
|
|
@@ -82,6 +94,31 @@ describe 'Carnivore::Source::Http' do
|
|
|
82
94
|
end
|
|
83
95
|
|
|
84
96
|
end
|
|
97
|
+
|
|
98
|
+
describe 'HTTP message transmissions' do
|
|
99
|
+
|
|
100
|
+
it 'should receive messages and provide custom response' do
|
|
101
|
+
response = HTTP.post('http://127.0.0.1:8706/fubar', :body => 'test')
|
|
102
|
+
response.body.to_s.must_equal 'custom response'
|
|
103
|
+
source_wait{ !MessageStore.messages.empty? }
|
|
104
|
+
MessageStore.messages.pop.must_equal 'test'
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
it 'should receive messages and provide default response' do
|
|
108
|
+
response = HTTP.get('http://127.0.0.1:8706/ohai')
|
|
109
|
+
source_wait{ !MessageStore.messages.empty? }
|
|
110
|
+
response.body.to_s.must_equal 'So long and thanks for all the fish!'
|
|
111
|
+
MessageStore.messages.pop.must_be :empty?
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
it 'should receive messages via glob matching' do
|
|
115
|
+
response = HTTP.get('http://127.0.0.1:8706/glob/v2/things')
|
|
116
|
+
source_wait{ !MessageStore.messages.empty? }
|
|
117
|
+
response.body.to_s.must_equal 'So long and thanks for all the fish!'
|
|
118
|
+
MessageStore.messages.pop.must_be :empty?
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
end
|
|
85
122
|
end
|
|
86
123
|
|
|
87
124
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: carnivore-http
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.2.
|
|
4
|
+
version: 0.2.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Chris Roberts
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2015-02-
|
|
11
|
+
date: 2015-02-26 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: carnivore
|