http-requestor 0.0.4 → 1.0.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/README.rdoc +18 -5
- data/lib/http_requestor.rb +148 -0
- data/lib/http_requestor_multipart.rb +95 -0
- data/test/http_requestor_test.rb +33 -11
- data/test/testfile.txt +1 -0
- metadata +23 -7
- data/lib/http-requestor.rb +0 -134
data/README.rdoc
CHANGED
@@ -11,8 +11,8 @@ A Wrapper around Net/HTTP which allows you to perform HTTP Requests in a simple
|
|
11
11
|
|
12
12
|
=== Initialize a domain, and send request to multiple paths
|
13
13
|
|
14
|
-
http =
|
15
|
-
# This will initialize the
|
14
|
+
http = HTTP::Requestor.new("http://www.mydomain.com")
|
15
|
+
# This will initialize the HTTP::Requestor class
|
16
16
|
|
17
17
|
get_request = http.get(path, parameters, headers)
|
18
18
|
post_request = http.post(path, parameters, headers)
|
@@ -25,7 +25,7 @@ A Wrapper around Net/HTTP which allows you to perform HTTP Requests in a simple
|
|
25
25
|
|
26
26
|
=== Get a response right away
|
27
27
|
|
28
|
-
|
28
|
+
HTTP::Requestor.request(domain, request_type, path, parameters, headers)
|
29
29
|
# domain => for example: "http://www.some_domain.com"
|
30
30
|
# request_type => GET|POST|PUT|DELETE
|
31
31
|
# path => for example: "/some_path"
|
@@ -34,7 +34,7 @@ A Wrapper around Net/HTTP which allows you to perform HTTP Requests in a simple
|
|
34
34
|
|
35
35
|
OR you can do it the other way
|
36
36
|
|
37
|
-
|
37
|
+
HTTP::Requestor.request_with_url(url, request_type, data, headers)
|
38
38
|
# url => for example: "http://www.some_domain.com/some_path_value"
|
39
39
|
# request_type => GET|POST|PUT|DELETE
|
40
40
|
# parameters => this is an optional parameter, if you want to send some parameters alongwith the request, you can pass a hash with
|
@@ -42,11 +42,24 @@ OR you can do it the other way
|
|
42
42
|
|
43
43
|
=== HTTP Basic Authentication
|
44
44
|
|
45
|
-
|
45
|
+
HTTP::Requestor.send_basic_auth_request(url, username, password)
|
46
46
|
# url => for example: "http://www.some_domain.com/some_path_value" only GET URL's supported currently
|
47
47
|
# username => basic_auth_username
|
48
48
|
# password => basic_auth_password
|
49
|
+
|
50
|
+
=== Multipart Form Post
|
51
|
+
|
52
|
+
uri = "http://some_domain/somepath"
|
53
|
+
data = {:file => File.open("testfile.txt")}
|
54
|
+
response = HTTP::Requestor.multipart_request(uri, "post | put", data)
|
55
|
+
|
56
|
+
# If you already have the instance of HTTP::Requestor class then you can upload files as follows:
|
49
57
|
|
58
|
+
http = HTTP::Requestor.new("http://www.mydomain.com")
|
59
|
+
response = http.post_multipart(some_path, {:file => File.open("testfile.txt")})
|
60
|
+
response = http.put_multipart(some_path, {:file => File.open("testfile.txt")})
|
61
|
+
|
62
|
+
|
50
63
|
== Issues and Suggestions
|
51
64
|
|
52
65
|
Please report all the issues in the Github Issues Page, suggestions are also welcome.
|
@@ -0,0 +1,148 @@
|
|
1
|
+
require "net/http"
|
2
|
+
require "net/https"
|
3
|
+
require "uri"
|
4
|
+
|
5
|
+
module HTTP
|
6
|
+
class Requestor
|
7
|
+
#============== Instance Methods ===================
|
8
|
+
def initialize(domain, options={})
|
9
|
+
domain = "http://#{domain}" if domain.match(/^(http|https):\/\//).nil?
|
10
|
+
|
11
|
+
@defaults = {:domain => domain}
|
12
|
+
@uri = URI.parse(@defaults[:domain])
|
13
|
+
if @uri.scheme == "http"
|
14
|
+
@http = Net::HTTP.new(@uri.host, @uri.port)
|
15
|
+
else
|
16
|
+
@http = Net::HTTP.new(@uri.host, @uri.port)
|
17
|
+
@http.use_ssl = true
|
18
|
+
@http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def get(path,data={},headers=nil)
|
23
|
+
data_to_query(data)
|
24
|
+
if headers == nil
|
25
|
+
response = @http.send_request('GET', path, @defaults[:data])
|
26
|
+
else
|
27
|
+
response = @http.send_request('GET', path, @defaults[:data], headers)
|
28
|
+
end
|
29
|
+
response
|
30
|
+
end
|
31
|
+
|
32
|
+
def post(path,data={},headers=nil)
|
33
|
+
data_to_query(data)
|
34
|
+
if headers == nil
|
35
|
+
response = @http.send_request('POST', path, @defaults[:data])
|
36
|
+
else
|
37
|
+
response = @http.send_request('POST', path, @defaults[:data], headers)
|
38
|
+
end
|
39
|
+
response
|
40
|
+
end
|
41
|
+
|
42
|
+
def put(path,data={},headers=nil)
|
43
|
+
data_to_query(data)
|
44
|
+
if headers == nil
|
45
|
+
response = @http.send_request('PUT', path, @defaults[:data])
|
46
|
+
else
|
47
|
+
response = @http.send_request('PUT', path, @defaults[:data], headers)
|
48
|
+
end
|
49
|
+
response
|
50
|
+
end
|
51
|
+
|
52
|
+
def delete(path,data={},headers=nil)
|
53
|
+
data_to_query(data)
|
54
|
+
if headers == nil
|
55
|
+
response = @http.send_request('DELETE', path, @defaults[:data])
|
56
|
+
else
|
57
|
+
response = @http.send_request('DELETE', path, @defaults[:data], headers)
|
58
|
+
end
|
59
|
+
response
|
60
|
+
end
|
61
|
+
|
62
|
+
def data_to_query(data)
|
63
|
+
@defaults[:data] = (data.nil? || data.empty?) ? "" : data.to_query
|
64
|
+
end
|
65
|
+
|
66
|
+
#============== Class Methods ===================
|
67
|
+
def self.request(domain, request_type, request_path, data={}, headers={}, options={})
|
68
|
+
request_type.to_s.upcase!
|
69
|
+
request_type = valid_request_types[0] unless valid_request_types.include?(request_type)
|
70
|
+
req = self.new(domain, options)
|
71
|
+
if request_type == "GET"
|
72
|
+
return req.get(request_path, data, headers)
|
73
|
+
elsif request_type == "POST"
|
74
|
+
return req.post(request_path, data, headers)
|
75
|
+
elsif request_type == "PUT"
|
76
|
+
return req.put(request_path, data, headers)
|
77
|
+
elsif request_type == "DELETE"
|
78
|
+
return req.delete(request_path, data, headers)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def self.request_with_url(url, request_type, data={}, headers={})
|
83
|
+
uri = URI.parse(url)
|
84
|
+
return self.request("#{uri.scheme}://#{uri.host}:#{uri.port}", request_type, uri.request_uri, data, headers)
|
85
|
+
end
|
86
|
+
|
87
|
+
def self.send_basic_auth_request(url, username, password)
|
88
|
+
uri = URI.parse(url)
|
89
|
+
|
90
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
91
|
+
request = Net::HTTP::Get.new(uri.request_uri)
|
92
|
+
request.basic_auth(username, password)
|
93
|
+
http.request(request)
|
94
|
+
end
|
95
|
+
|
96
|
+
def self.valid_request_types
|
97
|
+
["GET", "POST", "UPDATE", "DELETE"]
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
#================ ActiveSupport Like object#to_query methods =========================
|
103
|
+
class Hash
|
104
|
+
def to_query(namespace = nil)
|
105
|
+
collect do |key, value|
|
106
|
+
value.to_query(namespace ? "#{namespace}[#{key}]" : key)
|
107
|
+
end.sort * '&'
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
class Array
|
112
|
+
def to_query(key)
|
113
|
+
prefix = "#{key}[]"
|
114
|
+
collect { |value| value.to_query(prefix) }.join '&'
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
class String
|
119
|
+
def to_query(key)
|
120
|
+
require 'cgi' unless defined?(CGI) && defined?(CGI::escape)
|
121
|
+
"#{CGI.escape(key.to_param)}=#{CGI.escape(to_param.to_s)}"
|
122
|
+
end
|
123
|
+
|
124
|
+
def to_param
|
125
|
+
to_s
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
class Symbol
|
130
|
+
def to_query(key)
|
131
|
+
to_s.to_query(key)
|
132
|
+
end
|
133
|
+
|
134
|
+
def to_param
|
135
|
+
to_s
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
class File
|
140
|
+
require 'mime/types'
|
141
|
+
def original_filename
|
142
|
+
path.split("/").last
|
143
|
+
end
|
144
|
+
|
145
|
+
def content_type
|
146
|
+
MIME::Types.type_for(original_filename).first
|
147
|
+
end
|
148
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
module HTTP
|
2
|
+
class Requestor
|
3
|
+
def post_multipart(path="", data={},headers=nil)
|
4
|
+
@uri = URI.parse(@defaults[:domain] + path) unless path.empty?
|
5
|
+
build_data(data)
|
6
|
+
req = Net::HTTP::Post.new(@uri.request_uri)
|
7
|
+
req.initialize_http_header(headers) unless headers.nil?
|
8
|
+
req.body = @post_body
|
9
|
+
req["Content-Type"] = "multipart/form-data; boundary=#{@boundary}"
|
10
|
+
res = @http.request(req)
|
11
|
+
@post_body = ""
|
12
|
+
@boundary = ""
|
13
|
+
res
|
14
|
+
end
|
15
|
+
|
16
|
+
def put_multipart(path="", data={},headers=nil)
|
17
|
+
@uri = URI.parse(@defaults[:domain] + path) unless path.empty?
|
18
|
+
build_data(data)
|
19
|
+
req = Net::HTTP::Put.new(@uri.request_uri)
|
20
|
+
req.initialize_http_header(headers) unless headers.nil?
|
21
|
+
req.body = @post_body
|
22
|
+
req["Content-Type"] = "multipart/form-data; boundary=#{@boundary}"
|
23
|
+
res = @http.request(req)
|
24
|
+
@post_body = ""
|
25
|
+
@boundary = ""
|
26
|
+
res
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.multipart_request(domain, request_type, data={}, headers={}, options={})
|
30
|
+
request_type.to_s.upcase!
|
31
|
+
request_type = valid_request_types[0] unless valid_request_types.include?(request_type)
|
32
|
+
req = self.new(domain, options)
|
33
|
+
|
34
|
+
if request_type == "POST"
|
35
|
+
return req.post_multipart("", data, headers)
|
36
|
+
elsif request_type == "PUT"
|
37
|
+
return req.put_multipart("", data, headers)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
def create_boundary
|
43
|
+
chars = ('a'..'z').to_a + ('A'..'Z').to_a + ('0'..'9').to_a
|
44
|
+
boundary = ""
|
45
|
+
20.times { boundary = boundary + chars.sample }
|
46
|
+
boundary
|
47
|
+
end
|
48
|
+
|
49
|
+
def build_data(data)
|
50
|
+
@boundary = create_boundary
|
51
|
+
@post_body = ""
|
52
|
+
|
53
|
+
create_post_body(data)
|
54
|
+
|
55
|
+
@post_body << "\r\n--#{@boundary}--\r\n"
|
56
|
+
end
|
57
|
+
|
58
|
+
def create_post_body(parameters, datafile="")
|
59
|
+
parameters.each_pair do |key, value|
|
60
|
+
unless value.nil?
|
61
|
+
disposition = datafile.empty? ? key : "#{datafile}[#{key}]"
|
62
|
+
if value.is_a?(File)
|
63
|
+
@post_body << "\r\n--#{@boundary}\r\n"
|
64
|
+
@post_body << "Content-Disposition: form-data; name=\"#{disposition}\"; filename=\"#{value.original_filename}\"\r\n"
|
65
|
+
@post_body << "Content-Type: #{value.content_type}\r\n"
|
66
|
+
@post_body << "\r\n"
|
67
|
+
@post_body << File.read(value)
|
68
|
+
elsif [Hash].include?(value.class)
|
69
|
+
create_post_body(value, disposition)
|
70
|
+
elsif value.is_a?(Array)
|
71
|
+
value.each do |a|
|
72
|
+
if [Hash].include?(a.class)
|
73
|
+
create_post_body(a, "#{disposition}[]")
|
74
|
+
elsif [File].include?(a.class)
|
75
|
+
@post_body << "\r\n--#{@boundary}\r\n"
|
76
|
+
@post_body << "Content-Disposition: form-data; name=\"#{disposition}[]\"; filename=\"#{a.original_filename}\"\r\n"
|
77
|
+
@post_body << "Content-Type: #{a.content_type}\r\n"
|
78
|
+
@post_body << "\r\n"
|
79
|
+
@post_body << File.read(a)
|
80
|
+
else
|
81
|
+
@post_body << "\r\n--#{@boundary}\r\n"
|
82
|
+
@post_body << "Content-Disposition: form-data; name=\"#{disposition}[]\"\r\n\r\n"
|
83
|
+
@post_body << "#{a}"
|
84
|
+
end
|
85
|
+
end
|
86
|
+
else
|
87
|
+
@post_body << "\r\n--#{@boundary}\r\n"
|
88
|
+
@post_body << "Content-Disposition: form-data; name=\"#{disposition}\"\r\n\r\n"
|
89
|
+
@post_body << "#{value}"
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
data/test/http_requestor_test.rb
CHANGED
@@ -1,22 +1,44 @@
|
|
1
|
-
require "../lib/
|
1
|
+
require "../lib/http_requestor"
|
2
|
+
require "../lib/http_requestor_multipart"
|
2
3
|
require "test/unit"
|
3
4
|
|
4
5
|
class HttpRequestorTest < Test::Unit::TestCase
|
5
|
-
|
6
|
-
|
7
|
-
assert_raise(InvalidURISchemeException) { HttpRequestor.new("some://www.invalid_url_scheme.com") }
|
6
|
+
def test_should_get_data_when_request_type_not_specified
|
7
|
+
assert_equal("200", HTTP::Requestor.request("http://en.wikibooks.org", "", "/wiki/Ruby_Programming/Unit_testing#A_Simple_Introduction").code )
|
8
8
|
end
|
9
9
|
|
10
|
-
def
|
11
|
-
|
12
|
-
|
10
|
+
def test_should_post_file_properly
|
11
|
+
headers = {"application_api_key" => "bltc5b185cd6884ae87", "application_uid" => "blt2f37284c14b6b453"}
|
12
|
+
uri = "http://localhost:3000/files.json"
|
13
|
+
f=File.open("testfile.txt", "w+")
|
14
|
+
f.syswrite("This is testing")
|
15
|
+
f.close
|
16
|
+
data = {:object => {:title => "This is from http-requestor", :file1 => File.open("testfile.txt")}}
|
17
|
+
|
18
|
+
assert_equal("201", HTTP::Requestor.multipart_request(uri, "post", data, headers).code)
|
13
19
|
end
|
20
|
+
|
21
|
+
def test_should_post_file_properly_with_instance_method_used
|
22
|
+
http = HTTP::Requestor.new("http://localhost:3000")
|
23
|
+
|
24
|
+
headers = {"application_api_key" => "bltc5b185cd6884ae87", "application_uid" => "blt2f37284c14b6b453"}
|
25
|
+
path = "/files.json"
|
26
|
+
f=File.open("testfile.txt", "w+")
|
27
|
+
f.syswrite("This is testing")
|
28
|
+
f.close
|
29
|
+
data = {:object => {:title => "This is from http-requestor", :file1 => File.open("testfile.txt")}}
|
14
30
|
|
15
|
-
|
16
|
-
assert_raise(InvalidRequestTypeException) { HttpRequestor.request("http://en.wikibooks.org", "OPTIONS", "/wiki/Ruby_Programming/Unit_testing#A_Simple_Introduction") }
|
31
|
+
assert_equal("201", http.post_multipart(path, data, headers).code)
|
17
32
|
end
|
18
33
|
|
19
|
-
def
|
20
|
-
|
34
|
+
def test_should_post_multiple_files
|
35
|
+
headers = {"application_api_key" => "bltc5b185cd6884ae87", "application_uid" => "blt2f37284c14b6b453"}
|
36
|
+
uri = "http://localhost:3000/multiplefiles.json"
|
37
|
+
f=File.open("testfile.txt", "w+")
|
38
|
+
f.syswrite("This is testing")
|
39
|
+
f.close
|
40
|
+
data = {:object => {:title => ["Title 1", "Title 2"], :file => [File.open("testfile.txt"), File.open("testfile.txt")]}}
|
41
|
+
|
42
|
+
assert_equal("201", HTTP::Requestor.multipart_request(uri, "post", data, headers).code)
|
21
43
|
end
|
22
44
|
end
|
data/test/testfile.txt
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
This is testing
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: http-requestor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 1.0.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,20 +9,35 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
13
|
-
dependencies:
|
14
|
-
|
12
|
+
date: 2012-11-23 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: mime-types
|
16
|
+
requirement: &28629120 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 1.17.2
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *28629120
|
25
|
+
description: ! " A Wrapper around Net/HTTP which allows you to perform HTTP Requests.\n
|
26
|
+
\ Gives you a simple API interface to send multipart requests.\n"
|
15
27
|
email: rohit0981989@gmail.com
|
16
28
|
executables: []
|
17
29
|
extensions: []
|
18
30
|
extra_rdoc_files: []
|
19
31
|
files:
|
20
|
-
- lib/
|
32
|
+
- lib/http_requestor.rb
|
33
|
+
- lib/http_requestor_multipart.rb
|
21
34
|
- MIT-LICENSE
|
22
35
|
- README.rdoc
|
23
36
|
- test/http_requestor_test.rb
|
37
|
+
- test/testfile.txt
|
24
38
|
homepage: http://github.com/rohit9889/http-requestor
|
25
|
-
licenses:
|
39
|
+
licenses:
|
40
|
+
- MIT
|
26
41
|
post_install_message:
|
27
42
|
rdoc_options: []
|
28
43
|
require_paths:
|
@@ -41,9 +56,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
41
56
|
version: '0'
|
42
57
|
requirements: []
|
43
58
|
rubyforge_project:
|
44
|
-
rubygems_version: 1.8.
|
59
|
+
rubygems_version: 1.8.5
|
45
60
|
signing_key:
|
46
61
|
specification_version: 3
|
47
62
|
summary: A Wrapper around Net/HTTP which allows you to perform HTTP Requests.
|
48
63
|
test_files:
|
49
64
|
- test/http_requestor_test.rb
|
65
|
+
- test/testfile.txt
|
data/lib/http-requestor.rb
DELETED
@@ -1,134 +0,0 @@
|
|
1
|
-
require "net/http"
|
2
|
-
require "net/https"
|
3
|
-
require "uri"
|
4
|
-
|
5
|
-
class HttpRequestor
|
6
|
-
|
7
|
-
#============== Instance Methods ===================
|
8
|
-
|
9
|
-
def initialize(domain, options={})
|
10
|
-
raise InvalidURISchemeException, "Please send a valid URI scheme." if domain.match(/(http|https):\/\//).nil?
|
11
|
-
|
12
|
-
@defaults = {:domain => domain}
|
13
|
-
uri = URI.parse(@defaults[:domain])
|
14
|
-
if uri.scheme == "http"
|
15
|
-
@http = Net::HTTP.new(uri.host, uri.port)
|
16
|
-
else
|
17
|
-
@http = Net::HTTP.new(uri.host, uri.port)
|
18
|
-
@http.use_ssl = true
|
19
|
-
@http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
def get(path,data={},headers=nil)
|
24
|
-
data = data_to_query(data)
|
25
|
-
if headers == nil
|
26
|
-
response = @http.send_request('GET',path,data)
|
27
|
-
else
|
28
|
-
response = @http.send_request('GET',path,data,headers)
|
29
|
-
end
|
30
|
-
response
|
31
|
-
end
|
32
|
-
|
33
|
-
def post(path,data={},headers=nil)
|
34
|
-
data = data_to_query(data)
|
35
|
-
if headers == nil
|
36
|
-
response = @http.send_request('POST',path,data)
|
37
|
-
else
|
38
|
-
response = @http.send_request('POST',path,data,headers)
|
39
|
-
end
|
40
|
-
response
|
41
|
-
end
|
42
|
-
|
43
|
-
def put(path,data={},headers=nil)
|
44
|
-
data = data_to_query(data)
|
45
|
-
if headers == nil
|
46
|
-
response = @http.send_request('PUT',path,data)
|
47
|
-
else
|
48
|
-
response = @http.send_request('PUT',path,data,headers)
|
49
|
-
end
|
50
|
-
response
|
51
|
-
end
|
52
|
-
|
53
|
-
def delete(path,data={},headers=nil)
|
54
|
-
data = data_to_query(data)
|
55
|
-
if headers == nil
|
56
|
-
response = @http.send_request('DELETE',path,data)
|
57
|
-
else
|
58
|
-
response = @http.send_request('DELETE',path,data,headers)
|
59
|
-
end
|
60
|
-
response
|
61
|
-
end
|
62
|
-
|
63
|
-
def data_to_query(data)
|
64
|
-
return (data.nil? || data.empty?) ? "" : data.to_query
|
65
|
-
end
|
66
|
-
|
67
|
-
#============== Class Methods ===================
|
68
|
-
def self.request(domain, request_type, request_path, data={}, headers={})
|
69
|
-
request_type.upcase!
|
70
|
-
raise InvalidRequestTypeException, "Please pass a valid request type." unless valid_request_types.include?(request_type)
|
71
|
-
req = HttpRequestor.new(domain)
|
72
|
-
if request_type == "GET"
|
73
|
-
return req.get(request_path, data, headers)
|
74
|
-
elsif request_type == "POST"
|
75
|
-
return req.post(request_path, data, headers)
|
76
|
-
elsif request_type == "PUT"
|
77
|
-
return req.put(request_path, data, headers)
|
78
|
-
elsif request_type == "DELETE"
|
79
|
-
return req.delete(request_path, data, headers)
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
def self.request_with_url(url, request_type, data={}, headers={})
|
84
|
-
uri = URI.parse(url)
|
85
|
-
return self.request("#{uri.scheme}://#{uri.host}:#{uri.port}", request_type, uri.request_uri, data, headers)
|
86
|
-
end
|
87
|
-
|
88
|
-
def self.send_basic_auth_request(url, username, password)
|
89
|
-
uri = URI.parse(url)
|
90
|
-
|
91
|
-
http = Net::HTTP.new(uri.host, uri.port)
|
92
|
-
request = Net::HTTP::Get.new(uri.request_uri)
|
93
|
-
request.basic_auth(username, password)
|
94
|
-
http.request(request)
|
95
|
-
end
|
96
|
-
|
97
|
-
def self.valid_request_types
|
98
|
-
["GET", "POST", "UPDATE", "DELETE"]
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
#================ ActiveSupport Like object#to_query methods =========================
|
103
|
-
class Hash
|
104
|
-
def to_query(namespace = nil)
|
105
|
-
collect do |key, value|
|
106
|
-
value.to_query(namespace ? "#{namespace}[#{key}]" : key)
|
107
|
-
end.sort * '&'
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
class Array
|
112
|
-
def to_query(key)
|
113
|
-
prefix = "#{key}[]"
|
114
|
-
collect { |value| value.to_query(prefix) }.join '&'
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
class String
|
119
|
-
def to_query(key)
|
120
|
-
require 'cgi' unless defined?(CGI) && defined?(CGI::escape)
|
121
|
-
"#{CGI.escape(key.to_param)}=#{CGI.escape(to_param.to_s)}"
|
122
|
-
end
|
123
|
-
|
124
|
-
def to_param
|
125
|
-
to_s
|
126
|
-
end
|
127
|
-
end
|
128
|
-
|
129
|
-
#================= Exceptions ======================
|
130
|
-
class InvalidRequestTypeException < Exception
|
131
|
-
end
|
132
|
-
|
133
|
-
class InvalidURISchemeException < Exception
|
134
|
-
end
|