ably-em-http-request 1.1.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. checksums.yaml +7 -0
  2. data/.gemtest +0 -0
  3. data/.github/workflows/ci.yml +22 -0
  4. data/.gitignore +9 -0
  5. data/.rspec +0 -0
  6. data/Changelog.md +78 -0
  7. data/Gemfile +14 -0
  8. data/LICENSE +21 -0
  9. data/README.md +66 -0
  10. data/Rakefile +10 -0
  11. data/ably-em-http-request.gemspec +33 -0
  12. data/benchmarks/clients.rb +170 -0
  13. data/benchmarks/em-excon.rb +87 -0
  14. data/benchmarks/em-profile.gif +0 -0
  15. data/benchmarks/em-profile.txt +65 -0
  16. data/benchmarks/server.rb +48 -0
  17. data/examples/.gitignore +1 -0
  18. data/examples/digest_auth/client.rb +25 -0
  19. data/examples/digest_auth/server.rb +28 -0
  20. data/examples/fetch.rb +30 -0
  21. data/examples/fibered-http.rb +51 -0
  22. data/examples/multi.rb +25 -0
  23. data/examples/oauth-tweet.rb +35 -0
  24. data/examples/socks5.rb +23 -0
  25. data/lib/em/io_streamer.rb +51 -0
  26. data/lib/em-http/client.rb +343 -0
  27. data/lib/em-http/core_ext/bytesize.rb +6 -0
  28. data/lib/em-http/decoders.rb +252 -0
  29. data/lib/em-http/http_client_options.rb +51 -0
  30. data/lib/em-http/http_connection.rb +408 -0
  31. data/lib/em-http/http_connection_options.rb +72 -0
  32. data/lib/em-http/http_encoding.rb +151 -0
  33. data/lib/em-http/http_header.rb +85 -0
  34. data/lib/em-http/http_status_codes.rb +59 -0
  35. data/lib/em-http/middleware/digest_auth.rb +114 -0
  36. data/lib/em-http/middleware/json_response.rb +17 -0
  37. data/lib/em-http/middleware/oauth.rb +42 -0
  38. data/lib/em-http/middleware/oauth2.rb +30 -0
  39. data/lib/em-http/multi.rb +59 -0
  40. data/lib/em-http/request.rb +25 -0
  41. data/lib/em-http/version.rb +7 -0
  42. data/lib/em-http-request.rb +1 -0
  43. data/lib/em-http.rb +20 -0
  44. data/spec/client_fiber_spec.rb +23 -0
  45. data/spec/client_spec.rb +1000 -0
  46. data/spec/digest_auth_spec.rb +48 -0
  47. data/spec/dns_spec.rb +41 -0
  48. data/spec/encoding_spec.rb +49 -0
  49. data/spec/external_spec.rb +146 -0
  50. data/spec/fixtures/google.ca +16 -0
  51. data/spec/fixtures/gzip-sample.gz +0 -0
  52. data/spec/gzip_spec.rb +91 -0
  53. data/spec/helper.rb +27 -0
  54. data/spec/http_proxy_spec.rb +268 -0
  55. data/spec/middleware/oauth2_spec.rb +15 -0
  56. data/spec/middleware_spec.rb +143 -0
  57. data/spec/multi_spec.rb +104 -0
  58. data/spec/pipelining_spec.rb +62 -0
  59. data/spec/redirect_spec.rb +430 -0
  60. data/spec/socksify_proxy_spec.rb +56 -0
  61. data/spec/spec_helper.rb +25 -0
  62. data/spec/ssl_spec.rb +67 -0
  63. data/spec/stallion.rb +334 -0
  64. data/spec/stub_server.rb +45 -0
  65. metadata +269 -0
data/spec/stallion.rb ADDED
@@ -0,0 +1,334 @@
1
+ # #--
2
+ # Includes portion originally Copyright (C)2008 Michael Fellinger
3
+ # MIT License
4
+ # #--
5
+
6
+ require 'rack'
7
+
8
+ module Stallion
9
+ class Mount
10
+ def initialize(name, *methods, &block)
11
+ @name, @methods, @block = name, methods, block
12
+ end
13
+
14
+ def ride
15
+ @block.call
16
+ end
17
+
18
+ def match?(request)
19
+ method = request['REQUEST_METHOD']
20
+ @methods.empty? or @methods.include?(method)
21
+ end
22
+ end
23
+
24
+ class Stable
25
+ attr_reader :request, :response
26
+
27
+ def initialize
28
+ @boxes = {}
29
+ end
30
+
31
+ def in(path, *methods, &block)
32
+ mount = Mount.new(path, *methods, &block)
33
+ @boxes[[path, methods]] = mount
34
+ mount
35
+ end
36
+
37
+ def call(request, response)
38
+ @request, @response = request, response
39
+ @boxes.each do |_, mount|
40
+ if mount.match?(request)
41
+ mount.ride
42
+ end
43
+ end
44
+ end
45
+ end
46
+
47
+ STABLES = {}
48
+
49
+ def self.saddle(name = nil)
50
+ STABLES[name] = stable = Stable.new
51
+ yield stable
52
+ end
53
+
54
+ def self.run(options = {})
55
+ options = {:Host => "127.0.0.1", :Port => 8090}.merge(options)
56
+
57
+ ruby_version = RUBY_VERSION.split('.').map(&:to_i)
58
+ if ruby_version[0] >= 3
59
+ Rack::Handler::Mongrel.run(Rack::Lint.new(self), **options)
60
+ else
61
+ Rack::Handler::Mongrel.run(Rack::Lint.new(self), options)
62
+ end
63
+ end
64
+
65
+ def self.call(env)
66
+ request = Rack::Request.new(env)
67
+ response = Rack::Response.new
68
+
69
+ STABLES.each do |name, stable|
70
+ stable.call(request, response)
71
+ end
72
+
73
+ response.finish
74
+ end
75
+ end
76
+
77
+ Stallion.saddle :spec do |stable|
78
+ stable.in '/' do
79
+
80
+ if stable.request.path_info == '/fail'
81
+ stable.response.status = 404
82
+
83
+ elsif stable.request.path_info == '/fail_with_nonstandard_response'
84
+ stable.response.status = 420
85
+
86
+ elsif stable.request.query_string == 'q=test'
87
+ stable.response.write 'test'
88
+
89
+ elsif stable.request.path_info == '/echo_query'
90
+ stable.response["ETag"] = "abcdefg"
91
+ stable.response["Last-Modified"] = "Fri, 13 Aug 2010 17:31:21 GMT"
92
+ stable.response.write stable.request.query_string
93
+
94
+ elsif stable.request.path_info == '/echo_headers'
95
+ stable.response["Set-Cookie"] = "test=yes"
96
+ stable.response["X-Forward-Host"] = "proxy.local"
97
+ stable.response.write stable.request.query_string
98
+
99
+ elsif stable.request.path_info == '/echo_content_length'
100
+ stable.response.write stable.request.content_length
101
+
102
+ elsif stable.request.path_info == '/echo_content_length_from_header'
103
+ stable.response.write "content-length:#{stable.request.env["CONTENT_LENGTH"]}"
104
+
105
+ elsif stable.request.path_info == '/echo_authorization_header'
106
+ stable.response.write "authorization:#{stable.request.env["HTTP_AUTHORIZATION"]}"
107
+
108
+ elsif stable.request.head? && stable.request.path_info == '/'
109
+ stable.response.status = 200
110
+
111
+ elsif stable.request.delete?
112
+ stable.response.status = 200
113
+
114
+ elsif stable.request.put?
115
+ stable.response.write stable.request.body.read
116
+
117
+ elsif stable.request.post? || stable.request.patch?
118
+ if stable.request.path_info == '/echo_content_type'
119
+ stable.response["Content-Type"] = stable.request.env["CONTENT_TYPE"] || 'text/html'
120
+ stable.response.write stable.request.env["CONTENT_TYPE"]
121
+ else
122
+ stable.response.write stable.request.body.read
123
+ end
124
+
125
+ elsif stable.request.path_info == '/set_cookie'
126
+ stable.response["Set-Cookie"] = "id=1; expires=Sat, 09 Aug 2031 17:53:39 GMT; path=/;"
127
+ stable.response.write "cookie set"
128
+
129
+ elsif stable.request.path_info == '/set_multiple_cookies'
130
+ stable.response["Set-Cookie"] = [
131
+ "id=1; expires=Sat, 09 Aug 2031 17:53:39 GMT; path=/;",
132
+ "id=2;"
133
+ ]
134
+ stable.response.write "cookies set"
135
+
136
+ elsif stable.request.path_info == '/echo_cookie'
137
+ stable.response.write stable.request.env["HTTP_COOKIE"]
138
+
139
+ elsif stable.request.path_info == '/timeout'
140
+ sleep(10)
141
+ stable.response.write 'timeout'
142
+
143
+ elsif stable.request.path_info == '/cookie_parrot'
144
+ stable.response.status = 200
145
+ stable.response["Set-Cookie"] = stable.request.env['HTTP_COOKIE']
146
+
147
+ elsif stable.request.path_info == '/redirect'
148
+ stable.response.status = 301
149
+ stable.response["Location"] = "/gzip"
150
+ stable.response.write 'redirect'
151
+
152
+ elsif stable.request.path_info == '/redirect/created'
153
+ stable.response.status = 201
154
+ stable.response["Location"] = "/"
155
+ stable.response.write 'Hello, World!'
156
+
157
+ elsif stable.request.path_info == '/redirect/multiple-with-cookie'
158
+ stable.response.status = 301
159
+ stable.response["Set-Cookie"] = "another_id=1; expires=Sat, 09 Aug 2031 17:53:39 GMT; path=/;"
160
+ stable.response["Location"] = "/redirect"
161
+ stable.response.write 'redirect'
162
+
163
+ elsif stable.request.path_info == '/redirect/bad'
164
+ stable.response.status = 301
165
+ stable.response["Location"] = "http://127.0.0.1:8090"
166
+
167
+ elsif stable.request.path_info == '/redirect/timeout'
168
+ stable.response.status = 301
169
+ stable.response["Location"] = "http://127.0.0.1:8090/timeout"
170
+
171
+ elsif stable.request.path_info == '/redirect/head'
172
+ stable.response.status = 301
173
+ stable.response["Location"] = "/"
174
+
175
+ elsif stable.request.path_info == '/redirect/middleware_redirects_1'
176
+ stable.response.status = 301
177
+ stable.response["EM-Middleware"] = stable.request.env["HTTP_EM_MIDDLEWARE"]
178
+ stable.response["Location"] = "/redirect/middleware_redirects_2"
179
+
180
+ elsif stable.request.path_info == '/redirect/middleware_redirects_2'
181
+ stable.response.status = 301
182
+ stable.response["EM-Middleware"] = stable.request.env["HTTP_EM_MIDDLEWARE"]
183
+ stable.response["Location"] = "/redirect/middleware_redirects_3"
184
+
185
+ elsif stable.request.path_info == '/redirect/middleware_redirects_3'
186
+ stable.response.status = 200
187
+ stable.response["EM-Middleware"] = stable.request.env["HTTP_EM_MIDDLEWARE"]
188
+
189
+ elsif stable.request.path_info == '/redirect/nohost'
190
+ stable.response.status = 301
191
+ stable.response["Location"] = "http:/"
192
+
193
+ elsif stable.request.path_info == '/redirect/badhost'
194
+ stable.response.status = 301
195
+ stable.response["Location"] = "http://$$$@$!%&^"
196
+
197
+ elsif stable.request.path_info == '/redirect/http_no_port'
198
+ stable.response.status = 301
199
+ stable.response["Location"] = "http://host/"
200
+
201
+ elsif stable.request.path_info == '/redirect/https_no_port'
202
+ stable.response.status = 301
203
+ stable.response["Location"] = "https://host/"
204
+
205
+ elsif stable.request.path_info == '/redirect/http_with_port'
206
+ stable.response.status = 301
207
+ stable.response["Location"] = "http://host:80/"
208
+
209
+ elsif stable.request.path_info == '/redirect/https_with_port'
210
+ stable.response.status = 301
211
+ stable.response["Location"] = "https://host:443/"
212
+
213
+ elsif stable.request.path_info == '/redirect/ignore_query_option'
214
+ stable.response.status = 301
215
+ stable.response['Location'] = '/redirect/url'
216
+
217
+ elsif stable.request.path_info == '/redirect/url'
218
+ stable.response.status = 200
219
+ stable.response.write stable.request.url
220
+
221
+ elsif stable.request.path_info == '/gzip'
222
+ io = StringIO.new
223
+ gzip = Zlib::GzipWriter.new(io)
224
+ gzip << "compressed"
225
+ gzip.close
226
+
227
+ stable.response.write io.string
228
+ stable.response["Content-Encoding"] = "gzip"
229
+
230
+ elsif stable.request.path_info == '/gzip-large'
231
+ contents = File.open(File.dirname(__FILE__) + "/fixtures/gzip-sample.gz", 'r') { |f| f.read }
232
+
233
+ stable.response.write contents
234
+ stable.response["Content-Encoding"] = "gzip"
235
+
236
+ elsif stable.request.path_info == '/deflate'
237
+ deflater = Zlib::Deflate.new(
238
+ Zlib::DEFAULT_COMPRESSION,
239
+ -Zlib::MAX_WBITS, # drop the zlib header which causes both Safari and IE to choke
240
+ Zlib::DEF_MEM_LEVEL,
241
+ Zlib::DEFAULT_STRATEGY
242
+ )
243
+ deflater.deflate("compressed")
244
+ stable.response.write deflater.finish
245
+ stable.response["Content-Encoding"] = "deflate"
246
+
247
+ elsif stable.request.path_info == '/echo_accept_encoding'
248
+ stable.response.status = 200
249
+ stable.response.write stable.request.env["HTTP_ACCEPT_ENCODING"]
250
+
251
+ elsif stable.request.env["HTTP_IF_NONE_MATCH"]
252
+ stable.response.status = 304
253
+
254
+ elsif stable.request.path_info == '/auth' && stable.request.env["HTTP_AUTHORIZATION"]
255
+ stable.response.status = 200
256
+ stable.response.write stable.request.env["HTTP_AUTHORIZATION"]
257
+ elsif stable.request.path_info == '/authtest'
258
+ auth = "Basic %s" % Base64.strict_encode64(['user', 'pass'].join(':')).split.join
259
+ if auth == stable.request.env["HTTP_AUTHORIZATION"]
260
+ stable.response.status = 200
261
+ stable.response.write 'success'
262
+ else
263
+ stable.response.status = 401
264
+ end
265
+ elsif stable.request.path_info == '/relative-location'
266
+ stable.response.status = 301
267
+ stable.response["Location"] = '/forwarded'
268
+ elsif stable.request.path_info == '/echo-user-agent'
269
+ stable.response.write stable.request.env["HTTP_USER_AGENT"].inspect
270
+
271
+ elsif
272
+ stable.response.write 'Hello, World!'
273
+ end
274
+
275
+ end
276
+ end
277
+
278
+ Thread.new do
279
+ begin
280
+ Stallion.run :Host => '127.0.0.1', :Port => 8090
281
+ rescue => e
282
+ print e
283
+ end
284
+ end
285
+
286
+ #
287
+ # Simple HTTP Proxy server
288
+ #
289
+ Thread.new do
290
+ server = TCPServer.new('127.0.0.1', 8083)
291
+ loop do
292
+ session = server.accept
293
+ request = ""
294
+ while (data = session.gets) != "\r\n"
295
+ request << data
296
+ end
297
+ parts = request.split("\r\n")
298
+ method, destination, http_version = parts.first.split(' ')
299
+ proxy = parts.find { |part| part =~ /Proxy-Authorization/ }
300
+ if destination =~ /^http:/
301
+ uri = Addressable::URI.parse(destination)
302
+ absolute_path = uri.path + (uri.query ? "?#{uri.query}" : "")
303
+ client = TCPSocket.open(uri.host, uri.port || 80)
304
+
305
+ client.write "#{method} #{absolute_path} #{http_version}\r\n"
306
+ parts[1..-1].each do |part|
307
+ client.write "#{part}\r\n"
308
+ end
309
+
310
+ client.write "\r\n"
311
+ client.flush
312
+ client.close_write
313
+
314
+ # Take the initial line from the upstream response
315
+ session.write client.gets
316
+
317
+ if proxy
318
+ session.write "X-Proxy-Auth: #{proxy}\r\n"
319
+ end
320
+
321
+ # What (absolute) uri was requested? Send it back in a header
322
+ session.write "X-The-Requested-URI: #{destination}\r\n"
323
+
324
+ while data = client.gets
325
+ session.write data
326
+ end
327
+ session.flush
328
+ client.close
329
+ end
330
+ session.close
331
+ end
332
+ end
333
+
334
+ sleep(1)
@@ -0,0 +1,45 @@
1
+ class StubServer
2
+ module Server
3
+ attr_accessor :keepalive
4
+
5
+ def receive_data(data)
6
+ if echo?
7
+ send_data("HTTP/1.0 200 OK\r\nContent-Length: #{data.bytesize}\r\nContent-Type: text/plain\r\n\r\n")
8
+ send_data(data)
9
+ else
10
+ send_data @response
11
+ end
12
+
13
+ close_connection_after_writing unless keepalive
14
+ end
15
+
16
+ def echo= flag
17
+ @echo = flag
18
+ end
19
+
20
+ def echo?
21
+ !!@echo
22
+ end
23
+
24
+ def response=(response)
25
+ @response = response
26
+ end
27
+ end
28
+
29
+ def initialize options = {}
30
+ options = {:response => options} if options.kind_of?(String)
31
+ options = {:port => 8081, :host => '127.0.0.1'}.merge(options)
32
+
33
+ host = options[:host]
34
+ port = options[:port]
35
+ @sig = EventMachine::start_server(host, port, Server) do |server|
36
+ server.response = options[:response]
37
+ server.echo = options[:echo]
38
+ server.keepalive = options[:keepalive]
39
+ end
40
+ end
41
+
42
+ def stop
43
+ EventMachine.stop_server @sig
44
+ end
45
+ end
metadata ADDED
@@ -0,0 +1,269 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ably-em-http-request
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.1.8
5
+ platform: ruby
6
+ authors:
7
+ - Ilya Grigorik
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2024-05-15 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: addressable
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 2.3.4
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 2.3.4
27
+ - !ruby/object:Gem::Dependency
28
+ name: cookiejar
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "!="
32
+ - !ruby/object:Gem::Version
33
+ version: 0.3.1
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "!="
39
+ - !ruby/object:Gem::Version
40
+ version: 0.3.1
41
+ - !ruby/object:Gem::Dependency
42
+ name: em-socksify
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0.3'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0.3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: eventmachine
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: 1.0.3
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: 1.0.3
69
+ - !ruby/object:Gem::Dependency
70
+ name: http_parser.rb
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: 0.6.0
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: 0.6.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: mongrel
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 1.2.0.pre2
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 1.2.0.pre2
97
+ - !ruby/object:Gem::Dependency
98
+ name: multi_json
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rack
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "<"
116
+ - !ruby/object:Gem::Version
117
+ version: '2.0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "<"
123
+ - !ruby/object:Gem::Version
124
+ version: '2.0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rake
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: rspec
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ description: EventMachine based, async HTTP Request client
154
+ email:
155
+ - lawrence.forooghian@ably.com
156
+ - lewis@lmars.net
157
+ - matt@ably.io
158
+ executables: []
159
+ extensions: []
160
+ extra_rdoc_files: []
161
+ files:
162
+ - ".gemtest"
163
+ - ".github/workflows/ci.yml"
164
+ - ".gitignore"
165
+ - ".rspec"
166
+ - Changelog.md
167
+ - Gemfile
168
+ - LICENSE
169
+ - README.md
170
+ - Rakefile
171
+ - ably-em-http-request.gemspec
172
+ - benchmarks/clients.rb
173
+ - benchmarks/em-excon.rb
174
+ - benchmarks/em-profile.gif
175
+ - benchmarks/em-profile.txt
176
+ - benchmarks/server.rb
177
+ - examples/.gitignore
178
+ - examples/digest_auth/client.rb
179
+ - examples/digest_auth/server.rb
180
+ - examples/fetch.rb
181
+ - examples/fibered-http.rb
182
+ - examples/multi.rb
183
+ - examples/oauth-tweet.rb
184
+ - examples/socks5.rb
185
+ - lib/em-http-request.rb
186
+ - lib/em-http.rb
187
+ - lib/em-http/client.rb
188
+ - lib/em-http/core_ext/bytesize.rb
189
+ - lib/em-http/decoders.rb
190
+ - lib/em-http/http_client_options.rb
191
+ - lib/em-http/http_connection.rb
192
+ - lib/em-http/http_connection_options.rb
193
+ - lib/em-http/http_encoding.rb
194
+ - lib/em-http/http_header.rb
195
+ - lib/em-http/http_status_codes.rb
196
+ - lib/em-http/middleware/digest_auth.rb
197
+ - lib/em-http/middleware/json_response.rb
198
+ - lib/em-http/middleware/oauth.rb
199
+ - lib/em-http/middleware/oauth2.rb
200
+ - lib/em-http/multi.rb
201
+ - lib/em-http/request.rb
202
+ - lib/em-http/version.rb
203
+ - lib/em/io_streamer.rb
204
+ - spec/client_fiber_spec.rb
205
+ - spec/client_spec.rb
206
+ - spec/digest_auth_spec.rb
207
+ - spec/dns_spec.rb
208
+ - spec/encoding_spec.rb
209
+ - spec/external_spec.rb
210
+ - spec/fixtures/google.ca
211
+ - spec/fixtures/gzip-sample.gz
212
+ - spec/gzip_spec.rb
213
+ - spec/helper.rb
214
+ - spec/http_proxy_spec.rb
215
+ - spec/middleware/oauth2_spec.rb
216
+ - spec/middleware_spec.rb
217
+ - spec/multi_spec.rb
218
+ - spec/pipelining_spec.rb
219
+ - spec/redirect_spec.rb
220
+ - spec/socksify_proxy_spec.rb
221
+ - spec/spec_helper.rb
222
+ - spec/ssl_spec.rb
223
+ - spec/stallion.rb
224
+ - spec/stub_server.rb
225
+ homepage: https://github.com/ably-forks/em-http-request
226
+ licenses:
227
+ - MIT
228
+ metadata: {}
229
+ post_install_message:
230
+ rdoc_options: []
231
+ require_paths:
232
+ - lib
233
+ required_ruby_version: !ruby/object:Gem::Requirement
234
+ requirements:
235
+ - - ">="
236
+ - !ruby/object:Gem::Version
237
+ version: '0'
238
+ required_rubygems_version: !ruby/object:Gem::Requirement
239
+ requirements:
240
+ - - ">="
241
+ - !ruby/object:Gem::Version
242
+ version: '0'
243
+ requirements: []
244
+ rubygems_version: 3.3.7
245
+ signing_key:
246
+ specification_version: 4
247
+ summary: EventMachine based, async HTTP Request client
248
+ test_files:
249
+ - spec/client_fiber_spec.rb
250
+ - spec/client_spec.rb
251
+ - spec/digest_auth_spec.rb
252
+ - spec/dns_spec.rb
253
+ - spec/encoding_spec.rb
254
+ - spec/external_spec.rb
255
+ - spec/fixtures/google.ca
256
+ - spec/fixtures/gzip-sample.gz
257
+ - spec/gzip_spec.rb
258
+ - spec/helper.rb
259
+ - spec/http_proxy_spec.rb
260
+ - spec/middleware/oauth2_spec.rb
261
+ - spec/middleware_spec.rb
262
+ - spec/multi_spec.rb
263
+ - spec/pipelining_spec.rb
264
+ - spec/redirect_spec.rb
265
+ - spec/socksify_proxy_spec.rb
266
+ - spec/spec_helper.rb
267
+ - spec/ssl_spec.rb
268
+ - spec/stallion.rb
269
+ - spec/stub_server.rb