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 +1 -1
- data/bin/yupd +4 -0
- data/lib/yup/request_forwarder.rb +7 -3
- data/lib/yup/request_handler.rb +3 -2
- data/lib/yup.rb +7 -5
- data/yup.gemspec +9 -11
- metadata +106 -147
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
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'
|
data/lib/yup/request_handler.rb
CHANGED
@@ -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
|
38
|
-
port
|
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
|
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
|
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 =
|
8
|
-
s.version = "0.0.
|
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 =
|
13
|
-
s.
|
14
|
-
s.
|
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 =
|
37
|
+
s.homepage = "http://github.com/neglectedvalue/yup"
|
39
38
|
s.licenses = ["MIT"]
|
40
39
|
s.require_paths = ["lib"]
|
41
|
-
s.rubygems_version =
|
42
|
-
s.summary =
|
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
|
-
|
5
|
-
|
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
|
-
|
18
|
-
|
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: &
|
16
|
+
requirement: &2153531920 !ruby/object:Gem::Requirement
|
23
17
|
none: false
|
24
|
-
requirements:
|
25
|
-
- -
|
26
|
-
- !ruby/object:Gem::Version
|
27
|
-
|
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: *
|
33
|
-
- !ruby/object:Gem::Dependency
|
24
|
+
version_requirements: *2153531920
|
25
|
+
- !ruby/object:Gem::Dependency
|
34
26
|
name: em-http-request
|
35
|
-
requirement: &
|
27
|
+
requirement: &2153531320 !ruby/object:Gem::Requirement
|
36
28
|
none: false
|
37
|
-
requirements:
|
38
|
-
- -
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
|
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: *
|
46
|
-
- !ruby/object:Gem::Dependency
|
35
|
+
version_requirements: *2153531320
|
36
|
+
- !ruby/object:Gem::Dependency
|
47
37
|
name: http_request.rb
|
48
|
-
requirement: &
|
38
|
+
requirement: &2153530700 !ruby/object:Gem::Requirement
|
49
39
|
none: false
|
50
|
-
requirements:
|
51
|
-
- -
|
52
|
-
- !ruby/object:Gem::Version
|
53
|
-
|
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: *
|
59
|
-
- !ruby/object:Gem::Dependency
|
46
|
+
version_requirements: *2153530700
|
47
|
+
- !ruby/object:Gem::Dependency
|
60
48
|
name: http_parser.rb
|
61
|
-
requirement: &
|
49
|
+
requirement: &2153530040 !ruby/object:Gem::Requirement
|
62
50
|
none: false
|
63
|
-
requirements:
|
64
|
-
- -
|
65
|
-
- !ruby/object:Gem::Version
|
66
|
-
|
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: *
|
72
|
-
- !ruby/object:Gem::Dependency
|
57
|
+
version_requirements: *2153530040
|
58
|
+
- !ruby/object:Gem::Dependency
|
73
59
|
name: tuple
|
74
|
-
requirement: &
|
60
|
+
requirement: &2153528420 !ruby/object:Gem::Requirement
|
75
61
|
none: false
|
76
|
-
requirements:
|
77
|
-
- -
|
78
|
-
- !ruby/object:Gem::Version
|
79
|
-
|
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: *
|
85
|
-
- !ruby/object:Gem::Dependency
|
68
|
+
version_requirements: *2153528420
|
69
|
+
- !ruby/object:Gem::Dependency
|
86
70
|
name: bdb
|
87
|
-
requirement: &
|
71
|
+
requirement: &2153527680 !ruby/object:Gem::Requirement
|
88
72
|
none: false
|
89
|
-
requirements:
|
90
|
-
- -
|
91
|
-
- !ruby/object:Gem::Version
|
92
|
-
|
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: *
|
98
|
-
- !ruby/object:Gem::Dependency
|
79
|
+
version_requirements: *2153527680
|
80
|
+
- !ruby/object:Gem::Dependency
|
99
81
|
name: yajl-ruby
|
100
|
-
requirement: &
|
82
|
+
requirement: &2153526960 !ruby/object:Gem::Requirement
|
101
83
|
none: false
|
102
|
-
requirements:
|
103
|
-
- -
|
104
|
-
- !ruby/object:Gem::Version
|
105
|
-
|
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: *
|
111
|
-
- !ruby/object:Gem::Dependency
|
90
|
+
version_requirements: *2153526960
|
91
|
+
- !ruby/object:Gem::Dependency
|
112
92
|
name: yard
|
113
|
-
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: *
|
126
|
-
- !ruby/object:Gem::Dependency
|
101
|
+
version_requirements: *2153526240
|
102
|
+
- !ruby/object:Gem::Dependency
|
127
103
|
name: minitest
|
128
|
-
requirement: &
|
104
|
+
requirement: &2153525540 !ruby/object:Gem::Requirement
|
129
105
|
none: false
|
130
|
-
requirements:
|
131
|
-
- -
|
132
|
-
- !ruby/object:Gem::Version
|
133
|
-
|
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: *
|
139
|
-
- !ruby/object:Gem::Dependency
|
112
|
+
version_requirements: *2153525540
|
113
|
+
- !ruby/object:Gem::Dependency
|
140
114
|
name: bundler
|
141
|
-
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: *
|
154
|
-
- !ruby/object:Gem::Dependency
|
123
|
+
version_requirements: *2153524940
|
124
|
+
- !ruby/object:Gem::Dependency
|
155
125
|
name: jeweler
|
156
|
-
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: *
|
169
|
-
- !ruby/object:Gem::Dependency
|
134
|
+
version_requirements: *2153522540
|
135
|
+
- !ruby/object:Gem::Dependency
|
170
136
|
name: rcov
|
171
|
-
requirement: &
|
137
|
+
requirement: &2153520500 !ruby/object:Gem::Requirement
|
172
138
|
none: false
|
173
|
-
requirements:
|
174
|
-
- -
|
175
|
-
- !ruby/object:Gem::Version
|
176
|
-
|
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: *
|
182
|
-
description: Just answers 200 (or specified) to a client and asynchronously forwards
|
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
|
-
|
222
|
-
segments:
|
180
|
+
requirements:
|
181
|
+
- - ! '>='
|
182
|
+
- !ruby/object:Gem::Version
|
183
|
+
version: '0'
|
184
|
+
segments:
|
223
185
|
- 0
|
224
|
-
|
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
|
-
|
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.
|
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
|