http-request 1.2.2 → 1.2.4
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/lib/http-request.rb +2 -3
- data/lib/http-request/client.rb +4 -4
- data/lib/http-request/connection.rb +24 -4
- data/lib/http-request/response.rb +5 -5
- data/lib/http-request/version.rb +1 -1
- metadata +4 -4
data/lib/http-request.rb
CHANGED
@@ -26,7 +26,7 @@ module HttpRequest
|
|
26
26
|
:timeout => 30, # default seconds to timeout a request
|
27
27
|
:auto_redirect => true,
|
28
28
|
:max_redirects => 3,
|
29
|
-
:keep_alive =>
|
29
|
+
:keep_alive => 60
|
30
30
|
}
|
31
31
|
@config.tap { @config.merge!(options) if !options.empty? }
|
32
32
|
end
|
@@ -35,8 +35,7 @@ module HttpRequest
|
|
35
35
|
[:get, :post, :put, :delete, :head].each do |verb|
|
36
36
|
define_method(verb) do |*args|
|
37
37
|
url, headers, body = args
|
38
|
-
|
39
|
-
@client.send verb, *args
|
38
|
+
open(url).send verb, *args
|
40
39
|
end
|
41
40
|
end
|
42
41
|
end
|
data/lib/http-request/client.rb
CHANGED
@@ -22,7 +22,7 @@ module HttpRequest
|
|
22
22
|
@open_url ||= url
|
23
23
|
|
24
24
|
# Let's close any dead connections as we open new ones
|
25
|
-
|
25
|
+
sweep_dead_connections!
|
26
26
|
|
27
27
|
# Reuse existing connection or open a new one..
|
28
28
|
conn = connection(url)
|
@@ -95,9 +95,9 @@ module HttpRequest
|
|
95
95
|
|
96
96
|
private
|
97
97
|
|
98
|
-
def
|
99
|
-
dead_conns = connections.collect {|conn| conn if conn.
|
100
|
-
dead_conns.each {|conn| @connections.delete(conn) }
|
98
|
+
def sweep_dead_connections!
|
99
|
+
dead_conns = connections.collect {|conn| conn if conn.dead? }.compact
|
100
|
+
dead_conns.each {|conn| conn.close; @connections.delete(conn) }
|
101
101
|
end
|
102
102
|
end
|
103
103
|
end
|
@@ -1,7 +1,8 @@
|
|
1
1
|
module HttpRequest
|
2
2
|
class Connection
|
3
|
-
attr_reader :uri, :http
|
4
|
-
attr_accessor :user_agent, :max_retries, :timeout, :auto_redirect,
|
3
|
+
attr_reader :uri, :http, :time_since_last_io
|
4
|
+
attr_accessor :user_agent, :max_retries, :timeout, :auto_redirect,
|
5
|
+
:max_redirects, :keep_alive
|
5
6
|
|
6
7
|
def initialize(url, options={})
|
7
8
|
# Connection settings
|
@@ -34,6 +35,8 @@ module HttpRequest
|
|
34
35
|
if socket && socket.respond_to?(:io) && Socket.const_defined?(:TCP_NODELAY)
|
35
36
|
socket.io.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, true)
|
36
37
|
end
|
38
|
+
|
39
|
+
@time_since_last_io = Time.now.to_i
|
37
40
|
end
|
38
41
|
|
39
42
|
def ssl?
|
@@ -52,6 +55,19 @@ module HttpRequest
|
|
52
55
|
!(!http.nil? && http.started?)
|
53
56
|
end
|
54
57
|
|
58
|
+
def dead?
|
59
|
+
return false if !opened? # Can't be dead if it hasn't strated
|
60
|
+
return !keep_alive? || socket.closed?
|
61
|
+
end
|
62
|
+
|
63
|
+
def keep_alive?
|
64
|
+
if keep_alive > 0 && time_since_last_io
|
65
|
+
(Time.now.to_i - time_since_last_io) < keep_alive
|
66
|
+
else
|
67
|
+
false
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
55
71
|
def socket
|
56
72
|
return if http.nil?
|
57
73
|
http.instance_variable_get(:@socket)
|
@@ -87,7 +103,7 @@ module HttpRequest
|
|
87
103
|
|
88
104
|
# Default headers
|
89
105
|
headers['User-Agent'] ||= user_agent
|
90
|
-
headers['Connection'] ||= 'keep-alive' if keep_alive
|
106
|
+
headers['Connection'] ||= 'keep-alive' if keep_alive?
|
91
107
|
headers['Content-Length'] ||= body.bytesize.to_s if body
|
92
108
|
headers['Accept-Encoding'] ||= 'gzip' # TODO: add deflate support
|
93
109
|
|
@@ -96,10 +112,14 @@ module HttpRequest
|
|
96
112
|
req = req_klass.new(uri.request_uri, headers)
|
97
113
|
req.body = body if !body.nil? && !body.empty?
|
98
114
|
|
115
|
+
# do auth if user and password provided
|
116
|
+
req.basic_auth uri.user, uri.password if uri.user && uri.password
|
117
|
+
|
99
118
|
# Make the HTTP request
|
100
119
|
retries = max_retries
|
101
120
|
begin
|
102
121
|
response = http.request(req)
|
122
|
+
@time_since_last_io = Time.now.to_i
|
103
123
|
rescue EOFError, Errno::EPIPE
|
104
124
|
# Something happened to our connection, lets try this again
|
105
125
|
if retries > 0
|
@@ -111,7 +131,7 @@ module HttpRequest
|
|
111
131
|
|
112
132
|
# Let's make sure we close the connection if we don't intend to
|
113
133
|
# have persistent connections..
|
114
|
-
close if !keep_alive
|
134
|
+
close if !keep_alive?
|
115
135
|
|
116
136
|
response
|
117
137
|
end
|
@@ -15,7 +15,7 @@ module HttpRequest
|
|
15
15
|
# Auto decompress content
|
16
16
|
content_encoding = @header['content-encoding'].to_s.downcase
|
17
17
|
if !content_encoding.empty? && content_encoding =~ /gzip/
|
18
|
-
gz = Zlib::GzipReader.new(StringIO.new(@body))
|
18
|
+
gz = Zlib::GzipReader.new(StringIO.new(@body), :external_encoding => @body.encoding)
|
19
19
|
@body = gz.read
|
20
20
|
end
|
21
21
|
|
@@ -24,13 +24,13 @@ module HttpRequest
|
|
24
24
|
charset = content_type.match(/charset=([a-z0-9-]*)/i).to_s
|
25
25
|
if !charset.empty?
|
26
26
|
# Encode to suggested charset
|
27
|
-
encoding = Encoding.find(charset.split('=')[1]) rescue
|
28
|
-
@body.force_encoding(encoding)
|
27
|
+
encoding = Encoding.find(charset.split('=')[1]) rescue nil
|
28
|
+
@body.force_encoding(encoding) if !encoding.nil?
|
29
29
|
else
|
30
30
|
# Encode to utf-8 by default for any ascii content types
|
31
31
|
# that don't specify the charset
|
32
|
-
mime_type = MIME::Types[content_type].first
|
33
|
-
@body.force_encoding('utf-8') if mime_type && mime_type.ascii?
|
32
|
+
# mime_type = MIME::Types[content_type].first
|
33
|
+
# @body.force_encoding('utf-8') if mime_type && mime_type.ascii?
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
data/lib/http-request/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: http-request
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-03-13 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: addressable
|
@@ -102,7 +102,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
102
102
|
version: '0'
|
103
103
|
segments:
|
104
104
|
- 0
|
105
|
-
hash:
|
105
|
+
hash: 4305832184891146306
|
106
106
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
107
107
|
none: false
|
108
108
|
requirements:
|
@@ -111,7 +111,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
111
111
|
version: 1.3.6
|
112
112
|
requirements: []
|
113
113
|
rubyforge_project:
|
114
|
-
rubygems_version: 1.8.
|
114
|
+
rubygems_version: 1.8.25
|
115
115
|
signing_key:
|
116
116
|
specification_version: 3
|
117
117
|
summary: Simple HTTP client built with Net/HTTP
|