httparty 0.16.2 → 0.22.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.editorconfig +18 -0
- data/.github/dependabot.yml +6 -0
- data/.github/workflows/ci.yml +23 -0
- data/.gitignore +2 -0
- data/.rubocop_todo.yml +1 -1
- data/Changelog.md +425 -280
- data/Gemfile +7 -0
- data/Guardfile +3 -2
- data/README.md +5 -5
- data/docs/README.md +90 -5
- data/examples/README.md +28 -11
- data/examples/aaws.rb +6 -2
- data/examples/body_stream.rb +14 -0
- data/examples/idn.rb +10 -0
- data/examples/microsoft_graph.rb +52 -0
- data/examples/multipart.rb +22 -0
- data/examples/peer_cert.rb +9 -0
- data/examples/stream_download.rb +8 -2
- data/httparty.gemspec +4 -3
- data/lib/httparty/connection_adapter.rb +44 -20
- data/lib/httparty/cookie_hash.rb +10 -8
- data/lib/httparty/decompressor.rb +102 -0
- data/lib/httparty/exceptions.rb +3 -1
- data/lib/httparty/hash_conversions.rb +10 -4
- data/lib/httparty/headers_processor.rb +32 -0
- data/lib/httparty/logger/apache_formatter.rb +31 -6
- data/lib/httparty/logger/curl_formatter.rb +9 -7
- data/lib/httparty/logger/logger.rb +5 -1
- data/lib/httparty/logger/logstash_formatter.rb +62 -0
- data/lib/httparty/module_inheritable_attributes.rb +9 -9
- data/lib/httparty/net_digest_auth.rb +15 -15
- data/lib/httparty/parser.rb +12 -5
- data/lib/httparty/request/body.rb +54 -27
- data/lib/httparty/request/multipart_boundary.rb +2 -0
- data/lib/httparty/request.rb +105 -107
- data/lib/httparty/response/headers.rb +4 -2
- data/lib/httparty/response.rb +52 -9
- data/lib/httparty/response_fragment.rb +21 -0
- data/lib/httparty/text_encoder.rb +72 -0
- data/lib/httparty/utils.rb +13 -0
- data/lib/httparty/version.rb +3 -1
- data/lib/httparty.rb +81 -33
- data/script/release +4 -4
- data/website/css/common.css +1 -1
- metadata +50 -107
- data/.simplecov +0 -1
- data/.travis.yml +0 -10
- data/features/basic_authentication.feature +0 -20
- data/features/command_line.feature +0 -95
- data/features/deals_with_http_error_codes.feature +0 -26
- data/features/digest_authentication.feature +0 -30
- data/features/handles_compressed_responses.feature +0 -27
- data/features/handles_multiple_formats.feature +0 -57
- data/features/steps/env.rb +0 -27
- data/features/steps/httparty_response_steps.rb +0 -56
- data/features/steps/httparty_steps.rb +0 -43
- data/features/steps/mongrel_helper.rb +0 -127
- data/features/steps/remote_service_steps.rb +0 -92
- data/features/supports_read_timeout_option.feature +0 -13
- data/features/supports_redirection.feature +0 -22
- data/features/supports_timeout_option.feature +0 -13
- data/spec/fixtures/delicious.xml +0 -23
- data/spec/fixtures/empty.xml +0 -0
- data/spec/fixtures/google.html +0 -3
- data/spec/fixtures/ssl/generate.sh +0 -29
- data/spec/fixtures/ssl/generated/bogushost.crt +0 -13
- data/spec/fixtures/ssl/generated/ca.crt +0 -16
- data/spec/fixtures/ssl/generated/ca.key +0 -15
- data/spec/fixtures/ssl/generated/selfsigned.crt +0 -14
- data/spec/fixtures/ssl/generated/server.crt +0 -13
- data/spec/fixtures/ssl/generated/server.key +0 -15
- data/spec/fixtures/ssl/openssl-exts.cnf +0 -9
- data/spec/fixtures/tiny.gif +0 -0
- data/spec/fixtures/twitter.csv +0 -2
- data/spec/fixtures/twitter.json +0 -1
- data/spec/fixtures/twitter.xml +0 -403
- data/spec/fixtures/undefined_method_add_node_for_nil.xml +0 -2
- data/spec/httparty/connection_adapter_spec.rb +0 -498
- data/spec/httparty/cookie_hash_spec.rb +0 -100
- data/spec/httparty/exception_spec.rb +0 -45
- data/spec/httparty/hash_conversions_spec.rb +0 -56
- data/spec/httparty/logger/apache_formatter_spec.rb +0 -41
- data/spec/httparty/logger/curl_formatter_spec.rb +0 -119
- data/spec/httparty/logger/logger_spec.rb +0 -38
- data/spec/httparty/net_digest_auth_spec.rb +0 -270
- data/spec/httparty/parser_spec.rb +0 -190
- data/spec/httparty/request/body_spec.rb +0 -60
- data/spec/httparty/request_spec.rb +0 -1312
- data/spec/httparty/response_spec.rb +0 -347
- data/spec/httparty/ssl_spec.rb +0 -74
- data/spec/httparty_spec.rb +0 -896
- data/spec/spec_helper.rb +0 -51
- data/spec/support/ssl_test_helper.rb +0 -47
- data/spec/support/ssl_test_server.rb +0 -80
- data/spec/support/stub_response.rb +0 -49
data/spec/spec_helper.rb
DELETED
@@ -1,51 +0,0 @@
|
|
1
|
-
require "simplecov"
|
2
|
-
SimpleCov.start
|
3
|
-
|
4
|
-
require "httparty"
|
5
|
-
require 'webmock/rspec'
|
6
|
-
|
7
|
-
def file_fixture(filename)
|
8
|
-
open(File.join(File.dirname(__FILE__), 'fixtures', "#{filename}")).read
|
9
|
-
end
|
10
|
-
|
11
|
-
Dir[File.expand_path(File.join(File.dirname(__FILE__), 'support', '**', '*.rb'))].each {|f| require f}
|
12
|
-
|
13
|
-
RSpec.configure do |config|
|
14
|
-
config.include HTTParty::StubResponse
|
15
|
-
config.include HTTParty::SSLTestHelper
|
16
|
-
|
17
|
-
config.expect_with :rspec do |expectations|
|
18
|
-
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
|
19
|
-
end
|
20
|
-
|
21
|
-
config.mock_with :rspec do |mocks|
|
22
|
-
mocks.verify_partial_doubles = false
|
23
|
-
end
|
24
|
-
|
25
|
-
config.filter_run :focus
|
26
|
-
config.run_all_when_everything_filtered = true
|
27
|
-
|
28
|
-
config.disable_monkey_patching!
|
29
|
-
|
30
|
-
config.warnings = true
|
31
|
-
|
32
|
-
if config.files_to_run.one?
|
33
|
-
config.default_formatter = 'doc'
|
34
|
-
end
|
35
|
-
|
36
|
-
config.profile_examples = 10
|
37
|
-
|
38
|
-
config.order = :random
|
39
|
-
|
40
|
-
Kernel.srand config.seed
|
41
|
-
end
|
42
|
-
|
43
|
-
RSpec::Matchers.define :use_ssl do
|
44
|
-
match(&:use_ssl?)
|
45
|
-
end
|
46
|
-
|
47
|
-
RSpec::Matchers.define :use_cert_store do |cert_store|
|
48
|
-
match do |connection|
|
49
|
-
connection.cert_store == cert_store
|
50
|
-
end
|
51
|
-
end
|
@@ -1,47 +0,0 @@
|
|
1
|
-
require 'pathname'
|
2
|
-
|
3
|
-
module HTTParty
|
4
|
-
module SSLTestHelper
|
5
|
-
def ssl_verify_test(mode, ca_basename, server_cert_filename, options = {})
|
6
|
-
options = {
|
7
|
-
format: :json,
|
8
|
-
timeout: 30
|
9
|
-
}.merge(options)
|
10
|
-
|
11
|
-
if mode
|
12
|
-
ca_path = File.expand_path("../../fixtures/ssl/generated/#{ca_basename}", __FILE__)
|
13
|
-
raise ArgumentError.new("#{ca_path} does not exist") unless File.exist?(ca_path)
|
14
|
-
options[mode] = ca_path
|
15
|
-
end
|
16
|
-
|
17
|
-
begin
|
18
|
-
test_server = SSLTestServer.new(
|
19
|
-
rsa_key: File.read(File.expand_path("../../fixtures/ssl/generated/server.key", __FILE__)),
|
20
|
-
cert: File.read(File.expand_path("../../fixtures/ssl/generated/#{server_cert_filename}", __FILE__)))
|
21
|
-
|
22
|
-
test_server.start
|
23
|
-
|
24
|
-
if mode
|
25
|
-
ca_path = File.expand_path("../../fixtures/ssl/generated/#{ca_basename}", __FILE__)
|
26
|
-
raise ArgumentError.new("#{ca_path} does not exist") unless File.exist?(ca_path)
|
27
|
-
return HTTParty.get("https://localhost:#{test_server.port}/", options)
|
28
|
-
else
|
29
|
-
return HTTParty.get("https://localhost:#{test_server.port}/", options)
|
30
|
-
end
|
31
|
-
ensure
|
32
|
-
test_server.stop if test_server
|
33
|
-
end
|
34
|
-
|
35
|
-
test_server = SSLTestServer.new({
|
36
|
-
rsa_key: path.join('server.key').read,
|
37
|
-
cert: path.join(server_cert_filename).read
|
38
|
-
})
|
39
|
-
|
40
|
-
test_server.start
|
41
|
-
|
42
|
-
HTTParty.get("https://localhost:#{test_server.port}/", options)
|
43
|
-
ensure
|
44
|
-
test_server.stop if test_server
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
@@ -1,80 +0,0 @@
|
|
1
|
-
require 'openssl'
|
2
|
-
require 'socket'
|
3
|
-
require 'thread'
|
4
|
-
|
5
|
-
# NOTE: This code is garbage. It probably has deadlocks, it might leak
|
6
|
-
# threads, and otherwise cause problems in a real system. It's really only
|
7
|
-
# intended for testing HTTParty.
|
8
|
-
class SSLTestServer
|
9
|
-
attr_accessor :ctx # SSLContext object
|
10
|
-
attr_reader :port
|
11
|
-
|
12
|
-
def initialize(options = {})
|
13
|
-
@ctx = OpenSSL::SSL::SSLContext.new
|
14
|
-
@ctx.cert = OpenSSL::X509::Certificate.new(options[:cert])
|
15
|
-
@ctx.key = OpenSSL::PKey::RSA.new(options[:rsa_key])
|
16
|
-
@ctx.verify_mode = OpenSSL::SSL::VERIFY_NONE # Don't verify client certificate
|
17
|
-
@port = options[:port] || 0
|
18
|
-
@thread = nil
|
19
|
-
@stopping_mutex = Mutex.new
|
20
|
-
@stopping = false
|
21
|
-
end
|
22
|
-
|
23
|
-
def start
|
24
|
-
@raw_server = TCPServer.new(@port)
|
25
|
-
|
26
|
-
if @port == 0
|
27
|
-
@port = Socket.getnameinfo(@raw_server.getsockname, Socket::NI_NUMERICHOST | Socket::NI_NUMERICSERV)[1].to_i
|
28
|
-
end
|
29
|
-
|
30
|
-
@ssl_server = OpenSSL::SSL::SSLServer.new(@raw_server, @ctx)
|
31
|
-
|
32
|
-
@stopping_mutex.synchronize {
|
33
|
-
return if @stopping
|
34
|
-
@thread = Thread.new { thread_main }
|
35
|
-
}
|
36
|
-
|
37
|
-
nil
|
38
|
-
end
|
39
|
-
|
40
|
-
def stop
|
41
|
-
@stopping_mutex.synchronize {
|
42
|
-
return if @stopping
|
43
|
-
@stopping = true
|
44
|
-
}
|
45
|
-
@thread.join
|
46
|
-
end
|
47
|
-
|
48
|
-
private
|
49
|
-
|
50
|
-
def thread_main
|
51
|
-
until @stopping_mutex.synchronize { @stopping }
|
52
|
-
(rr, _, _) = select([@ssl_server.to_io], nil, nil, 0.1)
|
53
|
-
|
54
|
-
next unless rr && rr.include?(@ssl_server.to_io)
|
55
|
-
|
56
|
-
socket = @ssl_server.accept
|
57
|
-
|
58
|
-
Thread.new {
|
59
|
-
header = []
|
60
|
-
|
61
|
-
until (line = socket.readline).rstrip.empty?
|
62
|
-
header << line
|
63
|
-
end
|
64
|
-
|
65
|
-
response = <<EOF
|
66
|
-
HTTP/1.1 200 OK
|
67
|
-
Connection: close
|
68
|
-
Content-Type: application/json; charset=UTF-8
|
69
|
-
|
70
|
-
{"success":true}
|
71
|
-
EOF
|
72
|
-
|
73
|
-
socket.write(response.gsub(/\r\n/n, "\n").gsub(/\n/n, "\r\n"))
|
74
|
-
socket.close
|
75
|
-
}
|
76
|
-
end
|
77
|
-
|
78
|
-
@ssl_server.close
|
79
|
-
end
|
80
|
-
end
|
@@ -1,49 +0,0 @@
|
|
1
|
-
module HTTParty
|
2
|
-
module StubResponse
|
3
|
-
def stub_http_response_with(filename)
|
4
|
-
format = filename.split('.').last.intern
|
5
|
-
data = file_fixture(filename)
|
6
|
-
|
7
|
-
response = Net::HTTPOK.new("1.1", 200, "Content for you")
|
8
|
-
allow(response).to receive(:body).and_return(data)
|
9
|
-
|
10
|
-
http_request = HTTParty::Request.new(Net::HTTP::Get, 'http://localhost', format: format)
|
11
|
-
allow(http_request).to receive_message_chain(:http, :request).and_return(response)
|
12
|
-
|
13
|
-
expect(HTTParty::Request).to receive(:new).and_return(http_request)
|
14
|
-
end
|
15
|
-
|
16
|
-
def stub_chunked_http_response_with(chunks, options = {format: "html"})
|
17
|
-
response = Net::HTTPResponse.new("1.1", 200, nil)
|
18
|
-
allow(response).to receive(:chunked_data).and_return(chunks)
|
19
|
-
def response.read_body(&block)
|
20
|
-
@body || chunked_data.each(&block)
|
21
|
-
end
|
22
|
-
|
23
|
-
http_request = HTTParty::Request.new(Net::HTTP::Get, 'http://localhost', options)
|
24
|
-
allow(http_request).to receive_message_chain(:http, :request).and_yield(response).and_return(response)
|
25
|
-
|
26
|
-
expect(HTTParty::Request).to receive(:new).and_return(http_request)
|
27
|
-
end
|
28
|
-
|
29
|
-
def stub_response(body, code = '200')
|
30
|
-
code = code.to_s
|
31
|
-
@request.options[:base_uri] ||= 'http://localhost'
|
32
|
-
unless defined?(@http) && @http
|
33
|
-
@http = Net::HTTP.new('localhost', 80)
|
34
|
-
allow(@request).to receive(:http).and_return(@http)
|
35
|
-
end
|
36
|
-
|
37
|
-
# CODE_TO_OBJ currently missing 308
|
38
|
-
if code == '308'
|
39
|
-
response = Net::HTTPRedirection.new("1.1", code, body)
|
40
|
-
else
|
41
|
-
response = Net::HTTPResponse::CODE_TO_OBJ[code].new("1.1", code, body)
|
42
|
-
end
|
43
|
-
allow(response).to receive(:body).and_return(body)
|
44
|
-
|
45
|
-
allow(@http).to receive(:request).and_return(response)
|
46
|
-
response
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|