em-http-request 1.1.3 → 1.1.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.
Potentially problematic release.
This version of em-http-request might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/.travis.yml +7 -0
- data/README.md +3 -4
- data/em-http-request.gemspec +1 -1
- data/lib/em-http/client.rb +6 -1
- data/lib/em-http/http_client_options.rb +2 -1
- data/lib/em-http/http_connection_options.rb +1 -0
- data/lib/em-http/http_encoding.rb +6 -1
- data/lib/em-http/version.rb +1 -1
- data/spec/client_spec.rb +31 -1
- data/spec/http_proxy_spec.rb +17 -0
- data/spec/pipelining_spec.rb +4 -4
- data/spec/stallion.rb +9 -2
- metadata +9 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a07874f78e22e8d5050980f2c9bc898bb95a0cf7
|
4
|
+
data.tar.gz: 11853fc0cee6e4f6ec2f5b1bf13d0ad156085861
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a2599aea8d7c5a25f98bb4795bdeaca42de935afac3fce0ae1b705a53ff8bb82cfbe6fc8c76af1c3dcd7f68719af45e76c97f94b58dabec2eb1523c108a5397b
|
7
|
+
data.tar.gz: 5d7c7cab7d3ef0e594400a8c56e60943899da1122263f376bc602dad2dec88037f08cadf26de006b464bd3082445e6d403ddb76c2fc3f9a70f2c62db4130119a
|
data/.travis.yml
ADDED
data/README.md
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
# EM-HTTP-Request
|
2
2
|
|
3
|
-
[](http://rubygems.org/gems/em-http-request)
|
4
|
-
[](https://github.com/igrigorik/ga-beacon)
|
3
|
+
[](http://rubygems.org/gems/em-http-request) [](https://travis-ci.org/igrigorik/em-http-request)
|
5
4
|
|
6
5
|
Async (EventMachine) HTTP client, with support for:
|
7
6
|
|
@@ -13,7 +12,7 @@ Async (EventMachine) HTTP client, with support for:
|
|
13
12
|
- Streaming file uploads
|
14
13
|
- HTTP proxy and SOCKS5 support
|
15
14
|
- Basic Auth & OAuth
|
16
|
-
- Connection-level &
|
15
|
+
- Connection-level & global middleware support
|
17
16
|
- HTTP parser via [http_parser.rb](https://github.com/tmm1/http_parser.rb)
|
18
17
|
- Works wherever EventMachine runs: Rubinius, JRuby, MRI
|
19
18
|
|
@@ -21,7 +20,7 @@ Async (EventMachine) HTTP client, with support for:
|
|
21
20
|
|
22
21
|
gem install em-http-request
|
23
22
|
|
24
|
-
- Introductory [screencast](http://everburning.com/news/eventmachine-screencast-em-http-request
|
23
|
+
- Introductory [screencast](http://everburning.com/news/eventmachine-screencast-em-http-request)
|
25
24
|
- [Issuing GET/POST/etc requests](https://github.com/igrigorik/em-http-request/wiki/Issuing-Requests)
|
26
25
|
- [Issuing parallel requests with Multi interface](https://github.com/igrigorik/em-http-request/wiki/Parallel-Requests)
|
27
26
|
- [Handling Redirects & Timeouts](https://github.com/igrigorik/em-http-request/wiki/Redirects-and-Timeouts)
|
data/em-http-request.gemspec
CHANGED
@@ -16,7 +16,7 @@ Gem::Specification.new do |s|
|
|
16
16
|
s.rubyforge_project = 'em-http-request'
|
17
17
|
|
18
18
|
s.add_dependency 'addressable', '>= 2.3.4'
|
19
|
-
s.add_dependency 'cookiejar', '
|
19
|
+
s.add_dependency 'cookiejar', '!= 0.3.1'
|
20
20
|
s.add_dependency 'em-socksify', '>= 0.3'
|
21
21
|
s.add_dependency 'eventmachine', '>= 1.0.3'
|
22
22
|
s.add_dependency 'http_parser.rb', '>= 0.6.0'
|
data/lib/em-http/client.rb
CHANGED
@@ -155,11 +155,16 @@ module EventMachine
|
|
155
155
|
|
156
156
|
# Set the User-Agent if it hasn't been specified
|
157
157
|
if !head.key?('user-agent')
|
158
|
-
head['user-agent'] =
|
158
|
+
head['user-agent'] = 'EventMachine HttpClient'
|
159
159
|
elsif head['user-agent'].nil?
|
160
160
|
head.delete('user-agent')
|
161
161
|
end
|
162
162
|
|
163
|
+
# Set the Accept-Encoding header if none is provided
|
164
|
+
if !head.key?('accept-encoding') && req.compressed
|
165
|
+
head['accept-encoding'] = 'gzip, compressed'
|
166
|
+
end
|
167
|
+
|
163
168
|
# Set the auth from the URI if given
|
164
169
|
head['Authorization'] = @req.uri.userinfo.split(/:/, 2) if @req.uri.userinfo
|
165
170
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
class HttpClientOptions
|
2
2
|
attr_reader :uri, :method, :host, :port
|
3
3
|
attr_reader :headers, :file, :body, :query, :path
|
4
|
-
attr_reader :keepalive, :pass_cookies, :decoding
|
4
|
+
attr_reader :keepalive, :pass_cookies, :decoding, :compressed
|
5
5
|
|
6
6
|
attr_accessor :followed, :redirects
|
7
7
|
|
@@ -18,6 +18,7 @@ class HttpClientOptions
|
|
18
18
|
|
19
19
|
@pass_cookies = options.fetch(:pass_cookies, true) # pass cookies between redirects
|
20
20
|
@decoding = options.fetch(:decoding, true) # auto-decode compressed response
|
21
|
+
@compressed = options.fetch(:compressed, true) # auto-negotiated compressed response
|
21
22
|
|
22
23
|
set_uri(uri, options[:path], options[:query])
|
23
24
|
end
|
@@ -20,6 +20,7 @@ class HttpConnectionOptions
|
|
20
20
|
uri = uri.kind_of?(Addressable::URI) ? uri : Addressable::URI::parse(uri.to_s)
|
21
21
|
@https = uri.scheme == "https"
|
22
22
|
uri.port ||= (@https ? 443 : 80)
|
23
|
+
@tls[:sni_hostname] = uri.host
|
23
24
|
|
24
25
|
if proxy = options[:proxy]
|
25
26
|
@host = proxy[:host]
|
@@ -53,7 +53,12 @@ module EventMachine
|
|
53
53
|
# uri in request header, as opposed to a relative path.
|
54
54
|
# Don't modify the header with CONNECT proxies. It's unneeded and will
|
55
55
|
# cause 400 Bad Request errors with many standard setups.
|
56
|
-
|
56
|
+
if connopts.proxy && !connopts.connect_proxy?
|
57
|
+
query = uri.join(query)
|
58
|
+
# Drop the userinfo, it's been converted to a header and won't be
|
59
|
+
# accepted by the proxy
|
60
|
+
query.userinfo = nil
|
61
|
+
end
|
57
62
|
|
58
63
|
HTTP_REQUEST_HEADER % [method.to_s.upcase, query]
|
59
64
|
end
|
data/lib/em-http/version.rb
CHANGED
data/spec/client_spec.rb
CHANGED
@@ -386,7 +386,7 @@ describe EventMachine::HttpRequest do
|
|
386
386
|
}
|
387
387
|
end
|
388
388
|
|
389
|
-
it "should detect gzip encoding" do
|
389
|
+
it "should auto-detect and decode gzip encoding" do
|
390
390
|
EventMachine.run {
|
391
391
|
|
392
392
|
http = EventMachine::HttpRequest.new('http://127.0.0.1:8090/gzip').get :head => {"accept-encoding" => "gzip, compressed"}
|
@@ -446,6 +446,36 @@ describe EventMachine::HttpRequest do
|
|
446
446
|
}
|
447
447
|
end
|
448
448
|
|
449
|
+
it "should default to requesting compressed response" do
|
450
|
+
EventMachine.run {
|
451
|
+
|
452
|
+
http = EventMachine::HttpRequest.new('http://127.0.0.1:8090/echo_accept_encoding').get
|
453
|
+
|
454
|
+
http.errback { failed(http) }
|
455
|
+
http.callback {
|
456
|
+
http.response_header.status.should == 200
|
457
|
+
http.response.should == "gzip, compressed"
|
458
|
+
|
459
|
+
EventMachine.stop
|
460
|
+
}
|
461
|
+
}
|
462
|
+
end
|
463
|
+
|
464
|
+
it "should default to requesting compressed response" do
|
465
|
+
EventMachine.run {
|
466
|
+
|
467
|
+
http = EventMachine::HttpRequest.new('http://127.0.0.1:8090/echo_accept_encoding').get :compressed => false
|
468
|
+
|
469
|
+
http.errback { failed(http) }
|
470
|
+
http.callback {
|
471
|
+
http.response_header.status.should == 200
|
472
|
+
http.response.should == ""
|
473
|
+
|
474
|
+
EventMachine.stop
|
475
|
+
}
|
476
|
+
}
|
477
|
+
end
|
478
|
+
|
449
479
|
it "should timeout after 0.1 seconds of inactivity" do
|
450
480
|
EventMachine.run {
|
451
481
|
t = Time.now.to_i
|
data/spec/http_proxy_spec.rb
CHANGED
@@ -52,6 +52,23 @@ describe EventMachine::HttpRequest do
|
|
52
52
|
}
|
53
53
|
end
|
54
54
|
|
55
|
+
it "should strip basic auth from before the host in URI sent to proxy" do
|
56
|
+
EventMachine.run {
|
57
|
+
|
58
|
+
http = EventMachine::HttpRequest.new('http://user:pass@127.0.0.1:8090/echo_authorization_header', proxy).get
|
59
|
+
|
60
|
+
http.errback { failed(http) }
|
61
|
+
http.callback {
|
62
|
+
http.response_header.status.should == 200
|
63
|
+
# The test proxy server gives the requested uri back in this header
|
64
|
+
http.response_header['X_THE_REQUESTED_URI'].should == 'http://127.0.0.1:8090/echo_authorization_header'
|
65
|
+
# Ensure the basic auth was converted to a header correctly
|
66
|
+
http.response.should match('authorization:Basic dXNlcjpwYXNz')
|
67
|
+
EventMachine.stop
|
68
|
+
}
|
69
|
+
}
|
70
|
+
end
|
71
|
+
|
55
72
|
it "should include query parameters specified in the options" do
|
56
73
|
EventMachine.run {
|
57
74
|
http = EventMachine::HttpRequest.new('http://127.0.0.1:8090/', proxy).get :query => { 'q' => 'test' }
|
data/spec/pipelining_spec.rb
CHANGED
@@ -8,10 +8,10 @@ requires_connection do
|
|
8
8
|
EventMachine.run do
|
9
9
|
|
10
10
|
# Mongrel doesn't support pipelined requests - bah!
|
11
|
-
conn = EventMachine::HttpRequest.new('http://www.
|
11
|
+
conn = EventMachine::HttpRequest.new('http://www.bing.com/')
|
12
12
|
|
13
13
|
pipe1 = conn.get :keepalive => true
|
14
|
-
pipe2 = conn.get :path => '/
|
14
|
+
pipe2 = conn.get :path => '/news', :keepalive => true
|
15
15
|
|
16
16
|
processed = 0
|
17
17
|
stop = proc { EM.stop if processed == 2}
|
@@ -36,10 +36,10 @@ requires_connection do
|
|
36
36
|
|
37
37
|
it "should perform successful pipelined HEAD requests" do
|
38
38
|
EventMachine.run do
|
39
|
-
conn = EventMachine::HttpRequest.new('http://www.
|
39
|
+
conn = EventMachine::HttpRequest.new('http://www.bing.com/')
|
40
40
|
|
41
41
|
pipe1 = conn.head :keepalive => true
|
42
|
-
pipe2 = conn.head :path => '/
|
42
|
+
pipe2 = conn.head :path => '/news', :keepalive => true
|
43
43
|
|
44
44
|
processed = 0
|
45
45
|
stop = proc { EM.stop if processed == 2}
|
data/spec/stallion.rb
CHANGED
@@ -17,7 +17,7 @@ module Stallion
|
|
17
17
|
|
18
18
|
def match?(request)
|
19
19
|
method = request['REQUEST_METHOD']
|
20
|
-
|
20
|
+
@methods.empty? or @methods.include?(method)
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
@@ -36,7 +36,7 @@ module Stallion
|
|
36
36
|
|
37
37
|
def call(request, response)
|
38
38
|
@request, @response = request, response
|
39
|
-
@boxes.each do |
|
39
|
+
@boxes.each do |_, mount|
|
40
40
|
if mount.match?(request)
|
41
41
|
mount.ride
|
42
42
|
end
|
@@ -96,6 +96,9 @@ Stallion.saddle :spec do |stable|
|
|
96
96
|
elsif stable.request.path_info == '/echo_content_length_from_header'
|
97
97
|
stable.response.write "content-length:#{stable.request.env["CONTENT_LENGTH"]}"
|
98
98
|
|
99
|
+
elsif stable.request.path_info == '/echo_authorization_header'
|
100
|
+
stable.response.write "authorization:#{stable.request.env["HTTP_AUTHORIZATION"]}"
|
101
|
+
|
99
102
|
elsif stable.request.head? && stable.request.path_info == '/'
|
100
103
|
stable.response.status = 200
|
101
104
|
|
@@ -235,6 +238,10 @@ Stallion.saddle :spec do |stable|
|
|
235
238
|
stable.response.write deflater.finish
|
236
239
|
stable.response["Content-Encoding"] = "deflate"
|
237
240
|
|
241
|
+
elsif stable.request.path_info == '/echo_accept_encoding'
|
242
|
+
stable.response.status = 200
|
243
|
+
stable.response.write stable.request.env["HTTP_ACCEPT_ENCODING"]
|
244
|
+
|
238
245
|
elsif stable.request.env["HTTP_IF_NONE_MATCH"]
|
239
246
|
stable.response.status = 304
|
240
247
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: em-http-request
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ilya Grigorik
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-06-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: addressable
|
@@ -28,16 +28,16 @@ dependencies:
|
|
28
28
|
name: cookiejar
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - "!="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.3.
|
33
|
+
version: 0.3.1
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - "!="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 0.3.
|
40
|
+
version: 0.3.1
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: em-socksify
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -160,6 +160,7 @@ files:
|
|
160
160
|
- ".gemtest"
|
161
161
|
- ".gitignore"
|
162
162
|
- ".rspec"
|
163
|
+
- ".travis.yml"
|
163
164
|
- Changelog.md
|
164
165
|
- Gemfile
|
165
166
|
- README.md
|
@@ -237,7 +238,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
237
238
|
version: '0'
|
238
239
|
requirements: []
|
239
240
|
rubyforge_project: em-http-request
|
240
|
-
rubygems_version: 2.
|
241
|
+
rubygems_version: 2.5.1
|
241
242
|
signing_key:
|
242
243
|
specification_version: 4
|
243
244
|
summary: EventMachine based, async HTTP Request client
|
@@ -263,3 +264,4 @@ test_files:
|
|
263
264
|
- spec/ssl_spec.rb
|
264
265
|
- spec/stallion.rb
|
265
266
|
- spec/stub_server.rb
|
267
|
+
has_rdoc:
|