aeden-jruby-http-reactor 0.3.1 → 0.5.0
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/Rakefile +1 -0
- data/VERSION +1 -1
- data/jruby-http-reactor.gemspec +3 -4
- data/lib/http_reactor/client.rb +50 -21
- data/lib/http_reactor/response.rb +25 -9
- data/test/client_test.rb +6 -9
- metadata +2 -3
- data/.gitignore +0 -2
data/Rakefile
CHANGED
@@ -29,6 +29,7 @@ begin
|
|
29
29
|
gemspec.description = ""
|
30
30
|
gemspec.authors = ["Anthony Eden"]
|
31
31
|
gemspec.files.exclude 'docs/**/*'
|
32
|
+
gemspec.files.exclude '.gitignore'
|
32
33
|
end
|
33
34
|
rescue LoadError
|
34
35
|
puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.5.0
|
data/jruby-http-reactor.gemspec
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{jruby-http-reactor}
|
5
|
-
s.version = "0.
|
5
|
+
s.version = "0.5.0"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Anthony Eden"]
|
9
|
-
s.date = %q{2009-09-
|
9
|
+
s.date = %q{2009-09-16}
|
10
10
|
s.description = %q{}
|
11
11
|
s.email = %q{anthonyeden@gmail.com}
|
12
12
|
s.extra_rdoc_files = [
|
@@ -14,8 +14,7 @@ Gem::Specification.new do |s|
|
|
14
14
|
"README.textile"
|
15
15
|
]
|
16
16
|
s.files = [
|
17
|
-
".
|
18
|
-
"README.rdoc",
|
17
|
+
"README.rdoc",
|
19
18
|
"README.textile",
|
20
19
|
"Rakefile",
|
21
20
|
"VERSION",
|
data/lib/http_reactor/client.rb
CHANGED
@@ -9,6 +9,8 @@ module HttpReactor #:nodoc:
|
|
9
9
|
|
10
10
|
HTTP_TARGET_PATH = 'http_target_path'
|
11
11
|
HTTP_TARGET_REQUEST = 'http_target_request'
|
12
|
+
IO_REACTOR = "io_reactor"
|
13
|
+
REDIRECT_HISTORY = "redirect_history"
|
12
14
|
|
13
15
|
def initialize(request_count, handler_proc)
|
14
16
|
@request_count = request_count
|
@@ -19,6 +21,8 @@ module HttpReactor #:nodoc:
|
|
19
21
|
context.set_attribute(ExecutionContext.HTTP_TARGET_HOST, attachment[:host])
|
20
22
|
context.set_attribute(HTTP_TARGET_PATH, attachment[:path])
|
21
23
|
context.set_attribute(HTTP_TARGET_REQUEST, attachment[:request])
|
24
|
+
context.set_attribute(IO_REACTOR, attachment[:io_reactor])
|
25
|
+
context.set_attribute(REDIRECT_HISTORY, attachment[:redirect_history] || [])
|
22
26
|
end
|
23
27
|
|
24
28
|
def finalize_context(context)
|
@@ -49,12 +53,29 @@ module HttpReactor #:nodoc:
|
|
49
53
|
|
50
54
|
def handle_response(response, context)
|
51
55
|
begin
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
56
|
+
res = HttpReactor::Response.new(response)
|
57
|
+
case res.code
|
58
|
+
when 301, 302
|
59
|
+
redirect_to = res.headers['Location']
|
60
|
+
redirect_history = context.getAttribute(REDIRECT_HISTORY)
|
61
|
+
if redirect_history.include?(redirect_to)
|
62
|
+
puts "Too many redirects"
|
63
|
+
context.setAttribute(RESPONSE_RECEIVED, true)
|
64
|
+
@request_count.count_down()
|
65
|
+
else
|
66
|
+
puts "Redirecting to #{redirect_to}"
|
67
|
+
redirect_history << redirect_to
|
68
|
+
context.setAttribute(REDIRECT_HISTORY, redirect_history)
|
69
|
+
requests = [HttpReactor::Request.new(URI.parse(redirect_to))]
|
70
|
+
io_reactor = context.getAttribute(IO_REACTOR)
|
71
|
+
HttpReactor::Client.process_requests(requests, io_reactor, @request_count)
|
72
|
+
end
|
73
|
+
else
|
74
|
+
@handler_proc.call(res, context)
|
75
|
+
context.setAttribute(RESPONSE_RECEIVED, true)
|
76
|
+
# Signal completion of the request execution
|
77
|
+
@request_count.count_down()
|
78
|
+
end
|
58
79
|
rescue => e
|
59
80
|
puts "Error handling response: #{e.message}"
|
60
81
|
end
|
@@ -135,7 +156,6 @@ module HttpReactor #:nodoc:
|
|
135
156
|
def initialize(requests=[], handler_proc=nil, options={}, &block)
|
136
157
|
handler_proc = block if block_given?
|
137
158
|
handler_proc ||= default_handler_proc
|
138
|
-
session_request_callback = SessionRequestCallback
|
139
159
|
|
140
160
|
initialize_options(options)
|
141
161
|
|
@@ -152,11 +172,11 @@ module HttpReactor #:nodoc:
|
|
152
172
|
|
153
173
|
# We are going to use this object to synchronize between the
|
154
174
|
# I/O event and main threads
|
155
|
-
|
175
|
+
request_counter = java.util.concurrent.CountDownLatch.new(requests.length);
|
156
176
|
|
157
177
|
handler = BufferingHttpClientHandler.new(
|
158
178
|
httpproc,
|
159
|
-
RequestExecutionHandler.new(
|
179
|
+
RequestExecutionHandler.new(request_counter, handler_proc),
|
160
180
|
org.apache.http.impl.DefaultConnectionReuseStrategy.new,
|
161
181
|
params
|
162
182
|
)
|
@@ -178,30 +198,39 @@ module HttpReactor #:nodoc:
|
|
178
198
|
puts "Shutdown"
|
179
199
|
end
|
180
200
|
|
201
|
+
process_requests(requests, io_reactor, request_counter)
|
202
|
+
|
203
|
+
# Block until all connections signal
|
204
|
+
# completion of the request execution
|
205
|
+
request_counter.await()
|
206
|
+
|
207
|
+
puts "Shutting down I/O reactor"
|
208
|
+
|
209
|
+
io_reactor.shutdown()
|
210
|
+
|
211
|
+
puts "Done"
|
212
|
+
end
|
213
|
+
|
214
|
+
def process_requests(requests, io_reactor, request_counter)
|
215
|
+
HttpReactor::Client.process_requests(requests, io_reactor, request_counter)
|
216
|
+
end
|
217
|
+
|
218
|
+
def self.process_requests(requests, io_reactor, request_counter)
|
181
219
|
requests.each do |request|
|
182
220
|
uri = request.uri
|
183
221
|
attachment = {
|
184
222
|
:host => HttpHost.new(uri.host),
|
185
223
|
:path => uri.request_uri,
|
186
|
-
:request => request
|
224
|
+
:request => request,
|
225
|
+
:io_reactor => io_reactor
|
187
226
|
}
|
188
227
|
io_reactor.connect(
|
189
228
|
java.net.InetSocketAddress.new(uri.host, uri.port),
|
190
229
|
nil,
|
191
230
|
attachment,
|
192
|
-
|
231
|
+
SessionRequestCallback.new(request_counter)
|
193
232
|
)
|
194
233
|
end
|
195
|
-
|
196
|
-
# Block until all connections signal
|
197
|
-
# completion of the request execution
|
198
|
-
request_count.await()
|
199
|
-
|
200
|
-
puts "Shutting down I/O reactor"
|
201
|
-
|
202
|
-
io_reactor.shutdown()
|
203
|
-
|
204
|
-
puts "Done"
|
205
234
|
end
|
206
235
|
|
207
236
|
private
|
@@ -23,23 +23,39 @@ module HttpReactor #:nodoc:
|
|
23
23
|
|
24
24
|
# Get the response content type
|
25
25
|
def content_type
|
26
|
-
@response_impl.entity.content_type.value
|
26
|
+
@content_type ||= @response_impl.entity.content_type.value
|
27
27
|
end
|
28
28
|
|
29
29
|
# Get the response content length
|
30
30
|
def content_length
|
31
|
-
@response_impl.entity.content_length
|
31
|
+
@content_length ||= @response_impl.entity.content_length
|
32
|
+
end
|
33
|
+
|
34
|
+
def headers
|
35
|
+
@headers ||= begin
|
36
|
+
h = Hash.new
|
37
|
+
@response_impl.all_headers.each do |header|
|
38
|
+
if h[header.name]
|
39
|
+
h[header.name] = [h[header.name], header.value]
|
40
|
+
else
|
41
|
+
h[header.name] = header.value
|
42
|
+
end
|
43
|
+
end
|
44
|
+
h
|
45
|
+
end
|
32
46
|
end
|
33
47
|
|
34
48
|
# Get the body text
|
35
49
|
def body
|
36
|
-
begin
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
50
|
+
@body ||= begin
|
51
|
+
begin
|
52
|
+
io = Java.java_to_ruby(
|
53
|
+
org.jruby.RubyIO.new(JRuby.runtime, entity.content).java_object
|
54
|
+
)
|
55
|
+
io.read
|
56
|
+
rescue Exception => e
|
57
|
+
puts "Error in Response#body: #{e.message}"
|
58
|
+
end
|
43
59
|
end
|
44
60
|
end
|
45
61
|
end
|
data/test/client_test.rb
CHANGED
@@ -5,7 +5,7 @@ require 'mime/types'
|
|
5
5
|
class ClientTest < Test::Unit::TestCase
|
6
6
|
def requests
|
7
7
|
@requests ||= [
|
8
|
-
'http://
|
8
|
+
'http://yahoo.com/',
|
9
9
|
'http://www.google.com/',
|
10
10
|
'http://www.apache.org/',
|
11
11
|
'http://anthony.mp/about_me',
|
@@ -38,14 +38,11 @@ class ClientTest < Test::Unit::TestCase
|
|
38
38
|
puts "request ur: #{context.getAttribute('http_target_request').uri}"
|
39
39
|
puts "content-length: #{response.content_length}"
|
40
40
|
assert response.body.length > 0
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
if response.code == 200
|
47
|
-
puts response.body
|
48
|
-
end
|
41
|
+
puts "=== HEADERS ==="
|
42
|
+
puts response.headers.inspect
|
43
|
+
# puts "===== BODY ===="
|
44
|
+
# puts response.body
|
45
|
+
# puts "==============="
|
49
46
|
end
|
50
47
|
end
|
51
48
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aeden-jruby-http-reactor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Anthony Eden
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-09-
|
12
|
+
date: 2009-09-16 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -23,7 +23,6 @@ extra_rdoc_files:
|
|
23
23
|
- README.rdoc
|
24
24
|
- README.textile
|
25
25
|
files:
|
26
|
-
- .gitignore
|
27
26
|
- README.rdoc
|
28
27
|
- README.textile
|
29
28
|
- Rakefile
|
data/.gitignore
DELETED