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 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: