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 CHANGED
@@ -8,11 +8,11 @@ gem "yajl-ruby"
8
8
 
9
9
  group :development do
10
10
  gem "bdb"
11
- gem "yard", "~> 0.6.0"
12
- gem "minitest", ">= 0"
13
- gem "bundler", "~> 1.0"
11
+ gem "yard", "~> 0.8.0"
12
+ gem "minitest"
13
+ gem "bundler", "~> 1.2"
14
14
  gem "jeweler", "~> 1.8.4"
15
- gem "simplecov", ">= 0"
16
- gem "simplecov-rcov", ">= 0"
15
+ gem "simplecov"
16
+ gem "simplecov-rcov"
17
17
  gem "travis-lint"
18
18
  end
@@ -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.6.8)
41
+ yard (0.8.3)
42
42
 
43
43
  PLATFORMS
44
44
  ruby
45
45
 
46
46
  DEPENDENCIES
47
47
  bdb
48
- bundler (~> 1.0)
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.6.0)
59
+ yard (~> 0.8.0)
@@ -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.0
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 (##{http.__id__.to_s(36)} received at #{Time.now.to_s})"
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
- @logger.info "Fail; will not retry"
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
- @logger.info "Fail; will not retry"
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 > 0
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 = 1
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, $client_parser.status_code
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
@@ -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 > 0
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 = 1
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)
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "yup"
8
- s.version = "0.1.0"
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-11-09"
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.6.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.0"])
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.6.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.0"])
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.6.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.0"])
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.0
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-11-09 00:00:00.000000000 Z
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.6.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.6.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.0'
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.0'
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: 2564994728519902623
265
+ hash: 3705403609961748378
266
266
  required_rubygems_version: !ruby/object:Gem::Requirement
267
267
  none: false
268
268
  requirements: