jruby-httpclient 0.1.0-java → 0.2.0-java
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/Gemfile +0 -1
- data/Gemfile.lock +0 -2
- data/README.rdoc +9 -1
- data/Rakefile +0 -8
- data/VERSION +1 -1
- data/jruby-httpclient.gemspec +71 -0
- data/lib/http_client.rb +3 -1
- data/lib/http_client/client.rb +51 -38
- data/lib/http_client/methods.rb +89 -0
- data/lib/http_client/parameters.rb +120 -0
- data/test/http_client/test_basic_auth.rb +16 -0
- data/test/http_client/test_basic_client_operations.rb +31 -0
- data/test/http_client/test_client_headers.rb +56 -0
- data/test/http_client/test_client_parameters.rb +201 -0
- data/test/http_client/test_request_entity.rb +23 -0
- data/test/http_test_server.rb +63 -2
- metadata +11 -15
- data/test/http_client/test_client.rb +0 -28
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
data/README.rdoc
CHANGED
@@ -1,6 +1,14 @@
|
|
1
1
|
= jruby-httpclient
|
2
2
|
|
3
|
-
|
3
|
+
jruby-httpclient is a thin wrapper around Apache's HttpClient (version 4.1). I found that Net::HTTP was
|
4
|
+
not threadsafe in JRuby. This project is an attempt to make a threadsafe HTTP client for JRuby.
|
5
|
+
|
6
|
+
== Usage
|
7
|
+
|
8
|
+
client = HTTP::Client.new(:host => "localhost", :port => 8080)
|
9
|
+
client.get("/src", :param => "value")
|
10
|
+
|
11
|
+
client.post("/create", :param => "value")
|
4
12
|
|
5
13
|
== Contributing to jruby-httpclient
|
6
14
|
|
data/Rakefile
CHANGED
@@ -33,14 +33,6 @@ Rake::TestTask.new(:test) do |test|
|
|
33
33
|
test.verbose = true
|
34
34
|
end
|
35
35
|
|
36
|
-
require 'rcov/rcovtask'
|
37
|
-
Rcov::RcovTask.new do |test|
|
38
|
-
test.libs << 'test'
|
39
|
-
test.pattern = 'test/**/test_*.rb'
|
40
|
-
test.verbose = true
|
41
|
-
test.rcov_opts << '--exclude "gems/*"'
|
42
|
-
end
|
43
|
-
|
44
36
|
task :default => :test
|
45
37
|
|
46
38
|
require 'rdoc/task'
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
@@ -0,0 +1,71 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{jruby-httpclient}
|
8
|
+
s.version = "0.2.0"
|
9
|
+
s.platform = Gem::Platform.new([nil, "java", nil])
|
10
|
+
|
11
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
|
+
s.authors = ["Adam Esterline"]
|
13
|
+
s.date = %q{2011-06-28}
|
14
|
+
s.description = %q{An HTTP client designed for use with JRuby in a threaded environment}
|
15
|
+
s.email = %q{adam@esterlines.com}
|
16
|
+
s.extra_rdoc_files = [
|
17
|
+
"LICENSE.txt",
|
18
|
+
"README.rdoc"
|
19
|
+
]
|
20
|
+
s.files = [
|
21
|
+
".document",
|
22
|
+
"Gemfile",
|
23
|
+
"Gemfile.lock",
|
24
|
+
"LICENSE.txt",
|
25
|
+
"README.rdoc",
|
26
|
+
"Rakefile",
|
27
|
+
"VERSION",
|
28
|
+
"jruby-httpclient.gemspec",
|
29
|
+
"lib/http_client.rb",
|
30
|
+
"lib/http_client/client.rb",
|
31
|
+
"lib/http_client/methods.rb",
|
32
|
+
"lib/http_client/parameters.rb",
|
33
|
+
"test/helper.rb",
|
34
|
+
"test/http_client/test_basic_auth.rb",
|
35
|
+
"test/http_client/test_basic_client_operations.rb",
|
36
|
+
"test/http_client/test_client_headers.rb",
|
37
|
+
"test/http_client/test_client_parameters.rb",
|
38
|
+
"test/http_client/test_request_entity.rb",
|
39
|
+
"test/http_test_server.rb",
|
40
|
+
"vendor/commons-codec-1.4.jar",
|
41
|
+
"vendor/commons-logging-1.1.1.jar",
|
42
|
+
"vendor/httpclient-4.1.1.jar",
|
43
|
+
"vendor/httpclient-cache-4.1.1.jar",
|
44
|
+
"vendor/httpcore-4.1.jar",
|
45
|
+
"vendor/httpmime-4.1.1.jar"
|
46
|
+
]
|
47
|
+
s.homepage = %q{http://github.com/aesterline/jruby-httpclient}
|
48
|
+
s.licenses = ["Apache 2.0"]
|
49
|
+
s.require_paths = ["lib"]
|
50
|
+
s.rubygems_version = %q{1.5.1}
|
51
|
+
s.summary = %q{A thin wrapper around the Apache HttpClient}
|
52
|
+
|
53
|
+
if s.respond_to? :specification_version then
|
54
|
+
s.specification_version = 3
|
55
|
+
|
56
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
57
|
+
s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
|
58
|
+
s.add_development_dependency(%q<jeweler>, ["~> 1.6.2"])
|
59
|
+
s.add_development_dependency(%q<rdoc>, [">= 0"])
|
60
|
+
else
|
61
|
+
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
62
|
+
s.add_dependency(%q<jeweler>, ["~> 1.6.2"])
|
63
|
+
s.add_dependency(%q<rdoc>, [">= 0"])
|
64
|
+
end
|
65
|
+
else
|
66
|
+
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
67
|
+
s.add_dependency(%q<jeweler>, ["~> 1.6.2"])
|
68
|
+
s.add_dependency(%q<rdoc>, [">= 0"])
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
data/lib/http_client.rb
CHANGED
data/lib/http_client/client.rb
CHANGED
@@ -1,60 +1,73 @@
|
|
1
|
+
require 'uri'
|
1
2
|
module HTTP
|
3
|
+
DefaultHttpClient = org.apache.http.impl.client.DefaultHttpClient
|
4
|
+
BasicResponseHandler = org.apache.http.impl.client.BasicResponseHandler
|
5
|
+
SocketTimeoutException = java.net.SocketTimeoutException
|
6
|
+
|
2
7
|
class Client
|
3
|
-
|
4
|
-
|
8
|
+
DEFAULT_TIMEOUT = 30_000
|
9
|
+
include HTTP::Parameters
|
5
10
|
|
6
11
|
def initialize(options = {})
|
7
|
-
|
8
|
-
|
9
|
-
|
12
|
+
self.so_timeout = DEFAULT_TIMEOUT
|
13
|
+
|
14
|
+
if options[:disable_response_handler]
|
15
|
+
@response_handler = nil
|
16
|
+
elsif options[:response_handler]
|
17
|
+
@response_handler = options[:response_handler]
|
18
|
+
else
|
19
|
+
@response_handler = BasicResponseHandler.new
|
20
|
+
end
|
10
21
|
|
11
|
-
@
|
22
|
+
@uri_builder = URIBuilder.new(nil, nil, nil, "")
|
23
|
+
@encoding = options[:encoding] || "UTF-8"
|
24
|
+
|
25
|
+
# Set options from the rest of the options-hash
|
26
|
+
options.each do |parameter_name, parameter_value|
|
27
|
+
setter_name = "#{parameter_name}="
|
28
|
+
self.send(setter_name, parameter_value) if self.respond_to?(setter_name)
|
29
|
+
end
|
12
30
|
end
|
13
31
|
|
14
|
-
|
15
|
-
params = options.collect { |key, value| BasicNameValuePair.new(key.to_s, value.to_s) }
|
16
|
-
query_string = URLEncodedUtils.format(params, "UTF-8")
|
17
|
-
uri = URIUtils.create_uri(@protocol, @host, @port, path, query_string, nil)
|
32
|
+
# Request Methods
|
18
33
|
|
19
|
-
|
34
|
+
def get(params, options = {})
|
35
|
+
execute(Get.new(params, options))
|
20
36
|
end
|
21
37
|
|
22
|
-
def post(
|
23
|
-
|
38
|
+
def post(params, options = {})
|
39
|
+
execute(Post.new(params, options))
|
40
|
+
end
|
24
41
|
|
25
|
-
|
26
|
-
|
42
|
+
def delete(path)
|
43
|
+
execute(Delete.new(path))
|
44
|
+
end
|
27
45
|
|
28
|
-
|
46
|
+
def put(path)
|
47
|
+
execute(Put.new(path))
|
29
48
|
end
|
30
49
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
50
|
+
def execute(request)
|
51
|
+
client = DefaultHttpClient.new(params)
|
52
|
+
|
53
|
+
request.make_native_request(client, @uri_builder, @encoding, @response_handler)
|
35
54
|
rescue SocketTimeoutException
|
36
|
-
raise Timeout::Error, "timed out after #{
|
55
|
+
raise Timeout::Error, "timed out after #{so_timeout} ms"
|
37
56
|
ensure
|
38
57
|
client.connection_manager.shutdown
|
39
58
|
end
|
40
|
-
|
41
|
-
def create_client_params
|
42
|
-
params = BasicHttpParams.new
|
43
|
-
DefaultHttpClient.set_default_http_params(params)
|
44
|
-
params.set_int_parameter(CoreConnectionPNames::SO_TIMEOUT, @timeout_in_seconds * 1000)
|
45
|
-
end
|
46
59
|
end
|
47
60
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
UrlEncodedFormEntity = org.apache.http.client.entity.UrlEncodedFormEntity
|
56
|
-
BasicHttpParams = org.apache.http.params.BasicHttpParams
|
57
|
-
CoreConnectionPNames = org.apache.http.params.CoreConnectionPNames
|
58
|
-
SocketTimeoutException = java.net.SocketTimeoutException
|
61
|
+
class URIBuilder
|
62
|
+
def initialize(protocol, host, port, base_path)
|
63
|
+
@protocol = protocol
|
64
|
+
@host = host
|
65
|
+
@port = port
|
66
|
+
@base_path = base_path
|
67
|
+
end
|
59
68
|
|
69
|
+
def create_uri(path, query_string = nil)
|
70
|
+
URIUtils.create_uri(@protocol, @host, @port, "#{@base_path}#{path}", query_string, nil)
|
71
|
+
end
|
72
|
+
end
|
60
73
|
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
module HTTP
|
2
|
+
class Request
|
3
|
+
def self.create_type(&native_request_factory)
|
4
|
+
Class.new do
|
5
|
+
def initialize(path, params = {})
|
6
|
+
@path = path
|
7
|
+
@params = params
|
8
|
+
@headers = {}
|
9
|
+
end
|
10
|
+
|
11
|
+
def add_headers(headers)
|
12
|
+
@headers.merge!(headers)
|
13
|
+
end
|
14
|
+
|
15
|
+
def content_type=(type)
|
16
|
+
add_headers({'content-type' => type})
|
17
|
+
end
|
18
|
+
|
19
|
+
def body=(request_body)
|
20
|
+
@body = request_body
|
21
|
+
end
|
22
|
+
|
23
|
+
def basic_auth(username, password)
|
24
|
+
@username = username
|
25
|
+
@password = password
|
26
|
+
end
|
27
|
+
|
28
|
+
def make_native_request(client, uri_builder, encoding, handler=nil)
|
29
|
+
request = create_native_request(uri_builder, encoding)
|
30
|
+
request.entity = StringEntity.new(@body) unless @body.nil?
|
31
|
+
|
32
|
+
unless @username.nil?
|
33
|
+
client.credentials_provider.set_credentials(AuthScope::ANY, UsernamePasswordCredentials.new(@username, @password))
|
34
|
+
end
|
35
|
+
|
36
|
+
if handler
|
37
|
+
client.execute(request, handler)
|
38
|
+
else
|
39
|
+
client.execute(request)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
define_method(:create_native_request) do |uri_builder, encoding|
|
45
|
+
params = @params.collect { |key, value| BasicNameValuePair.new(key.to_s, value.to_s) }
|
46
|
+
request = native_request_factory.call(uri_builder, @path, params, encoding)
|
47
|
+
|
48
|
+
@headers.each { |name, value| request.add_header(name.to_s, value.to_s) }
|
49
|
+
|
50
|
+
request
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
Post = Request.create_type do |uri_builder, path, params, encoding|
|
57
|
+
post = HttpPost.new(uri_builder.create_uri(path))
|
58
|
+
post.entity = UrlEncodedFormEntity.new(params, encoding)
|
59
|
+
post
|
60
|
+
end
|
61
|
+
|
62
|
+
Get = Request.create_type do |uri_builder, path, params, encoding|
|
63
|
+
query_string = URLEncodedUtils.format(params, encoding)
|
64
|
+
get = HttpGet.new(uri_builder.create_uri(path, query_string))
|
65
|
+
get
|
66
|
+
end
|
67
|
+
|
68
|
+
Delete = Request.create_type do |uri_builder, path|
|
69
|
+
HttpDelete.new(uri_builder.create_uri(path))
|
70
|
+
end
|
71
|
+
|
72
|
+
Put = Request.create_type do |uri_builder, path|
|
73
|
+
HttpPut.new(uri_builder.create_uri(path))
|
74
|
+
end
|
75
|
+
|
76
|
+
private
|
77
|
+
HttpGet = org.apache.http.client.methods.HttpGet
|
78
|
+
HttpPost = org.apache.http.client.methods.HttpPost
|
79
|
+
HttpDelete = org.apache.http.client.methods.HttpDelete
|
80
|
+
HttpPut = org.apache.http.client.methods.HttpPut
|
81
|
+
BasicNameValuePair = org.apache.http.message.BasicNameValuePair
|
82
|
+
URIUtils = org.apache.http.client.utils.URIUtils
|
83
|
+
URLEncodedUtils = org.apache.http.client.utils.URLEncodedUtils
|
84
|
+
UrlEncodedFormEntity = org.apache.http.client.entity.UrlEncodedFormEntity
|
85
|
+
BasicResponseHandler = org.apache.http.impl.client.BasicResponseHandler
|
86
|
+
AuthScope = org.apache.http.auth.AuthScope
|
87
|
+
UsernamePasswordCredentials = org.apache.http.auth.UsernamePasswordCredentials
|
88
|
+
StringEntity = org.apache.http.entity.StringEntity
|
89
|
+
end
|
@@ -0,0 +1,120 @@
|
|
1
|
+
module HTTP
|
2
|
+
BasicHttpParams = org.apache.http.params.BasicHttpParams
|
3
|
+
HttpHost = org.apache.http.HttpHost
|
4
|
+
CoreProtocolPNames = org.apache.http.params.CoreProtocolPNames
|
5
|
+
CoreConnectionPNames = org.apache.http.params.CoreConnectionPNames
|
6
|
+
ConnRoutePNames = org.apache.http.conn.params.ConnRoutePNames
|
7
|
+
CookieSpecPNames = org.apache.http.cookie.params.CookieSpecPNames
|
8
|
+
AuthPNames = org.apache.http.auth.params.AuthPNames
|
9
|
+
ClientPNames = org.apache.http.client.params.ClientPNames
|
10
|
+
|
11
|
+
module Parameters
|
12
|
+
CLIENT_PARAMETERS = {
|
13
|
+
:protocol_version => HTTP::CoreProtocolPNames::PROTOCOL_VERSION,
|
14
|
+
:strict_transfer_encoding => HTTP::CoreProtocolPNames::STRICT_TRANSFER_ENCODING,
|
15
|
+
:http_element_charset => HTTP::CoreProtocolPNames::HTTP_ELEMENT_CHARSET,
|
16
|
+
:use_expect_continue => HTTP::CoreProtocolPNames::USE_EXPECT_CONTINUE,
|
17
|
+
:wait_for_continue => HTTP::CoreProtocolPNames::WAIT_FOR_CONTINUE,
|
18
|
+
:user_agent => HTTP::CoreProtocolPNames::USER_AGENT,
|
19
|
+
:tcp_nodelay => HTTP::CoreConnectionPNames.TCP_NODELAY,
|
20
|
+
:so_timeout => HTTP::CoreConnectionPNames.SO_TIMEOUT,
|
21
|
+
:so_linger => HTTP::CoreConnectionPNames.SO_LINGER,
|
22
|
+
:so_reuseaddr => HTTP::CoreConnectionPNames.SO_REUSEADDR,
|
23
|
+
:socket_buffer_size => HTTP::CoreConnectionPNames.SOCKET_BUFFER_SIZE,
|
24
|
+
:connection_timeout => HTTP::CoreConnectionPNames.CONNECTION_TIMEOUT,
|
25
|
+
:max_line_length => HTTP::CoreConnectionPNames.MAX_LINE_LENGTH,
|
26
|
+
:max_header_count => HTTP::CoreConnectionPNames.MAX_HEADER_COUNT,
|
27
|
+
:stale_connection_check => HTTP::CoreConnectionPNames.STALE_CONNECTION_CHECK,
|
28
|
+
# :forced_route => HTTP::ConnRoutePNames::FORCED_ROUTE, # not implemented
|
29
|
+
:local_address => HTTP::ConnRoutePNames::LOCAL_ADDRESS,
|
30
|
+
:default_proxy => HTTP::ConnRoutePNames::DEFAULT_PROXY,
|
31
|
+
:date_patterns => HTTP::CookieSpecPNames::DATE_PATTERNS,
|
32
|
+
:single_cookie_header => HTTP::CookieSpecPNames::SINGLE_COOKIE_HEADER,
|
33
|
+
:credential_charset => HTTP::AuthPNames::CREDENTIAL_CHARSET,
|
34
|
+
:cookie_policy => HTTP::ClientPNames::COOKIE_POLICY,
|
35
|
+
:handle_authentication => HTTP::ClientPNames::HANDLE_AUTHENTICATION,
|
36
|
+
:handle_redirects => HTTP::ClientPNames::HANDLE_REDIRECTS,
|
37
|
+
:max_redirects => HTTP::ClientPNames::MAX_REDIRECTS,
|
38
|
+
:allow_circular_redirects => HTTP::ClientPNames::ALLOW_CIRCULAR_REDIRECTS,
|
39
|
+
:virtual_host => HTTP::ClientPNames::VIRTUAL_HOST,
|
40
|
+
:default_host => HTTP::ClientPNames::DEFAULT_HOST
|
41
|
+
# :default_headers => HTTP::ClientPNames::DEFAULT_HEADERS, # not implemented
|
42
|
+
# :connection_manager_factory_class_name => HTTP::ClientPNames::CONNECTION_MANAGER_FACTORY_CLASS_NAME # not implemented
|
43
|
+
}
|
44
|
+
|
45
|
+
CLIENT_PARAMETERS.each do |method_name, param_class|
|
46
|
+
define_method(method_name) do
|
47
|
+
params.get_parameter param_class
|
48
|
+
end
|
49
|
+
|
50
|
+
define_method("#{method_name}=") do |arg|
|
51
|
+
arg.add_to_params(params, CLIENT_PARAMETERS[method_name])
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def protocol_version=(version_string)
|
56
|
+
protocol, major_version, minor_version = version_string.split(/[\.|\s|\/]/)
|
57
|
+
params.set_parameter HTTP::CoreProtocolPNames::PROTOCOL_VERSION, org.apache.http.ProtocolVersion.new(protocol, major_version.to_i, minor_version.to_i)
|
58
|
+
end
|
59
|
+
|
60
|
+
def local_address=(local_addr_str)
|
61
|
+
params.set_parameter HTTP::ConnRoutePNames::LOCAL_ADDRESS, java.net.InetAddress.getByName(local_addr_str)
|
62
|
+
end
|
63
|
+
|
64
|
+
def default_proxy=(host)
|
65
|
+
set_host_parameter(HTTP::ConnRoutePNames::DEFAULT_PROXY, host)
|
66
|
+
end
|
67
|
+
|
68
|
+
def virtual_host=(host)
|
69
|
+
set_host_parameter(HTTP::ClientPNames::VIRTUAL_HOST, host)
|
70
|
+
end
|
71
|
+
|
72
|
+
def default_host=(host)
|
73
|
+
set_host_parameter(HTTP::ClientPNames::DEFAULT_HOST, host)
|
74
|
+
end
|
75
|
+
|
76
|
+
def timeout_in_seconds=(timeout)
|
77
|
+
self.so_timeout = timeout * 1000
|
78
|
+
end
|
79
|
+
|
80
|
+
private
|
81
|
+
def set_host_parameter(parameter_name, host)
|
82
|
+
uri = URI.parse host
|
83
|
+
params.set_parameter(parameter_name, HTTP::HttpHost.new(uri.host, uri.port, uri.scheme))
|
84
|
+
end
|
85
|
+
|
86
|
+
def params
|
87
|
+
@params ||= default_params
|
88
|
+
end
|
89
|
+
|
90
|
+
def default_params
|
91
|
+
params = BasicHttpParams.new
|
92
|
+
DefaultHttpClient.set_default_http_params(params)
|
93
|
+
params
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
class Integer
|
99
|
+
def add_to_params(params, param_name)
|
100
|
+
params.set_int_parameter(param_name, self)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
class TrueClass
|
105
|
+
def add_to_params(params, param_name)
|
106
|
+
params.set_boolean_parameter(param_name, self)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
class FalseClass
|
111
|
+
def add_to_params(params, param_name)
|
112
|
+
params.set_boolean_parameter(param_name, self)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
class Object
|
117
|
+
def add_to_params(params, param_name)
|
118
|
+
params.set_parameter(param_name, self)
|
119
|
+
end
|
120
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class BasicAuthTest < Test::Unit::TestCase
|
4
|
+
def test_get_can_authenticate
|
5
|
+
get = HTTP::Get.new("/protected")
|
6
|
+
get.basic_auth("user", "Password")
|
7
|
+
|
8
|
+
response = @client.execute(get)
|
9
|
+
|
10
|
+
assert_equal("Logged In", response)
|
11
|
+
end
|
12
|
+
|
13
|
+
def setup
|
14
|
+
@client = HTTP::Client.new(:default_host => "http://localhost:8080")
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestBasicClientOperations < Test::Unit::TestCase
|
4
|
+
def test_simple_get
|
5
|
+
result = @client.get("/echo", :content => "hello")
|
6
|
+
|
7
|
+
assert_equal("hello", result)
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_simple_post
|
11
|
+
result = @client.post("/echo", :content => "world")
|
12
|
+
|
13
|
+
assert_equal("world", result)
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_simple_delete
|
17
|
+
result = @client.delete("/echo")
|
18
|
+
|
19
|
+
assert_equal("delete", result)
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_simple_put
|
23
|
+
result = @client.put("/echo")
|
24
|
+
|
25
|
+
assert_equal("put", result)
|
26
|
+
end
|
27
|
+
|
28
|
+
def setup
|
29
|
+
@client = HTTP::Client.new(:default_host => "http://localhost:8080")
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestClientHeaders < Test::Unit::TestCase
|
4
|
+
def test_get_headers
|
5
|
+
get = HTTP::Get.new("/echo_header")
|
6
|
+
get.add_headers(:test_header => "get testing")
|
7
|
+
|
8
|
+
response = @client.execute(get)
|
9
|
+
assert_equal("get testing", response)
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_post_headers
|
13
|
+
get = HTTP::Post.new("/echo_header")
|
14
|
+
get.add_headers(:test_header => "post testing")
|
15
|
+
|
16
|
+
response = @client.execute(get)
|
17
|
+
assert_equal("post testing", response)
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_delete_headers
|
21
|
+
get = HTTP::Delete.new("/echo_header")
|
22
|
+
get.add_headers(:test_header => "post testing")
|
23
|
+
|
24
|
+
response = @client.execute(get)
|
25
|
+
assert_equal("post testing", response)
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_put_headers
|
29
|
+
get = HTTP::Put.new("/echo_header")
|
30
|
+
get.add_headers(:test_header => "post testing")
|
31
|
+
|
32
|
+
response = @client.execute(get)
|
33
|
+
assert_equal("post testing", response)
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_multiple_calls_to_add_headers_should_prefer_last_set_of_headers
|
37
|
+
get = HTTP::Get.new("/echo_header")
|
38
|
+
get.add_headers(:test_header => "get testing")
|
39
|
+
get.add_headers(:test_header => "should prefer this one")
|
40
|
+
|
41
|
+
response = @client.execute(get)
|
42
|
+
assert_equal("should prefer this one", response)
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_should_be_able_to_add_content_type
|
46
|
+
get = HTTP::Get.new("/echo_header", :header => 'content-type')
|
47
|
+
get.content_type = 'text/xml'
|
48
|
+
|
49
|
+
response = @client.execute(get)
|
50
|
+
assert_equal('text/xml', response)
|
51
|
+
end
|
52
|
+
|
53
|
+
def setup
|
54
|
+
@client = HTTP::Client.new(:default_host => "http://localhost:8080")
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,201 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestClientParameters < Test::Unit::TestCase
|
4
|
+
def test_timeout
|
5
|
+
client = HTTP::Client.new(:default_host => "http://localhost:8080", :timeout_in_seconds => 2)
|
6
|
+
|
7
|
+
assert_raises(Timeout::Error) do
|
8
|
+
client.get("/slow", :sleep => "30")
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_protocol_version
|
13
|
+
client = HTTP::Client.new(:default_host => "http://localhost:8080", :protocol_version => "HTTP 1.0")
|
14
|
+
result = client.get("/echo", :content => "hello")
|
15
|
+
# We did set the parameter, right?
|
16
|
+
assert_equal(client.protocol_version.to_s, "HTTP/1.0")
|
17
|
+
# Make sure the client is still working (badly set params would prevent this)
|
18
|
+
assert_equal("hello", result)
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_strict_transfer_encodeing
|
22
|
+
client = HTTP::Client.new(:default_host => "http://localhost:8080", :strict_transfer_encoding => true)
|
23
|
+
result = client.get("/echo", :content => "hello")
|
24
|
+
assert_equal(client.strict_transfer_encoding, true)
|
25
|
+
assert_equal("hello", result)
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_http_element_charset
|
29
|
+
client = HTTP::Client.new(:default_host => "http://localhost:8080", :http_element_charset => "ASCII")
|
30
|
+
result = client.get("/echo", :content => "hello")
|
31
|
+
assert_equal(client.http_element_charset, "ASCII")
|
32
|
+
assert_equal("hello", result)
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_use_expect_continue
|
36
|
+
client = HTTP::Client.new(:default_host => "http://localhost:8080", :use_expect_continue => true)
|
37
|
+
result = client.get("/echo", :content => "hello")
|
38
|
+
assert_equal(client.use_expect_continue, true)
|
39
|
+
assert_equal("hello", result)
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_wait_for_continue
|
43
|
+
client = HTTP::Client.new(:default_host => "http://localhost:8080", :wait_for_continue => true)
|
44
|
+
result = client.get("/echo", :content => "hello")
|
45
|
+
assert_equal(client.wait_for_continue, true)
|
46
|
+
assert_equal("hello", result)
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_user_agent
|
50
|
+
client = HTTP::Client.new(:default_host => "http://localhost:8080", :user_agent => "Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.5; en-US; rv:1.9.0.3) Gecko/2008092414 Firefox/3.0.3")
|
51
|
+
result = client.get("/echo", :content => "hello")
|
52
|
+
assert_equal(client.user_agent, "Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.5; en-US; rv:1.9.0.3) Gecko/2008092414 Firefox/3.0.3")
|
53
|
+
assert_equal("hello", result)
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_tcp_nodelay
|
57
|
+
client = HTTP::Client.new(:default_host => "http://localhost:8080", :tcp_nodelay => true)
|
58
|
+
result = client.get("/echo", :content => "hello")
|
59
|
+
assert_equal(client.tcp_nodelay, true)
|
60
|
+
assert_equal("hello", result)
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_so_linger
|
64
|
+
client = HTTP::Client.new(:default_host => "http://localhost:8080", :so_linger => 3000)
|
65
|
+
result = client.get("/echo", :content => "hello")
|
66
|
+
assert_equal(client.so_linger, 3000)
|
67
|
+
assert_equal("hello", result)
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_so_reuseaddr
|
71
|
+
client = HTTP::Client.new(:default_host => "http://localhost:8080", :so_reuseaddr => true)
|
72
|
+
result = client.get("/echo", :content => "hello")
|
73
|
+
assert_equal(client.so_reuseaddr, true)
|
74
|
+
assert_equal("hello", result)
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_socket_buffer_size
|
78
|
+
client = HTTP::Client.new(:default_host => "http://localhost:8080", :socket_buffer_size => 10000)
|
79
|
+
result = client.get("/echo", :content => "hello")
|
80
|
+
assert_equal(client.socket_buffer_size, 10000)
|
81
|
+
assert_equal("hello", result)
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_connection_timeout
|
85
|
+
client = HTTP::Client.new(:default_host => "http://localhost:8080", :connection_timeout => 2)
|
86
|
+
result = client.get("/echo", :content => "hello")
|
87
|
+
assert_equal(client.connection_timeout, 2)
|
88
|
+
assert_equal("hello", result)
|
89
|
+
end
|
90
|
+
|
91
|
+
def test_max_line_length
|
92
|
+
client = HTTP::Client.new(:default_host => "http://localhost:8080", :max_line_length => 2)
|
93
|
+
result = client.get("/echo", :content => "hello")
|
94
|
+
assert_equal(client.max_line_length, 2)
|
95
|
+
assert_equal("hello", result)
|
96
|
+
end
|
97
|
+
|
98
|
+
def test_max_header_count
|
99
|
+
client = HTTP::Client.new(:default_host => "http://localhost:8080", :max_header_count => 10)
|
100
|
+
result = client.get("/echo", :content => "hello")
|
101
|
+
assert_equal(client.max_header_count, 10)
|
102
|
+
assert_equal("hello", result)
|
103
|
+
end
|
104
|
+
|
105
|
+
def test_stale_connection_check
|
106
|
+
client = HTTP::Client.new(:default_host => "http://localhost:8080", :stale_connection_check => true)
|
107
|
+
result = client.get("/echo", :content => "hello")
|
108
|
+
assert_equal(client.stale_connection_check, true)
|
109
|
+
assert_equal("hello", result)
|
110
|
+
end
|
111
|
+
|
112
|
+
def test_local_address
|
113
|
+
client = HTTP::Client.new(:default_host => "http://localhost:8080", :local_address => "127.0.0.1")
|
114
|
+
result = client.get("/echo", :content => "hello")
|
115
|
+
assert_equal(client.local_address.get_host_address, "127.0.0.1")
|
116
|
+
assert_equal("hello", result)
|
117
|
+
end
|
118
|
+
|
119
|
+
def test_default_proxy
|
120
|
+
client = HTTP::Client.new(:default_host => "http://localhost:8080", :default_proxy => "http://127.0.0.1:8080")
|
121
|
+
result = client.get("/echo", :content => "hello")
|
122
|
+
assert_equal(client.default_proxy.to_s, "http://127.0.0.1:8080")
|
123
|
+
assert_equal("hello", result)
|
124
|
+
end
|
125
|
+
|
126
|
+
def test_date_patterns
|
127
|
+
client = HTTP::Client.new(:default_host => "http://localhost:8080", :date_patterns => ["MDy"])
|
128
|
+
result = client.get("/echo", :content => "hello")
|
129
|
+
assert(client.date_patterns.include? 'MDy')
|
130
|
+
assert_equal("hello", result)
|
131
|
+
end
|
132
|
+
|
133
|
+
def test_single_cookie_header
|
134
|
+
client = HTTP::Client.new(:default_host => "http://localhost:8080", :single_cookie_header => true)
|
135
|
+
result = client.get("/echo", :content => "hello")
|
136
|
+
assert_equal(client.single_cookie_header, true)
|
137
|
+
assert_equal("hello", result)
|
138
|
+
end
|
139
|
+
|
140
|
+
def test_credential_charset
|
141
|
+
client = HTTP::Client.new(:default_host => "http://localhost:8080", :credential_charset => "ASCII")
|
142
|
+
result = client.get("/echo", :content => "hello")
|
143
|
+
assert_equal(client.credential_charset, "ASCII")
|
144
|
+
assert_equal("hello", result)
|
145
|
+
end
|
146
|
+
|
147
|
+
def test_cookie_policy
|
148
|
+
client = HTTP::Client.new(:default_host => "http://localhost:8080", :cookie_policy => "RFC2109")
|
149
|
+
result = client.get("/echo", :content => "hello")
|
150
|
+
assert_equal(client.cookie_policy, "RFC2109")
|
151
|
+
assert_equal("hello", result)
|
152
|
+
end
|
153
|
+
|
154
|
+
def test_handle_authentication
|
155
|
+
client = HTTP::Client.new(:default_host => "http://localhost:8080", :handle_authentication => true)
|
156
|
+
result = client.get("/echo", :content => "hello")
|
157
|
+
assert_equal(client.handle_authentication, true)
|
158
|
+
assert_equal("hello", result)
|
159
|
+
end
|
160
|
+
|
161
|
+
def test_handle_redirects
|
162
|
+
client = HTTP::Client.new(:default_host => "http://localhost:8080", :handle_redirects => true)
|
163
|
+
result = client.get("/echo", :content => "hello")
|
164
|
+
assert_equal(client.handle_redirects, true)
|
165
|
+
assert_equal("hello", result)
|
166
|
+
end
|
167
|
+
|
168
|
+
def test_max_redirects
|
169
|
+
client = HTTP::Client.new(:default_host => "http://localhost:8080", :max_redirects => 1)
|
170
|
+
result = client.get("/echo", :content => "hello")
|
171
|
+
assert_equal(client.max_redirects, 1)
|
172
|
+
assert_equal("hello", result)
|
173
|
+
end
|
174
|
+
|
175
|
+
def test_allow_circular_redirects
|
176
|
+
client = HTTP::Client.new(:default_host => "http://localhost:8080", :allow_circular_redirects => true)
|
177
|
+
result = client.get("/echo", :content => "hello")
|
178
|
+
assert_equal(client.allow_circular_redirects, true)
|
179
|
+
assert_equal("hello", result)
|
180
|
+
end
|
181
|
+
|
182
|
+
def test_virtual_host
|
183
|
+
client = HTTP::Client.new(:default_host => "http://localhost:8080", :virtual_host => "http://127.0.0.1:80")
|
184
|
+
result = client.get("/echo", :content => "hello")
|
185
|
+
assert_equal(client.virtual_host.to_s, "http://127.0.0.1:80")
|
186
|
+
assert_equal("hello", result)
|
187
|
+
end
|
188
|
+
|
189
|
+
def test_default_host
|
190
|
+
client = HTTP::Client.new(:default_host => "http://localhost:8080")
|
191
|
+
result = client.get("/echo", :content => "hello")
|
192
|
+
assert_equal(client.default_host.to_s, "http://localhost:8080")
|
193
|
+
assert_equal("hello", result)
|
194
|
+
end
|
195
|
+
|
196
|
+
def test_disable_response_handler
|
197
|
+
client = HTTP::Client.new(:default_host => "http://localhost:8080", :disable_response_handler => true)
|
198
|
+
result = client.get("/echo", :content => "hello")
|
199
|
+
assert_equal(Java::OrgApacheHttpMessage::BasicHttpResponse, result.class)
|
200
|
+
end
|
201
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class RequestEntityTest < Test::Unit::TestCase
|
4
|
+
def test_post_request_body
|
5
|
+
post = HTTP::Post.new("/body")
|
6
|
+
post.body = "Here we are"
|
7
|
+
|
8
|
+
result = @client.execute(post)
|
9
|
+
assert_equal("Here we are", result)
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_put_request_body
|
13
|
+
post = HTTP::Put.new("/body")
|
14
|
+
post.body = "We are there"
|
15
|
+
|
16
|
+
result = @client.execute(post)
|
17
|
+
assert_equal("We are there", result)
|
18
|
+
end
|
19
|
+
|
20
|
+
def setup
|
21
|
+
@client = HTTP::Client.new(:default_host => "http://localhost:8080")
|
22
|
+
end
|
23
|
+
end
|
data/test/http_test_server.rb
CHANGED
@@ -5,9 +5,62 @@ module HTTP
|
|
5
5
|
def self.start_server
|
6
6
|
SERVER.mount('/echo', EchoServlet)
|
7
7
|
SERVER.mount('/slow', SlowServlet)
|
8
|
+
SERVER.mount('/echo_header', HeaderEchoServlet)
|
9
|
+
SERVER.mount('/protected', ProtectedServlet)
|
10
|
+
SERVER.mount('/body', BodyServlet)
|
8
11
|
Thread.new { SERVER.start }
|
9
12
|
end
|
10
13
|
|
14
|
+
class BodyServlet < WEBrick::HTTPServlet::AbstractServlet
|
15
|
+
def do_POST(request, response)
|
16
|
+
response.status = 200
|
17
|
+
response.body = request.body
|
18
|
+
end
|
19
|
+
|
20
|
+
def do_PUT(request, response)
|
21
|
+
response.status = 200
|
22
|
+
response.body = request.body
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
class ProtectedServlet < WEBrick::HTTPServlet::AbstractServlet
|
27
|
+
def do_GET(request, response)
|
28
|
+
WEBrick::HTTPAuth.basic_auth(request, response, "Mine") do |user, pass|
|
29
|
+
user == "user" && pass == "Password"
|
30
|
+
end
|
31
|
+
|
32
|
+
response.status = 200
|
33
|
+
response.body = "Logged In"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
class HeaderEchoServlet < WEBrick::HTTPServlet::AbstractServlet
|
38
|
+
def do_GET(request, response)
|
39
|
+
echo_header(request, response)
|
40
|
+
end
|
41
|
+
|
42
|
+
def do_POST(request, response)
|
43
|
+
echo_header(request, response)
|
44
|
+
end
|
45
|
+
|
46
|
+
def do_DELETE(request, response)
|
47
|
+
echo_header(request, response)
|
48
|
+
end
|
49
|
+
|
50
|
+
def do_PUT(request, response)
|
51
|
+
echo_header(request, response)
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
def echo_header(request, response)
|
56
|
+
header_to_echo = request.query['header'] || 'test_header'
|
57
|
+
|
58
|
+
response.status = 200
|
59
|
+
response['Content-Type'] = 'text/plain'
|
60
|
+
response.body = request.header[header_to_echo].first
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
11
64
|
class EchoServlet < WEBrick::HTTPServlet::AbstractServlet
|
12
65
|
|
13
66
|
def do_GET(request, response)
|
@@ -18,11 +71,19 @@ module HTTP
|
|
18
71
|
echo(request, response)
|
19
72
|
end
|
20
73
|
|
74
|
+
def do_DELETE(request, response)
|
75
|
+
echo(request, response, "delete")
|
76
|
+
end
|
77
|
+
|
78
|
+
def do_PUT(request, response)
|
79
|
+
echo(request, response, "put")
|
80
|
+
end
|
81
|
+
|
21
82
|
private
|
22
|
-
def echo(request, response)
|
83
|
+
def echo(request, response, canned_response = nil)
|
23
84
|
response.status = 200
|
24
85
|
response['Content-Type'] = 'text/plain'
|
25
|
-
response.body = request.query['content']
|
86
|
+
response.body = canned_response || request.query['content']
|
26
87
|
end
|
27
88
|
end
|
28
89
|
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: jruby-httpclient
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.
|
5
|
+
version: 0.2.0
|
6
6
|
platform: java
|
7
7
|
authors:
|
8
8
|
- Adam Esterline
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-06-
|
13
|
+
date: 2011-06-28 00:00:00 -06:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -36,7 +36,7 @@ dependencies:
|
|
36
36
|
prerelease: false
|
37
37
|
type: :development
|
38
38
|
- !ruby/object:Gem::Dependency
|
39
|
-
name:
|
39
|
+
name: rdoc
|
40
40
|
version_requirements: &id003 !ruby/object:Gem::Requirement
|
41
41
|
none: false
|
42
42
|
requirements:
|
@@ -46,17 +46,6 @@ dependencies:
|
|
46
46
|
requirement: *id003
|
47
47
|
prerelease: false
|
48
48
|
type: :development
|
49
|
-
- !ruby/object:Gem::Dependency
|
50
|
-
name: rdoc
|
51
|
-
version_requirements: &id004 !ruby/object:Gem::Requirement
|
52
|
-
none: false
|
53
|
-
requirements:
|
54
|
-
- - ">="
|
55
|
-
- !ruby/object:Gem::Version
|
56
|
-
version: "0"
|
57
|
-
requirement: *id004
|
58
|
-
prerelease: false
|
59
|
-
type: :development
|
60
49
|
description: An HTTP client designed for use with JRuby in a threaded environment
|
61
50
|
email: adam@esterlines.com
|
62
51
|
executables: []
|
@@ -74,10 +63,17 @@ files:
|
|
74
63
|
- README.rdoc
|
75
64
|
- Rakefile
|
76
65
|
- VERSION
|
66
|
+
- jruby-httpclient.gemspec
|
77
67
|
- lib/http_client.rb
|
78
68
|
- lib/http_client/client.rb
|
69
|
+
- lib/http_client/methods.rb
|
70
|
+
- lib/http_client/parameters.rb
|
79
71
|
- test/helper.rb
|
80
|
-
- test/http_client/
|
72
|
+
- test/http_client/test_basic_auth.rb
|
73
|
+
- test/http_client/test_basic_client_operations.rb
|
74
|
+
- test/http_client/test_client_headers.rb
|
75
|
+
- test/http_client/test_client_parameters.rb
|
76
|
+
- test/http_client/test_request_entity.rb
|
81
77
|
- test/http_test_server.rb
|
82
78
|
- vendor/commons-codec-1.4.jar
|
83
79
|
- vendor/commons-logging-1.1.1.jar
|
@@ -1,28 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
|
3
|
-
class TestClient < Test::Unit::TestCase
|
4
|
-
def test_simple_get
|
5
|
-
result = @client.get("/echo", :content => "hello")
|
6
|
-
|
7
|
-
assert_equal("hello", result)
|
8
|
-
end
|
9
|
-
|
10
|
-
def test_simple_post
|
11
|
-
result = @client.post("/echo", :content => "world")
|
12
|
-
|
13
|
-
assert_equal("world", result)
|
14
|
-
end
|
15
|
-
|
16
|
-
def test_timeout
|
17
|
-
client = HTTP::Client.new(:host => "localhost", :port => 8080)
|
18
|
-
@client.timeout_in_seconds = 2
|
19
|
-
|
20
|
-
assert_raises(Timeout::Error) do
|
21
|
-
@client.get("/slow", :sleep => "30")
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
def setup
|
26
|
-
@client = HTTP::Client.new(:host => "localhost", :port => 8080)
|
27
|
-
end
|
28
|
-
end
|