em-http-request-samesite 1.1.7
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.
- checksums.yaml +7 -0
- data/.gemtest +0 -0
- data/.gitignore +9 -0
- data/.rspec +0 -0
- data/.travis.yml +7 -0
- data/Changelog.md +68 -0
- data/Gemfile +14 -0
- data/README.md +63 -0
- data/Rakefile +10 -0
- data/benchmarks/clients.rb +170 -0
- data/benchmarks/em-excon.rb +87 -0
- data/benchmarks/em-profile.gif +0 -0
- data/benchmarks/em-profile.txt +65 -0
- data/benchmarks/server.rb +48 -0
- data/em-http-request.gemspec +32 -0
- data/examples/.gitignore +1 -0
- data/examples/digest_auth/client.rb +25 -0
- data/examples/digest_auth/server.rb +28 -0
- data/examples/fetch.rb +30 -0
- data/examples/fibered-http.rb +51 -0
- data/examples/multi.rb +25 -0
- data/examples/oauth-tweet.rb +35 -0
- data/examples/socks5.rb +23 -0
- data/lib/em-http-request.rb +1 -0
- data/lib/em-http.rb +20 -0
- data/lib/em-http/client.rb +341 -0
- data/lib/em-http/core_ext/bytesize.rb +6 -0
- data/lib/em-http/decoders.rb +252 -0
- data/lib/em-http/http_client_options.rb +49 -0
- data/lib/em-http/http_connection.rb +321 -0
- data/lib/em-http/http_connection_options.rb +70 -0
- data/lib/em-http/http_encoding.rb +149 -0
- data/lib/em-http/http_header.rb +83 -0
- data/lib/em-http/http_status_codes.rb +57 -0
- data/lib/em-http/middleware/digest_auth.rb +112 -0
- data/lib/em-http/middleware/json_response.rb +15 -0
- data/lib/em-http/middleware/oauth.rb +40 -0
- data/lib/em-http/middleware/oauth2.rb +28 -0
- data/lib/em-http/multi.rb +57 -0
- data/lib/em-http/request.rb +23 -0
- data/lib/em-http/version.rb +5 -0
- data/lib/em/io_streamer.rb +49 -0
- data/spec/client_fiber_spec.rb +23 -0
- data/spec/client_spec.rb +1000 -0
- data/spec/digest_auth_spec.rb +48 -0
- data/spec/dns_spec.rb +41 -0
- data/spec/encoding_spec.rb +49 -0
- data/spec/external_spec.rb +150 -0
- data/spec/fixtures/google.ca +16 -0
- data/spec/fixtures/gzip-sample.gz +0 -0
- data/spec/gzip_spec.rb +91 -0
- data/spec/helper.rb +31 -0
- data/spec/http_proxy_spec.rb +268 -0
- data/spec/middleware/oauth2_spec.rb +15 -0
- data/spec/middleware_spec.rb +143 -0
- data/spec/multi_spec.rb +104 -0
- data/spec/pipelining_spec.rb +66 -0
- data/spec/redirect_spec.rb +430 -0
- data/spec/socksify_proxy_spec.rb +60 -0
- data/spec/spec_helper.rb +25 -0
- data/spec/ssl_spec.rb +71 -0
- data/spec/stallion.rb +334 -0
- data/spec/stub_server.rb +45 -0
- metadata +265 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: ddbcf5e2f1360eefdcc8cf90714cfe34489ffddf4297927c0c76ff6a67a1e694
|
4
|
+
data.tar.gz: e88f7fafeb30fc592c5761ebfd86d3b013c67f2c687d512da92aa6a0a1c685f1
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 3f2cbcb2651168b9902d8eba77a11643122078272a0c8015456de617fba19df8b276586f05da5dbc1c8704ca5ba5c6dcc39200d3b090e46a34f2949e141fe02c
|
7
|
+
data.tar.gz: 0a7f55d51d12a74dd7817ff677fd32549161a46e4cfe32116a911aef344e0b55516e6d0943ba7853fc83a378c11b0a5ffe0dc4cb8ca4e6caf9cf491f0035f797
|
data/.gemtest
ADDED
File without changes
|
data/.gitignore
ADDED
data/.rspec
ADDED
File without changes
|
data/.travis.yml
ADDED
data/Changelog.md
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
# Changelog
|
2
|
+
|
3
|
+
## master
|
4
|
+
|
5
|
+
- User-Agent header is now removed if set to nil.
|
6
|
+
|
7
|
+
## 1.0.0.beta.1 / 2011-02-20 - The big rewrite
|
8
|
+
|
9
|
+
- Switched parser from Ragel to http_parser.rb
|
10
|
+
- Removed em_buffer C extension
|
11
|
+
- Added support for HTTP keepalive
|
12
|
+
- Added support for HTTP pipelining
|
13
|
+
- ~60% performance improvement across the board: less GC time!
|
14
|
+
- Refactored & split all tests
|
15
|
+
- Basic 100-Continue handling on POST/PUT
|
16
|
+
|
17
|
+
## 0.3.0 / 2011-01-15
|
18
|
+
|
19
|
+
- IMPORTANT: default to non-persistent connections (timeout => 0 now requires :keepalive => true)
|
20
|
+
- see: https://github.com/igrigorik/em-http-request/commit/1ca5b608e876c18fa6cfa318d0685dcf5b974e09
|
21
|
+
|
22
|
+
- added escape_utils dependency to fix slow encode on long string escapes
|
23
|
+
|
24
|
+
- bugfix: proxy authorization headers
|
25
|
+
- bugfix: default to Encoding.default_external on invalid encoding in response
|
26
|
+
- bugfix: do not normalize URI's internally
|
27
|
+
- bugfix: more robust Encoding detection
|
28
|
+
|
29
|
+
|
30
|
+
## 0.2.15 / 2010-11-18
|
31
|
+
|
32
|
+
- bugfix: follow redirects on missing content-length
|
33
|
+
- bugfix: fixed undefined warnings when running in strict mode
|
34
|
+
|
35
|
+
## 0.2.14 / 2010-10-06
|
36
|
+
|
37
|
+
- bugfix: form-encode keys/values of ruby objects passed in as body
|
38
|
+
|
39
|
+
## 0.2.13 / 2010-09-25
|
40
|
+
|
41
|
+
- added SOCKS5 proxy support
|
42
|
+
- bugfix: follow redirects on HEAD requests
|
43
|
+
|
44
|
+
## 0.2.12 / 2010-09-12
|
45
|
+
|
46
|
+
- added headers callback (http.headers {|h| p h})
|
47
|
+
- added .close method on client obj to terminate session (accepts message)
|
48
|
+
|
49
|
+
- bugfix: report 0 for response status on 1.9 on timeouts
|
50
|
+
- bugfix: handle bad Location host redirects
|
51
|
+
- bugfix: reset host override on connect
|
52
|
+
|
53
|
+
## 0.2.11 / 2010-08-16
|
54
|
+
|
55
|
+
- all URIs are now normalized prior to dispatch (and on redirect)
|
56
|
+
- default to direct proxy (instead of CONNECT handshake) - better performance
|
57
|
+
- specify :proxy => {:tunnel => true} if you need to force CONNECT route
|
58
|
+
- MultiRequest accepts block syntax for dispatching parallel requests (see specs)
|
59
|
+
- MockHttpRequest accepts block syntax (see Mock wiki page)
|
60
|
+
|
61
|
+
|
62
|
+
- bugfix: nullbyte frame for websockets
|
63
|
+
- bugfix: set @uri on DNS resolve failure
|
64
|
+
- bugfix: handle bad hosts in absolute redirects
|
65
|
+
- bugfix: reset seen content on redirects (doh!)
|
66
|
+
- bugfix: invalid multibyte escape in websocket regex (1.9.2+)
|
67
|
+
- bugfix: report etag and last_modified headers correctly
|
68
|
+
|
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
# EM-HTTP-Request
|
2
|
+
|
3
|
+
[](http://rubygems.org/gems/em-http-request) [](https://travis-ci.org/igrigorik/em-http-request)
|
4
|
+
|
5
|
+
Async (EventMachine) HTTP client, with support for:
|
6
|
+
|
7
|
+
- Asynchronous HTTP API for single & parallel request execution
|
8
|
+
- Keep-Alive and HTTP pipelining support
|
9
|
+
- Auto-follow 3xx redirects with max depth
|
10
|
+
- Automatic gzip & deflate decoding
|
11
|
+
- Streaming response processing
|
12
|
+
- Streaming file uploads
|
13
|
+
- HTTP proxy and SOCKS5 support
|
14
|
+
- Basic Auth & OAuth
|
15
|
+
- Connection-level & global middleware support
|
16
|
+
- HTTP parser via [http_parser.rb](https://github.com/tmm1/http_parser.rb)
|
17
|
+
- Works wherever EventMachine runs: Rubinius, JRuby, MRI
|
18
|
+
|
19
|
+
## Getting started
|
20
|
+
|
21
|
+
gem install em-http-request
|
22
|
+
|
23
|
+
- Introductory [screencast](http://everburning.com/news/eventmachine-screencast-em-http-request)
|
24
|
+
- [Issuing GET/POST/etc requests](https://github.com/igrigorik/em-http-request/wiki/Issuing-Requests)
|
25
|
+
- [Issuing parallel requests with Multi interface](https://github.com/igrigorik/em-http-request/wiki/Parallel-Requests)
|
26
|
+
- [Handling Redirects & Timeouts](https://github.com/igrigorik/em-http-request/wiki/Redirects-and-Timeouts)
|
27
|
+
- [Keep-Alive and HTTP Pipelining](https://github.com/igrigorik/em-http-request/wiki/Keep-Alive-and-HTTP-Pipelining)
|
28
|
+
- [Stream processing responses & uploads](https://github.com/igrigorik/em-http-request/wiki/Streaming)
|
29
|
+
- [Issuing requests through HTTP & SOCKS5 proxies](https://github.com/igrigorik/em-http-request/wiki/Proxy)
|
30
|
+
- [Basic Auth & OAuth](https://github.com/igrigorik/em-http-request/wiki/Basic-Auth-and-OAuth)
|
31
|
+
- [GZIP & Deflate decoding](https://github.com/igrigorik/em-http-request/wiki/Compression)
|
32
|
+
- [EM-HTTP Middleware](https://github.com/igrigorik/em-http-request/wiki/Middleware)
|
33
|
+
|
34
|
+
## Extensions
|
35
|
+
|
36
|
+
Several higher-order Ruby projects have incorporated em-http and other Ruby HTTP clients:
|
37
|
+
|
38
|
+
- [EM-Synchrony](https://github.com/igrigorik/em-synchrony) - Collection of convenience classes and primitives to help untangle evented code (Ruby 1.9 + Fibers).
|
39
|
+
- [Rack-Client](https://github.com/halorgium/rack-client) - Use Rack API for server, test, and client side. Supports Rack middleware!
|
40
|
+
- [Example in action](https://gist.github.com/802391)
|
41
|
+
- [Faraday](https://github.com/lostisland/faraday) - Modular HTTP client library using middleware heavily inspired by Rack.
|
42
|
+
- [Example in action](https://gist.github.com/802395)
|
43
|
+
|
44
|
+
## Testing
|
45
|
+
|
46
|
+
- [WebMock](https://github.com/bblimke/webmock) - Library for stubbing and setting expectations on HTTP requests in Ruby.
|
47
|
+
- Example of [using WebMock, VCR & EM-HTTP](https://gist.github.com/802553)
|
48
|
+
|
49
|
+
## Other libraries & applications using EM-HTTP
|
50
|
+
|
51
|
+
- [VMWare CloudFoundry](https://github.com/cloudfoundry) - The open platform-as-a-service project
|
52
|
+
- [PubSubHubbub](https://github.com/igrigorik/PubSubHubbub) - Asynchronous PubSubHubbub ruby client
|
53
|
+
- [em-net-http](https://github.com/jfairbairn/em-net-http) - Monkeypatching Net::HTTP to play ball with EventMachine
|
54
|
+
- [chirpstream](https://github.com/joshbuddy/chirpstream) - EM client for Twitters Chirpstream API
|
55
|
+
- [rsolr-async](https://github.com/mwmitchell/rsolr-async) - An asynchronus connection adapter for RSolr
|
56
|
+
- [Firering](https://github.com/EmmanuelOga/firering) - Eventmachine powered Campfire API
|
57
|
+
- [RDaneel](https://github.com/hasmanydevelopers/RDaneel) - Ruby crawler which respects robots.txt
|
58
|
+
- [em-eventsource](https://github.com/AF83/em-eventsource) - EventSource client for EventMachine
|
59
|
+
- and many others.. drop me a link if you want yours included!
|
60
|
+
|
61
|
+
### License
|
62
|
+
|
63
|
+
(MIT License) - Copyright (c) 2011 Ilya Grigorik
|
data/Rakefile
ADDED
@@ -0,0 +1,170 @@
|
|
1
|
+
$: << './benchmarks'
|
2
|
+
require 'server'
|
3
|
+
|
4
|
+
require 'excon'
|
5
|
+
require 'httparty'
|
6
|
+
require 'net/http'
|
7
|
+
require 'open-uri'
|
8
|
+
require 'rest_client'
|
9
|
+
require 'tach'
|
10
|
+
require 'typhoeus'
|
11
|
+
|
12
|
+
url = 'http://127.0.0.1:9292/data/10000'
|
13
|
+
|
14
|
+
with_server do
|
15
|
+
Tach.meter(100) do
|
16
|
+
|
17
|
+
tach('curb (persistent)') do |n|
|
18
|
+
curb = Curl::Easy.new
|
19
|
+
|
20
|
+
n.times do
|
21
|
+
curb.url = url
|
22
|
+
curb.http_get
|
23
|
+
curb.body_str
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
tach('em-http-request') do |n|
|
28
|
+
EventMachine.run {
|
29
|
+
count = 0
|
30
|
+
error = 0
|
31
|
+
|
32
|
+
n.times do
|
33
|
+
http = EventMachine::HttpRequest.new(url).get
|
34
|
+
|
35
|
+
http.callback {
|
36
|
+
count += 1
|
37
|
+
if count == n
|
38
|
+
p [count, error]
|
39
|
+
EM.stop
|
40
|
+
end
|
41
|
+
}
|
42
|
+
|
43
|
+
http.errback {
|
44
|
+
count += 1
|
45
|
+
error += 1
|
46
|
+
if count == n
|
47
|
+
p [count, error]
|
48
|
+
EM.stop
|
49
|
+
end
|
50
|
+
}
|
51
|
+
end
|
52
|
+
}
|
53
|
+
end
|
54
|
+
|
55
|
+
tach('em-http-request (persistent)') do |n|
|
56
|
+
EventMachine.run {
|
57
|
+
count = 0
|
58
|
+
error = 0
|
59
|
+
|
60
|
+
conn = EventMachine::HttpRequest.new(url)
|
61
|
+
|
62
|
+
n.times do
|
63
|
+
http = conn.get :keepalive => true
|
64
|
+
http.callback {
|
65
|
+
count += 1
|
66
|
+
if count == n
|
67
|
+
p [count, error]
|
68
|
+
EM.stop
|
69
|
+
end
|
70
|
+
}
|
71
|
+
|
72
|
+
http.errback {
|
73
|
+
count += 1
|
74
|
+
error += 1
|
75
|
+
if count == n
|
76
|
+
p [count, error]
|
77
|
+
EM.stop
|
78
|
+
end
|
79
|
+
}
|
80
|
+
end
|
81
|
+
}
|
82
|
+
end
|
83
|
+
|
84
|
+
tach('Excon') do
|
85
|
+
Excon.get(url).body
|
86
|
+
end
|
87
|
+
|
88
|
+
excon = Excon.new(url)
|
89
|
+
tach('Excon (persistent)') do
|
90
|
+
excon.request(:method => 'get').body
|
91
|
+
end
|
92
|
+
|
93
|
+
tach('HTTParty') do
|
94
|
+
HTTParty.get(url).body
|
95
|
+
end
|
96
|
+
|
97
|
+
uri = Addressable::URI.parse(url)
|
98
|
+
tach('Net::HTTP') do
|
99
|
+
Net::HTTP.start(uri.host, uri.port) {|http| http.get(uri.path).body }
|
100
|
+
end
|
101
|
+
|
102
|
+
uri = Addressable::URI.parse(url)
|
103
|
+
Net::HTTP.start(uri.host, uri.port) do |http|
|
104
|
+
tach('Net::HTTP (persistent)') do
|
105
|
+
http.get(uri.path).body
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
tach('open-uri') do
|
110
|
+
open(url).read
|
111
|
+
end
|
112
|
+
|
113
|
+
tach('RestClient') do
|
114
|
+
RestClient.get(url)
|
115
|
+
end
|
116
|
+
|
117
|
+
streamly = StreamlyFFI::Connection.new
|
118
|
+
tach('StreamlyFFI (persistent)') do
|
119
|
+
streamly.get(url)
|
120
|
+
end
|
121
|
+
|
122
|
+
tach('Typhoeus') do |n|
|
123
|
+
hydra = Typhoeus::Hydra.new( max_concurrency: 8 )
|
124
|
+
hydra.disable_memoization
|
125
|
+
count = 0
|
126
|
+
error = 0
|
127
|
+
n.times {
|
128
|
+
req = Typhoeus::Request.new( url )
|
129
|
+
req.on_complete do |res|
|
130
|
+
count += 1
|
131
|
+
error += 1 if !res.success?
|
132
|
+
p [count, error] if count == n
|
133
|
+
|
134
|
+
end
|
135
|
+
hydra.queue( req )
|
136
|
+
}
|
137
|
+
hydra.run
|
138
|
+
end
|
139
|
+
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
|
144
|
+
#+------------------------------+-----------+
|
145
|
+
#| tach | total |
|
146
|
+
#+------------------------------+-----------+
|
147
|
+
#| em-http-request (persistent) | 0.145512 |
|
148
|
+
#+------------------------------+-----------+
|
149
|
+
#| Excon | 0.181564 |
|
150
|
+
#+------------------------------+-----------+
|
151
|
+
#| RestClient | 0.253127 |
|
152
|
+
#+------------------------------+-----------+
|
153
|
+
#| Net::HTTP | 0.294412 |
|
154
|
+
#+------------------------------+-----------+
|
155
|
+
#| HTTParty | 0.305397 |
|
156
|
+
#+------------------------------+-----------+
|
157
|
+
#| open-uri | 0.307007 |
|
158
|
+
#+------------------------------+-----------+
|
159
|
+
#| Net::HTTP (persistent) | 0.313716 |
|
160
|
+
#+------------------------------+-----------+
|
161
|
+
#| Typhoeus | 0.514725 |
|
162
|
+
#+------------------------------+-----------+
|
163
|
+
#| curb (persistent) | 3.981700 |
|
164
|
+
#+------------------------------+-----------+
|
165
|
+
#| StreamlyFFI (persistent) | 3.989063 |
|
166
|
+
#+------------------------------+-----------+
|
167
|
+
#| Excon (persistent) | 4.018761 |
|
168
|
+
#+------------------------------+-----------+
|
169
|
+
#| em-http-request | 15.025291 |
|
170
|
+
#+------------------------------+-----------+
|
@@ -0,0 +1,87 @@
|
|
1
|
+
$: << './benchmarks'
|
2
|
+
require 'server'
|
3
|
+
|
4
|
+
url = 'http://127.0.0.1/10k.html'
|
5
|
+
|
6
|
+
with_server do
|
7
|
+
Tach.meter(100) do
|
8
|
+
|
9
|
+
excon = Excon.new(url)
|
10
|
+
tach('Excon (persistent)') do
|
11
|
+
excon.request(:method => 'get').body
|
12
|
+
end
|
13
|
+
|
14
|
+
tach('Excon') do
|
15
|
+
Excon.get(url).body
|
16
|
+
end
|
17
|
+
|
18
|
+
tach('em-http-request') do |n|
|
19
|
+
EventMachine.run {
|
20
|
+
count = 0
|
21
|
+
error = 0
|
22
|
+
n.times do
|
23
|
+
EM.next_tick do
|
24
|
+
http = EventMachine::HttpRequest.new(url, :connect_timeout => 1).get
|
25
|
+
|
26
|
+
http.callback {
|
27
|
+
count += 1
|
28
|
+
if count == n
|
29
|
+
p [count, error]
|
30
|
+
EM.stop
|
31
|
+
end
|
32
|
+
}
|
33
|
+
|
34
|
+
http.errback {
|
35
|
+
count += 1
|
36
|
+
error += 1
|
37
|
+
if count == n
|
38
|
+
p [count, error]
|
39
|
+
EM.stop
|
40
|
+
end
|
41
|
+
}
|
42
|
+
end
|
43
|
+
end
|
44
|
+
}
|
45
|
+
end
|
46
|
+
|
47
|
+
tach('em-http-request (persistent)') do |n|
|
48
|
+
EventMachine.run {
|
49
|
+
count = 0
|
50
|
+
error = 0
|
51
|
+
conn = EventMachine::HttpRequest.new(url)
|
52
|
+
|
53
|
+
n.times do
|
54
|
+
http = conn.get :keepalive => true
|
55
|
+
http.callback {
|
56
|
+
count += 1
|
57
|
+
if count == n
|
58
|
+
p [count, error]
|
59
|
+
EM.stop
|
60
|
+
end
|
61
|
+
}
|
62
|
+
|
63
|
+
http.errback {
|
64
|
+
count += 1
|
65
|
+
error += 1
|
66
|
+
if count == n
|
67
|
+
p [count, error]
|
68
|
+
EM.stop
|
69
|
+
end
|
70
|
+
}
|
71
|
+
end
|
72
|
+
}
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
# +------------------------------+----------+
|
78
|
+
# | tach | total |
|
79
|
+
# +------------------------------+----------+
|
80
|
+
# | em-http-request (persistent) | 0.018133 |
|
81
|
+
# +------------------------------+----------+
|
82
|
+
# | Excon (persistent) | 0.023975 |
|
83
|
+
# +------------------------------+----------+
|
84
|
+
# | Excon | 0.032877 |
|
85
|
+
# +------------------------------+----------+
|
86
|
+
# | em-http-request | 0.042891 |
|
87
|
+
# +------------------------------+----------+
|