yup 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +5 -5
- data/Gemfile.lock +3 -3
- data/README.rdoc +1 -0
- data/VERSION +1 -1
- data/bin/yupd +5 -0
- data/lib/yup.rb +4 -0
- data/lib/yup/request_forwarder.rb +15 -3
- data/test/test_persistence_yup.rb +7 -3
- data/test/test_yup.rb +6 -2
- data/yup.gemspec +8 -8
- metadata +7 -7
data/Gemfile
CHANGED
@@ -8,11 +8,11 @@ gem "yajl-ruby"
|
|
8
8
|
|
9
9
|
group :development do
|
10
10
|
gem "bdb"
|
11
|
-
gem "yard", "~> 0.
|
12
|
-
gem "minitest"
|
13
|
-
gem "bundler", "~> 1.
|
11
|
+
gem "yard", "~> 0.8.0"
|
12
|
+
gem "minitest"
|
13
|
+
gem "bundler", "~> 1.2"
|
14
14
|
gem "jeweler", "~> 1.8.4"
|
15
|
-
gem "simplecov"
|
16
|
-
gem "simplecov-rcov"
|
15
|
+
gem "simplecov"
|
16
|
+
gem "simplecov-rcov"
|
17
17
|
gem "travis-lint"
|
18
18
|
end
|
data/Gemfile.lock
CHANGED
@@ -38,14 +38,14 @@ GEM
|
|
38
38
|
hashr (>= 0.0.19)
|
39
39
|
tuple (0.1.2)
|
40
40
|
yajl-ruby (1.1.0)
|
41
|
-
yard (0.
|
41
|
+
yard (0.8.3)
|
42
42
|
|
43
43
|
PLATFORMS
|
44
44
|
ruby
|
45
45
|
|
46
46
|
DEPENDENCIES
|
47
47
|
bdb
|
48
|
-
bundler (~> 1.
|
48
|
+
bundler (~> 1.2)
|
49
49
|
em-http-request
|
50
50
|
eventmachine
|
51
51
|
http_parser.rb
|
@@ -56,4 +56,4 @@ DEPENDENCIES
|
|
56
56
|
travis-lint
|
57
57
|
tuple
|
58
58
|
yajl-ruby
|
59
|
-
yard (~> 0.
|
59
|
+
yard (~> 0.8.0)
|
data/README.rdoc
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
= yup daemon
|
2
2
|
|
3
3
|
{<img src="https://secure.travis-ci.org/neglectedvalue/yup.png" alt="Build Status" />}[http://travis-ci.org/neglectedvalue/yup]
|
4
|
+
{<img src="https://gemnasium.com/neglectedvalue/yup.png" alt="Dependency Status" />}[https://gemnasium.com/neglectedvalue/yup]
|
4
5
|
{<img src="https://codeclimate.com/badge.png" />}[https://codeclimate.com/github/neglectedvalue/yup]
|
5
6
|
|
6
7
|
This is the small daemon to forward HTTP requests when response is known or unimportant.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.1
|
data/bin/yupd
CHANGED
@@ -22,6 +22,7 @@ Options:
|
|
22
22
|
Available log levels: fatal, error, warn, info, debug.
|
23
23
|
--persistent <path> Use persistent queue.
|
24
24
|
--timeout <seconds> Timeout for answer from FORWARD_TO_HOST (default 60.0)
|
25
|
+
--retry-unless-2xx Retry even if status code not 2xx.
|
25
26
|
|
26
27
|
Examples:
|
27
28
|
yupd --listen 0.0.0.0:8081 --status-code 201 errbit.host.somewhere
|
@@ -45,6 +46,7 @@ opts = GetoptLong.new(*[['--help', '-h', GetoptLong::NO_ARGUMENT],
|
|
45
46
|
['--loglevel', GetoptLong::REQUIRED_ARGUMENT],
|
46
47
|
['--persistent', GetoptLong::REQUIRED_ARGUMENT],
|
47
48
|
['--timeout', GetoptLong::REQUIRED_ARGUMENT],
|
49
|
+
['--retry-unless-2xx', GetoptLong::NO_ARGUMENT],
|
48
50
|
])
|
49
51
|
config = {:loglevel => LEVELS["fatal"]}
|
50
52
|
|
@@ -73,6 +75,8 @@ opts.each do |opt, arg|
|
|
73
75
|
config[:persistent] = arg || "/tmp/queue"
|
74
76
|
when '--timeout'
|
75
77
|
config[:timeout] = arg.to_f
|
78
|
+
when '--retry-unless-2xx'
|
79
|
+
config[:retry_unless_2xx] = true
|
76
80
|
end
|
77
81
|
end
|
78
82
|
|
@@ -87,6 +91,7 @@ config[:forward_to] = ARGV.shift
|
|
87
91
|
Yup.logger.level = config[:loglevel]
|
88
92
|
Yup.watermark = config[:watermark] if config.has_key?(:watermark)
|
89
93
|
Yup.resend_delay = config[:resend_delay] if config.has_key?(:resend_delay)
|
94
|
+
Yup.retry_unless_2xx = config[:retry_unless_2xx] if config.has_key?(:retry_unless_2xx)
|
90
95
|
|
91
96
|
if config.has_key?(:persistent)
|
92
97
|
Yup.run_with_state(config)
|
data/lib/yup.rb
CHANGED
@@ -21,6 +21,10 @@ module Yup
|
|
21
21
|
def self.logger; @@logger end
|
22
22
|
def self.logger=(logger); @@logger = logger end
|
23
23
|
|
24
|
+
@@retry_unless_2xx = false
|
25
|
+
def self.retry_unless_2xx; @@retry_unless_2xx end
|
26
|
+
def self.retry_unless_2xx=(bool); @@retry_unless_2xx = bool end
|
27
|
+
|
24
28
|
def self.run(config)
|
25
29
|
host = config[:listen_host] || 'localhost'
|
26
30
|
port = config[:listen_port] || 8080
|
@@ -26,7 +26,7 @@ module Yup
|
|
26
26
|
:head => @headers,
|
27
27
|
:body => @body)
|
28
28
|
|
29
|
-
@logger.progname = "Yup::RequestForwarder (##{
|
29
|
+
@logger.progname = "Yup::RequestForwarder (##{self.__id__.to_s(36)} received at #{Time.now.to_s})"
|
30
30
|
|
31
31
|
http.callback do
|
32
32
|
Yup.watermark += 1
|
@@ -36,7 +36,12 @@ module Yup
|
|
36
36
|
@logger.info "Success"
|
37
37
|
else
|
38
38
|
log_response(http)
|
39
|
-
|
39
|
+
if Yup.retry_unless_2xx
|
40
|
+
@logger.info "Fail: got status code #{http.response_header.status}; will retry after #{Yup.resend_delay} seconds"
|
41
|
+
EventMachine.add_timer(Yup.resend_delay, &self.method(:retry))
|
42
|
+
else
|
43
|
+
@logger.info "Fail; will not retry"
|
44
|
+
end
|
40
45
|
end
|
41
46
|
end
|
42
47
|
|
@@ -114,7 +119,14 @@ module Yup
|
|
114
119
|
@logger.info "Success"
|
115
120
|
else
|
116
121
|
log_response(raw_response, response_body, http)
|
117
|
-
|
122
|
+
if Yup.retry_unless_2xx
|
123
|
+
@logger.info "Fail: got status code #{http.status_code}; will retry after #{Yup.resend_delay} seconds"
|
124
|
+
@state.to_feedback(Yajl::Encoder.encode([@http_method.downcase, @request_url, headers, body]))
|
125
|
+
|
126
|
+
sleep Yup.resend_delay
|
127
|
+
else
|
128
|
+
@logger.info "Fail; will not retry"
|
129
|
+
end
|
118
130
|
end
|
119
131
|
|
120
132
|
rescue Exception, Timeout::Error => e
|
@@ -31,13 +31,16 @@ class TestPersistenceYup < MiniTest::Unit::TestCase
|
|
31
31
|
case $attempts
|
32
32
|
when 0
|
33
33
|
when 1
|
34
|
+
send_data "HTTP/1.1 400 OK\r\nServer: test\r\n\r\n"
|
35
|
+
close_connection_after_writing
|
36
|
+
when 2
|
34
37
|
send_data "HTTP/1.1 200 OK\r\nServer: test\r\n\r\n"
|
35
38
|
close_connection_after_writing
|
36
39
|
end
|
37
40
|
end
|
38
41
|
|
39
42
|
def unbind
|
40
|
-
if $attempts
|
43
|
+
if $attempts >= 2
|
41
44
|
EM.add_timer(1) do
|
42
45
|
Process.kill("KILL", $pid)
|
43
46
|
EM.stop_event_loop()
|
@@ -75,7 +78,8 @@ class TestPersistenceYup < MiniTest::Unit::TestCase
|
|
75
78
|
state = Yup::State.new(dbpath, forward_to, feedback_channel)
|
76
79
|
timeout = 1
|
77
80
|
|
78
|
-
Yup.resend_delay
|
81
|
+
Yup.resend_delay = 1
|
82
|
+
Yup.retry_unless_2xx = true
|
79
83
|
|
80
84
|
$pid = Process.fork do
|
81
85
|
Yup::State::RequestForwarder.new(state, forward_to, timeout).run_loop
|
@@ -89,7 +93,7 @@ class TestPersistenceYup < MiniTest::Unit::TestCase
|
|
89
93
|
}
|
90
94
|
|
91
95
|
assert $client_parser
|
92
|
-
assert_equal 200,
|
96
|
+
assert_equal 200, $client_parser.status_code
|
93
97
|
assert_equal "yupd", $client_parser.headers["Server"]
|
94
98
|
assert $service_parser
|
95
99
|
assert_equal "/foo", $service_parser.request_url
|
data/test/test_yup.rb
CHANGED
@@ -27,12 +27,15 @@ class TestYup < MiniTest::Unit::TestCase
|
|
27
27
|
case $attempts
|
28
28
|
when 0
|
29
29
|
when 1
|
30
|
+
send_data "HTTP/1.1 400 OK\r\nServer: test\r\n\r\n"
|
31
|
+
when 2
|
30
32
|
send_data "HTTP/1.1 200 OK\r\nServer: test\r\n\r\n"
|
33
|
+
close_connection_after_writing
|
31
34
|
end
|
32
35
|
end
|
33
36
|
|
34
37
|
def unbind
|
35
|
-
if $attempts
|
38
|
+
if $attempts >= 2
|
36
39
|
EM.next_tick { EM.stop_event_loop }
|
37
40
|
end
|
38
41
|
end
|
@@ -64,7 +67,8 @@ class TestYup < MiniTest::Unit::TestCase
|
|
64
67
|
state = nil
|
65
68
|
timeout = 1
|
66
69
|
|
67
|
-
Yup.resend_delay
|
70
|
+
Yup.resend_delay = 1
|
71
|
+
Yup.retry_unless_2xx = true
|
68
72
|
|
69
73
|
EM.run {
|
70
74
|
EM.start_server("127.0.0.1", 16785, Service)
|
data/yup.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "yup"
|
8
|
-
s.version = "0.1.
|
8
|
+
s.version = "0.1.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Denis Sukhonin"]
|
12
|
-
s.date = "2012-
|
12
|
+
s.date = "2012-12-19"
|
13
13
|
s.description = "Just answers 200 (or specified) to a client and asynchronously forwards HTTP request to a configured host"
|
14
14
|
s.email = "d.sukhonin@gmail.com"
|
15
15
|
s.executables = ["yupd"]
|
@@ -53,9 +53,9 @@ Gem::Specification.new do |s|
|
|
53
53
|
s.add_runtime_dependency(%q<tuple>, [">= 0"])
|
54
54
|
s.add_runtime_dependency(%q<yajl-ruby>, [">= 0"])
|
55
55
|
s.add_development_dependency(%q<bdb>, [">= 0"])
|
56
|
-
s.add_development_dependency(%q<yard>, ["~> 0.
|
56
|
+
s.add_development_dependency(%q<yard>, ["~> 0.8.0"])
|
57
57
|
s.add_development_dependency(%q<minitest>, [">= 0"])
|
58
|
-
s.add_development_dependency(%q<bundler>, ["~> 1.
|
58
|
+
s.add_development_dependency(%q<bundler>, ["~> 1.2"])
|
59
59
|
s.add_development_dependency(%q<jeweler>, ["~> 1.8.4"])
|
60
60
|
s.add_development_dependency(%q<simplecov>, [">= 0"])
|
61
61
|
s.add_development_dependency(%q<simplecov-rcov>, [">= 0"])
|
@@ -67,9 +67,9 @@ Gem::Specification.new do |s|
|
|
67
67
|
s.add_dependency(%q<tuple>, [">= 0"])
|
68
68
|
s.add_dependency(%q<yajl-ruby>, [">= 0"])
|
69
69
|
s.add_dependency(%q<bdb>, [">= 0"])
|
70
|
-
s.add_dependency(%q<yard>, ["~> 0.
|
70
|
+
s.add_dependency(%q<yard>, ["~> 0.8.0"])
|
71
71
|
s.add_dependency(%q<minitest>, [">= 0"])
|
72
|
-
s.add_dependency(%q<bundler>, ["~> 1.
|
72
|
+
s.add_dependency(%q<bundler>, ["~> 1.2"])
|
73
73
|
s.add_dependency(%q<jeweler>, ["~> 1.8.4"])
|
74
74
|
s.add_dependency(%q<simplecov>, [">= 0"])
|
75
75
|
s.add_dependency(%q<simplecov-rcov>, [">= 0"])
|
@@ -82,9 +82,9 @@ Gem::Specification.new do |s|
|
|
82
82
|
s.add_dependency(%q<tuple>, [">= 0"])
|
83
83
|
s.add_dependency(%q<yajl-ruby>, [">= 0"])
|
84
84
|
s.add_dependency(%q<bdb>, [">= 0"])
|
85
|
-
s.add_dependency(%q<yard>, ["~> 0.
|
85
|
+
s.add_dependency(%q<yard>, ["~> 0.8.0"])
|
86
86
|
s.add_dependency(%q<minitest>, [">= 0"])
|
87
|
-
s.add_dependency(%q<bundler>, ["~> 1.
|
87
|
+
s.add_dependency(%q<bundler>, ["~> 1.2"])
|
88
88
|
s.add_dependency(%q<jeweler>, ["~> 1.8.4"])
|
89
89
|
s.add_dependency(%q<simplecov>, [">= 0"])
|
90
90
|
s.add_dependency(%q<simplecov-rcov>, [">= 0"])
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: yup
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-12-19 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: eventmachine
|
@@ -114,7 +114,7 @@ dependencies:
|
|
114
114
|
requirements:
|
115
115
|
- - ~>
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version: 0.
|
117
|
+
version: 0.8.0
|
118
118
|
type: :development
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -122,7 +122,7 @@ dependencies:
|
|
122
122
|
requirements:
|
123
123
|
- - ~>
|
124
124
|
- !ruby/object:Gem::Version
|
125
|
-
version: 0.
|
125
|
+
version: 0.8.0
|
126
126
|
- !ruby/object:Gem::Dependency
|
127
127
|
name: minitest
|
128
128
|
requirement: !ruby/object:Gem::Requirement
|
@@ -146,7 +146,7 @@ dependencies:
|
|
146
146
|
requirements:
|
147
147
|
- - ~>
|
148
148
|
- !ruby/object:Gem::Version
|
149
|
-
version: '1.
|
149
|
+
version: '1.2'
|
150
150
|
type: :development
|
151
151
|
prerelease: false
|
152
152
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -154,7 +154,7 @@ dependencies:
|
|
154
154
|
requirements:
|
155
155
|
- - ~>
|
156
156
|
- !ruby/object:Gem::Version
|
157
|
-
version: '1.
|
157
|
+
version: '1.2'
|
158
158
|
- !ruby/object:Gem::Dependency
|
159
159
|
name: jeweler
|
160
160
|
requirement: !ruby/object:Gem::Requirement
|
@@ -262,7 +262,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
262
262
|
version: '0'
|
263
263
|
segments:
|
264
264
|
- 0
|
265
|
-
hash:
|
265
|
+
hash: 3705403609961748378
|
266
266
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
267
267
|
none: false
|
268
268
|
requirements:
|