yup 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
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