httparty 0.15.6 → 0.21.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (95) hide show
  1. checksums.yaml +5 -5
  2. data/.editorconfig +18 -0
  3. data/.github/workflows/ci.yml +26 -0
  4. data/.gitignore +2 -0
  5. data/.rubocop_todo.yml +1 -1
  6. data/Changelog.md +105 -0
  7. data/Gemfile +7 -0
  8. data/Guardfile +3 -2
  9. data/README.md +6 -6
  10. data/docs/README.md +90 -5
  11. data/examples/README.md +28 -11
  12. data/examples/aaws.rb +6 -2
  13. data/examples/body_stream.rb +14 -0
  14. data/examples/custom_parsers.rb +4 -0
  15. data/examples/headers_and_user_agents.rb +7 -3
  16. data/examples/idn.rb +10 -0
  17. data/examples/logging.rb +3 -3
  18. data/examples/microsoft_graph.rb +52 -0
  19. data/examples/multipart.rb +22 -0
  20. data/examples/peer_cert.rb +9 -0
  21. data/examples/stream_download.rb +8 -2
  22. data/httparty.gemspec +3 -3
  23. data/lib/httparty/connection_adapter.rb +59 -16
  24. data/lib/httparty/cookie_hash.rb +10 -8
  25. data/lib/httparty/decompressor.rb +102 -0
  26. data/lib/httparty/exceptions.rb +3 -1
  27. data/lib/httparty/hash_conversions.rb +28 -12
  28. data/lib/httparty/headers_processor.rb +32 -0
  29. data/lib/httparty/logger/apache_formatter.rb +31 -6
  30. data/lib/httparty/logger/curl_formatter.rb +9 -7
  31. data/lib/httparty/logger/logger.rb +5 -1
  32. data/lib/httparty/logger/logstash_formatter.rb +61 -0
  33. data/lib/httparty/module_inheritable_attributes.rb +6 -4
  34. data/lib/httparty/net_digest_auth.rb +15 -15
  35. data/lib/httparty/parser.rb +21 -15
  36. data/lib/httparty/request/body.rb +105 -0
  37. data/lib/httparty/request/multipart_boundary.rb +13 -0
  38. data/lib/httparty/request.rb +86 -94
  39. data/lib/httparty/response/headers.rb +4 -2
  40. data/lib/httparty/response.rb +59 -8
  41. data/lib/httparty/response_fragment.rb +21 -0
  42. data/lib/httparty/text_encoder.rb +72 -0
  43. data/lib/httparty/utils.rb +13 -0
  44. data/lib/httparty/version.rb +3 -1
  45. data/lib/httparty.rb +70 -25
  46. data/website/css/common.css +1 -1
  47. metadata +37 -103
  48. data/.simplecov +0 -1
  49. data/.travis.yml +0 -9
  50. data/features/basic_authentication.feature +0 -20
  51. data/features/command_line.feature +0 -95
  52. data/features/deals_with_http_error_codes.feature +0 -26
  53. data/features/digest_authentication.feature +0 -30
  54. data/features/handles_compressed_responses.feature +0 -27
  55. data/features/handles_multiple_formats.feature +0 -57
  56. data/features/steps/env.rb +0 -27
  57. data/features/steps/httparty_response_steps.rb +0 -56
  58. data/features/steps/httparty_steps.rb +0 -43
  59. data/features/steps/mongrel_helper.rb +0 -127
  60. data/features/steps/remote_service_steps.rb +0 -92
  61. data/features/supports_read_timeout_option.feature +0 -13
  62. data/features/supports_redirection.feature +0 -22
  63. data/features/supports_timeout_option.feature +0 -13
  64. data/spec/fixtures/delicious.xml +0 -23
  65. data/spec/fixtures/empty.xml +0 -0
  66. data/spec/fixtures/google.html +0 -3
  67. data/spec/fixtures/ssl/generate.sh +0 -29
  68. data/spec/fixtures/ssl/generated/bogushost.crt +0 -13
  69. data/spec/fixtures/ssl/generated/ca.crt +0 -16
  70. data/spec/fixtures/ssl/generated/ca.key +0 -15
  71. data/spec/fixtures/ssl/generated/selfsigned.crt +0 -14
  72. data/spec/fixtures/ssl/generated/server.crt +0 -13
  73. data/spec/fixtures/ssl/generated/server.key +0 -15
  74. data/spec/fixtures/ssl/openssl-exts.cnf +0 -9
  75. data/spec/fixtures/twitter.csv +0 -2
  76. data/spec/fixtures/twitter.json +0 -1
  77. data/spec/fixtures/twitter.xml +0 -403
  78. data/spec/fixtures/undefined_method_add_node_for_nil.xml +0 -2
  79. data/spec/httparty/connection_adapter_spec.rb +0 -495
  80. data/spec/httparty/cookie_hash_spec.rb +0 -100
  81. data/spec/httparty/exception_spec.rb +0 -45
  82. data/spec/httparty/hash_conversions_spec.rb +0 -49
  83. data/spec/httparty/logger/apache_formatter_spec.rb +0 -41
  84. data/spec/httparty/logger/curl_formatter_spec.rb +0 -119
  85. data/spec/httparty/logger/logger_spec.rb +0 -38
  86. data/spec/httparty/net_digest_auth_spec.rb +0 -268
  87. data/spec/httparty/parser_spec.rb +0 -190
  88. data/spec/httparty/request_spec.rb +0 -1279
  89. data/spec/httparty/response_spec.rb +0 -347
  90. data/spec/httparty/ssl_spec.rb +0 -74
  91. data/spec/httparty_spec.rb +0 -878
  92. data/spec/spec_helper.rb +0 -51
  93. data/spec/support/ssl_test_helper.rb +0 -47
  94. data/spec/support/ssl_test_server.rb +0 -80
  95. 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