yup 0.1.0 → 0.1.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/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:
|