yup 0.0.5 → 0.0.6

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/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.5
1
+ 0.0.6
data/bin/yupd CHANGED
@@ -19,6 +19,7 @@ Options:
19
19
  --loglevel <level> Logging severity (default fatal).
20
20
  Available log levels: fatal, error, warn, info, debug.
21
21
  --persistent <path> Use persistent queue.
22
+ --timeout <seconds> Timeout for answer from FORWARD_TO_HOST
22
23
 
23
24
  Examples:
24
25
  yupd --listen 0.0.0.0:8081 --status-code 201 errbit.host.somewhere
@@ -41,6 +42,7 @@ opts = GetoptLong.new(*[['--help', '-h', GetoptLong::NO_ARGUMENT],
41
42
  ['--watermark', GetoptLong::REQUIRED_ARGUMENT],
42
43
  ['--loglevel', GetoptLong::REQUIRED_ARGUMENT],
43
44
  ['--persistent', GetoptLong::REQUIRED_ARGUMENT],
45
+ ['--timeout', GetoptLong::REQUIRED_ARGUMENT],
44
46
  ])
45
47
  config = {:loglevel => LEVELS["fatal"]}
46
48
 
@@ -67,6 +69,8 @@ opts.each do |opt, arg|
67
69
  end
68
70
  when '--persistent'
69
71
  config[:persistent] = arg || "/tmp/queue"
72
+ when '--timeout'
73
+ config[:timeout] = arg.to_i
70
74
  end
71
75
  end
72
76
 
@@ -3,12 +3,13 @@ require 'http_request'
3
3
 
4
4
  module Yup
5
5
  class RequestForwarder
6
- def initialize(http_method, request_url, headers, body, forward_to)
6
+ def initialize(http_method, request_url, headers, body, forward_to, timeout)
7
7
  @http_method = http_method
8
8
  @request_url = request_url
9
9
  @headers = headers
10
10
  @body = body
11
11
  @forward_to = forward_to
12
+ @timeout = timeout
12
13
 
13
14
  @logger = Yup.logger
14
15
  end
@@ -19,6 +20,7 @@ module Yup
19
20
  http = EventMachine::HttpRequest.
20
21
  new(http_url).
21
22
  send(http_method,
23
+ :inactivity_timeout => @timeout,
22
24
  :head => @headers.merge('Host' => @forward_to),
23
25
  :body => @body)
24
26
 
@@ -48,9 +50,10 @@ module Yup
48
50
 
49
51
  class State
50
52
  class RequestForwarder
51
- def initialize(state, forward_to)
53
+ def initialize(state, forward_to, timeout)
52
54
  @state = state
53
55
  @forward_to = forward_to
56
+ @timeout = timeout
54
57
 
55
58
  @logger = Yup.logger
56
59
  @yajl = Yajl::Parser.new(:symbolize_keys => true)
@@ -79,7 +82,8 @@ module Yup
79
82
  send(http_method,
80
83
  :url => http_url,
81
84
  :headers => headers.merge('Host' => @forward_to),
82
- :parameters => body)
85
+ :parameters => body,
86
+ :inactivity_timeout => timeout)
83
87
 
84
88
  if http.code_2xx?
85
89
  @logger.info '--- SUCCESS'
@@ -5,10 +5,11 @@ module Yup
5
5
  class RequestHandler < EM::Connection
6
6
  attr_reader :queue
7
7
 
8
- def initialize(forward_to, status_code, state)
8
+ def initialize(forward_to, status_code, state, timeout)
9
9
  @forward_to = forward_to
10
10
  @status_code = status_code
11
11
  @state = state
12
+ @timeout = timeout
12
13
 
13
14
  @logger = Yup.logger
14
15
  @chunks = []
@@ -58,7 +59,7 @@ module Yup
58
59
  Yup.watermark -= 1
59
60
 
60
61
  EventMachine.next_tick do
61
- RequestForwarder.new(@parser.http_method.downcase, @parser.request_url, @parser.headers, @body, @forward_to).run
62
+ RequestForwarder.new(@parser.http_method.downcase, @parser.request_url, @parser.headers, @body, @forward_to, @timeout).run
62
63
  end
63
64
  else
64
65
  @logger.error "-- watermark is reached, drop"
data/lib/yup.rb CHANGED
@@ -26,24 +26,26 @@ module Yup
26
26
  port = config[:listen_port] || 8080
27
27
  status_code = config[:status_code] || 200
28
28
  forward_to = config[:forward_to]
29
+ timeout = config[:timeout] || 10
29
30
 
30
31
  EventMachine.run do
31
- EventMachine.start_server(host, port, RequestHandler, forward_to, status_code, nil)
32
+ EventMachine.start_server(host, port, RequestHandler, forward_to, status_code, nil, timeout)
32
33
  logger.info { "listening on #{host}:#{port}" }
33
34
  end
34
35
  end
35
36
 
36
37
  def self.run_with_state(config)
37
- host = config[:listen_host] || 'localhost'
38
- port = config[:listen_port] || 8080
38
+ host = config[:listen_host] || 'localhost'
39
+ port = config[:listen_port] || 8080
39
40
  status_code = config[:status_code] || 200
40
41
  forward_to = config[:forward_to]
41
- dbpath = config[:persistent]
42
+ dbpath = config[:persistent]
43
+ timeout = config[:timeout]
42
44
  feedback_channel = File.join(Dir.tmpdir, "yupd-#{$$}-feedback")
43
45
  state = Yup::State.new(dbpath, forward_to, feedback_channel)
44
46
 
45
47
  pid = Process.fork do
46
- State::RequestForwarder.new(state, forward_to).run_loop
48
+ State::RequestForwarder.new(state, forward_to, timeout).run_loop
47
49
  end
48
50
 
49
51
  if pid
data/yup.gemspec CHANGED
@@ -1,18 +1,17 @@
1
1
  # Generated by jeweler
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in rakefile, and run 'rake gemspec'
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
5
 
6
6
  Gem::Specification.new do |s|
7
- s.name = %q{yup}
8
- s.version = "0.0.5"
7
+ s.name = "yup"
8
+ s.version = "0.0.6"
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 = %q{2011-09-07}
13
- s.default_executable = %q{yupd}
14
- s.description = %q{Just answers 200 (or specified) to a client and asynchronously forwards HTTP request to a configured host}
15
- s.email = %q{d.sukhonin@gmail.com}
12
+ s.date = "2012-04-24"
13
+ s.description = "Just answers 200 (or specified) to a client and asynchronously forwards HTTP request to a configured host"
14
+ s.email = "d.sukhonin@gmail.com"
16
15
  s.executables = ["yupd"]
17
16
  s.extra_rdoc_files = [
18
17
  "LICENSE.txt",
@@ -35,18 +34,17 @@ Gem::Specification.new do |s|
35
34
  "test/test_yup.rb",
36
35
  "yup.gemspec"
37
36
  ]
38
- s.homepage = %q{http://github.com/neglectedvalue/yup}
37
+ s.homepage = "http://github.com/neglectedvalue/yup"
39
38
  s.licenses = ["MIT"]
40
39
  s.require_paths = ["lib"]
41
- s.rubygems_version = %q{1.3.7}
42
- s.summary = %q{Asynchronous HTTP delegate}
40
+ s.rubygems_version = "1.8.10"
41
+ s.summary = "Asynchronous HTTP delegate"
43
42
  s.test_files = [
44
43
  "test/helper.rb",
45
44
  "test/test_yup.rb"
46
45
  ]
47
46
 
48
47
  if s.respond_to? :specification_version then
49
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
50
48
  s.specification_version = 3
51
49
 
52
50
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
metadata CHANGED
@@ -1,194 +1,158 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: yup
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 0
8
- - 5
9
- version: 0.0.5
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.6
5
+ prerelease:
10
6
  platform: ruby
11
- authors:
7
+ authors:
12
8
  - Denis Sukhonin
13
9
  autorequire:
14
10
  bindir: bin
15
11
  cert_chain: []
16
-
17
- date: 2011-09-07 00:00:00 +04:00
18
- default_executable: yupd
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
12
+ date: 2012-04-24 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
21
15
  name: eventmachine
22
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: &2153531920 !ruby/object:Gem::Requirement
23
17
  none: false
24
- requirements:
25
- - - ">="
26
- - !ruby/object:Gem::Version
27
- segments:
28
- - 0
29
- version: "0"
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
30
22
  type: :runtime
31
23
  prerelease: false
32
- version_requirements: *id001
33
- - !ruby/object:Gem::Dependency
24
+ version_requirements: *2153531920
25
+ - !ruby/object:Gem::Dependency
34
26
  name: em-http-request
35
- requirement: &id002 !ruby/object:Gem::Requirement
27
+ requirement: &2153531320 !ruby/object:Gem::Requirement
36
28
  none: false
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- segments:
41
- - 0
42
- version: "0"
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
43
33
  type: :runtime
44
34
  prerelease: false
45
- version_requirements: *id002
46
- - !ruby/object:Gem::Dependency
35
+ version_requirements: *2153531320
36
+ - !ruby/object:Gem::Dependency
47
37
  name: http_request.rb
48
- requirement: &id003 !ruby/object:Gem::Requirement
38
+ requirement: &2153530700 !ruby/object:Gem::Requirement
49
39
  none: false
50
- requirements:
51
- - - ">="
52
- - !ruby/object:Gem::Version
53
- segments:
54
- - 0
55
- version: "0"
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
56
44
  type: :runtime
57
45
  prerelease: false
58
- version_requirements: *id003
59
- - !ruby/object:Gem::Dependency
46
+ version_requirements: *2153530700
47
+ - !ruby/object:Gem::Dependency
60
48
  name: http_parser.rb
61
- requirement: &id004 !ruby/object:Gem::Requirement
49
+ requirement: &2153530040 !ruby/object:Gem::Requirement
62
50
  none: false
63
- requirements:
64
- - - ">="
65
- - !ruby/object:Gem::Version
66
- segments:
67
- - 0
68
- version: "0"
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
69
55
  type: :runtime
70
56
  prerelease: false
71
- version_requirements: *id004
72
- - !ruby/object:Gem::Dependency
57
+ version_requirements: *2153530040
58
+ - !ruby/object:Gem::Dependency
73
59
  name: tuple
74
- requirement: &id005 !ruby/object:Gem::Requirement
60
+ requirement: &2153528420 !ruby/object:Gem::Requirement
75
61
  none: false
76
- requirements:
77
- - - ">="
78
- - !ruby/object:Gem::Version
79
- segments:
80
- - 0
81
- version: "0"
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
82
66
  type: :runtime
83
67
  prerelease: false
84
- version_requirements: *id005
85
- - !ruby/object:Gem::Dependency
68
+ version_requirements: *2153528420
69
+ - !ruby/object:Gem::Dependency
86
70
  name: bdb
87
- requirement: &id006 !ruby/object:Gem::Requirement
71
+ requirement: &2153527680 !ruby/object:Gem::Requirement
88
72
  none: false
89
- requirements:
90
- - - ">="
91
- - !ruby/object:Gem::Version
92
- segments:
93
- - 0
94
- version: "0"
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
95
77
  type: :runtime
96
78
  prerelease: false
97
- version_requirements: *id006
98
- - !ruby/object:Gem::Dependency
79
+ version_requirements: *2153527680
80
+ - !ruby/object:Gem::Dependency
99
81
  name: yajl-ruby
100
- requirement: &id007 !ruby/object:Gem::Requirement
82
+ requirement: &2153526960 !ruby/object:Gem::Requirement
101
83
  none: false
102
- requirements:
103
- - - ">="
104
- - !ruby/object:Gem::Version
105
- segments:
106
- - 0
107
- version: "0"
84
+ requirements:
85
+ - - ! '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
108
88
  type: :runtime
109
89
  prerelease: false
110
- version_requirements: *id007
111
- - !ruby/object:Gem::Dependency
90
+ version_requirements: *2153526960
91
+ - !ruby/object:Gem::Dependency
112
92
  name: yard
113
- requirement: &id008 !ruby/object:Gem::Requirement
93
+ requirement: &2153526240 !ruby/object:Gem::Requirement
114
94
  none: false
115
- requirements:
95
+ requirements:
116
96
  - - ~>
117
- - !ruby/object:Gem::Version
118
- segments:
119
- - 0
120
- - 6
121
- - 0
97
+ - !ruby/object:Gem::Version
122
98
  version: 0.6.0
123
99
  type: :development
124
100
  prerelease: false
125
- version_requirements: *id008
126
- - !ruby/object:Gem::Dependency
101
+ version_requirements: *2153526240
102
+ - !ruby/object:Gem::Dependency
127
103
  name: minitest
128
- requirement: &id009 !ruby/object:Gem::Requirement
104
+ requirement: &2153525540 !ruby/object:Gem::Requirement
129
105
  none: false
130
- requirements:
131
- - - ">="
132
- - !ruby/object:Gem::Version
133
- segments:
134
- - 0
135
- version: "0"
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
136
110
  type: :development
137
111
  prerelease: false
138
- version_requirements: *id009
139
- - !ruby/object:Gem::Dependency
112
+ version_requirements: *2153525540
113
+ - !ruby/object:Gem::Dependency
140
114
  name: bundler
141
- requirement: &id010 !ruby/object:Gem::Requirement
115
+ requirement: &2153524940 !ruby/object:Gem::Requirement
142
116
  none: false
143
- requirements:
117
+ requirements:
144
118
  - - ~>
145
- - !ruby/object:Gem::Version
146
- segments:
147
- - 1
148
- - 0
149
- - 0
119
+ - !ruby/object:Gem::Version
150
120
  version: 1.0.0
151
121
  type: :development
152
122
  prerelease: false
153
- version_requirements: *id010
154
- - !ruby/object:Gem::Dependency
123
+ version_requirements: *2153524940
124
+ - !ruby/object:Gem::Dependency
155
125
  name: jeweler
156
- requirement: &id011 !ruby/object:Gem::Requirement
126
+ requirement: &2153522540 !ruby/object:Gem::Requirement
157
127
  none: false
158
- requirements:
128
+ requirements:
159
129
  - - ~>
160
- - !ruby/object:Gem::Version
161
- segments:
162
- - 1
163
- - 5
164
- - 2
130
+ - !ruby/object:Gem::Version
165
131
  version: 1.5.2
166
132
  type: :development
167
133
  prerelease: false
168
- version_requirements: *id011
169
- - !ruby/object:Gem::Dependency
134
+ version_requirements: *2153522540
135
+ - !ruby/object:Gem::Dependency
170
136
  name: rcov
171
- requirement: &id012 !ruby/object:Gem::Requirement
137
+ requirement: &2153520500 !ruby/object:Gem::Requirement
172
138
  none: false
173
- requirements:
174
- - - ">="
175
- - !ruby/object:Gem::Version
176
- segments:
177
- - 0
178
- version: "0"
139
+ requirements:
140
+ - - ! '>='
141
+ - !ruby/object:Gem::Version
142
+ version: '0'
179
143
  type: :development
180
144
  prerelease: false
181
- version_requirements: *id012
182
- description: Just answers 200 (or specified) to a client and asynchronously forwards HTTP request to a configured host
145
+ version_requirements: *2153520500
146
+ description: Just answers 200 (or specified) to a client and asynchronously forwards
147
+ HTTP request to a configured host
183
148
  email: d.sukhonin@gmail.com
184
- executables:
149
+ executables:
185
150
  - yupd
186
151
  extensions: []
187
-
188
- extra_rdoc_files:
152
+ extra_rdoc_files:
189
153
  - LICENSE.txt
190
154
  - README.rdoc
191
- files:
155
+ files:
192
156
  - .document
193
157
  - Gemfile
194
158
  - Gemfile.lock
@@ -204,39 +168,34 @@ files:
204
168
  - test/helper.rb
205
169
  - test/test_yup.rb
206
170
  - yup.gemspec
207
- has_rdoc: true
208
171
  homepage: http://github.com/neglectedvalue/yup
209
- licenses:
172
+ licenses:
210
173
  - MIT
211
174
  post_install_message:
212
175
  rdoc_options: []
213
-
214
- require_paths:
176
+ require_paths:
215
177
  - lib
216
- required_ruby_version: !ruby/object:Gem::Requirement
178
+ required_ruby_version: !ruby/object:Gem::Requirement
217
179
  none: false
218
- requirements:
219
- - - ">="
220
- - !ruby/object:Gem::Version
221
- hash: 427974567932328261
222
- segments:
180
+ requirements:
181
+ - - ! '>='
182
+ - !ruby/object:Gem::Version
183
+ version: '0'
184
+ segments:
223
185
  - 0
224
- version: "0"
225
- required_rubygems_version: !ruby/object:Gem::Requirement
186
+ hash: -3174219317294798193
187
+ required_rubygems_version: !ruby/object:Gem::Requirement
226
188
  none: false
227
- requirements:
228
- - - ">="
229
- - !ruby/object:Gem::Version
230
- segments:
231
- - 0
232
- version: "0"
189
+ requirements:
190
+ - - ! '>='
191
+ - !ruby/object:Gem::Version
192
+ version: '0'
233
193
  requirements: []
234
-
235
194
  rubyforge_project:
236
- rubygems_version: 1.3.7
195
+ rubygems_version: 1.8.10
237
196
  signing_key:
238
197
  specification_version: 3
239
198
  summary: Asynchronous HTTP delegate
240
- test_files:
199
+ test_files:
241
200
  - test/helper.rb
242
201
  - test/test_yup.rb