httparty 0.13.7 → 0.21.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (103) hide show
  1. checksums.yaml +5 -5
  2. data/.editorconfig +18 -0
  3. data/.github/workflows/ci.yml +26 -0
  4. data/.gitignore +3 -0
  5. data/.rubocop_todo.yml +1 -1
  6. data/{History → Changelog.md} +226 -59
  7. data/Gemfile +10 -3
  8. data/Guardfile +3 -2
  9. data/README.md +8 -7
  10. data/bin/httparty +3 -1
  11. data/docs/README.md +191 -0
  12. data/examples/README.md +34 -12
  13. data/examples/aaws.rb +7 -3
  14. data/examples/body_stream.rb +14 -0
  15. data/examples/crack.rb +1 -1
  16. data/examples/custom_parsers.rb +5 -1
  17. data/examples/delicious.rb +4 -4
  18. data/examples/headers_and_user_agents.rb +7 -3
  19. data/examples/idn.rb +10 -0
  20. data/examples/logging.rb +4 -4
  21. data/examples/microsoft_graph.rb +52 -0
  22. data/examples/multipart.rb +22 -0
  23. data/examples/peer_cert.rb +9 -0
  24. data/examples/stackexchange.rb +1 -1
  25. data/examples/stream_download.rb +26 -0
  26. data/examples/tripit_sign_in.rb +17 -6
  27. data/examples/twitter.rb +2 -2
  28. data/examples/whoismyrep.rb +1 -1
  29. data/httparty.gemspec +7 -5
  30. data/lib/httparty/connection_adapter.rb +86 -20
  31. data/lib/httparty/cookie_hash.rb +10 -8
  32. data/lib/httparty/decompressor.rb +102 -0
  33. data/lib/httparty/exceptions.rb +8 -2
  34. data/lib/httparty/hash_conversions.rb +30 -8
  35. data/lib/httparty/headers_processor.rb +32 -0
  36. data/lib/httparty/logger/apache_formatter.rb +31 -6
  37. data/lib/httparty/logger/curl_formatter.rb +68 -23
  38. data/lib/httparty/logger/logger.rb +5 -1
  39. data/lib/httparty/logger/logstash_formatter.rb +61 -0
  40. data/lib/httparty/module_inheritable_attributes.rb +6 -4
  41. data/lib/httparty/net_digest_auth.rb +23 -21
  42. data/lib/httparty/parser.rb +25 -14
  43. data/lib/httparty/request/body.rb +105 -0
  44. data/lib/httparty/request/multipart_boundary.rb +13 -0
  45. data/lib/httparty/request.rb +160 -106
  46. data/lib/httparty/response/headers.rb +23 -19
  47. data/lib/httparty/response.rb +92 -13
  48. data/lib/httparty/response_fragment.rb +21 -0
  49. data/lib/httparty/text_encoder.rb +72 -0
  50. data/lib/httparty/utils.rb +13 -0
  51. data/lib/httparty/version.rb +3 -1
  52. data/lib/httparty.rb +98 -35
  53. data/website/css/common.css +1 -1
  54. metadata +34 -114
  55. data/.simplecov +0 -1
  56. data/.travis.yml +0 -7
  57. data/features/basic_authentication.feature +0 -20
  58. data/features/command_line.feature +0 -95
  59. data/features/deals_with_http_error_codes.feature +0 -26
  60. data/features/digest_authentication.feature +0 -30
  61. data/features/handles_compressed_responses.feature +0 -27
  62. data/features/handles_multiple_formats.feature +0 -57
  63. data/features/steps/env.rb +0 -27
  64. data/features/steps/httparty_response_steps.rb +0 -52
  65. data/features/steps/httparty_steps.rb +0 -43
  66. data/features/steps/mongrel_helper.rb +0 -127
  67. data/features/steps/remote_service_steps.rb +0 -90
  68. data/features/supports_read_timeout_option.feature +0 -13
  69. data/features/supports_redirection.feature +0 -22
  70. data/features/supports_timeout_option.feature +0 -13
  71. data/spec/fixtures/delicious.xml +0 -23
  72. data/spec/fixtures/empty.xml +0 -0
  73. data/spec/fixtures/google.html +0 -3
  74. data/spec/fixtures/ssl/generate.sh +0 -29
  75. data/spec/fixtures/ssl/generated/1fe462c2.0 +0 -16
  76. data/spec/fixtures/ssl/generated/bogushost.crt +0 -13
  77. data/spec/fixtures/ssl/generated/ca.crt +0 -16
  78. data/spec/fixtures/ssl/generated/ca.key +0 -15
  79. data/spec/fixtures/ssl/generated/selfsigned.crt +0 -14
  80. data/spec/fixtures/ssl/generated/server.crt +0 -13
  81. data/spec/fixtures/ssl/generated/server.key +0 -15
  82. data/spec/fixtures/ssl/openssl-exts.cnf +0 -9
  83. data/spec/fixtures/twitter.csv +0 -2
  84. data/spec/fixtures/twitter.json +0 -1
  85. data/spec/fixtures/twitter.xml +0 -403
  86. data/spec/fixtures/undefined_method_add_node_for_nil.xml +0 -2
  87. data/spec/httparty/connection_adapter_spec.rb +0 -468
  88. data/spec/httparty/cookie_hash_spec.rb +0 -83
  89. data/spec/httparty/exception_spec.rb +0 -38
  90. data/spec/httparty/hash_conversions_spec.rb +0 -41
  91. data/spec/httparty/logger/apache_formatter_spec.rb +0 -41
  92. data/spec/httparty/logger/curl_formatter_spec.rb +0 -18
  93. data/spec/httparty/logger/logger_spec.rb +0 -38
  94. data/spec/httparty/net_digest_auth_spec.rb +0 -230
  95. data/spec/httparty/parser_spec.rb +0 -173
  96. data/spec/httparty/request_spec.rb +0 -1073
  97. data/spec/httparty/response_spec.rb +0 -241
  98. data/spec/httparty/ssl_spec.rb +0 -74
  99. data/spec/httparty_spec.rb +0 -850
  100. data/spec/spec_helper.rb +0 -59
  101. data/spec/support/ssl_test_helper.rb +0 -47
  102. data/spec/support/ssl_test_server.rb +0 -80
  103. data/spec/support/stub_response.rb +0 -49
@@ -1,95 +0,0 @@
1
- @command_line
2
- Feature: Command Line
3
-
4
- As a developer
5
- I want to be able to harness the power of HTTParty from the command line
6
- Because that would make quick testing and debugging easy
7
-
8
- Scenario: Show help information
9
- When I run `httparty --help`
10
- Then the output should contain "-f, --format [FORMAT]"
11
-
12
- Scenario: Show current version
13
- When I run `httparty --version`
14
- Then the output should contain "Version:"
15
- And the output should not contain "You need to provide a URL"
16
-
17
- Scenario: Make a get request
18
- Given a remote deflate service on port '4001'
19
- And the response from the service has a body of 'GET request'
20
- And that service is accessed at the path '/fun'
21
- When I run `httparty http://0.0.0.0:4001/fun`
22
- Then the output should contain "GET request"
23
-
24
- Scenario: Make a post request
25
- Given a remote deflate service on port '4002'
26
- And the response from the service has a body of 'POST request'
27
- And that service is accessed at the path '/fun'
28
- When I run `httparty http://0.0.0.0:4002/fun --action post --data "a=1&b=2"`
29
- Then the output should contain "POST request"
30
-
31
- Scenario: Make a put request
32
- Given a remote deflate service on port '4003'
33
- And the response from the service has a body of 'PUT request'
34
- And that service is accessed at the path '/fun'
35
- When I run `httparty http://0.0.0.0:4003/fun --action put --data "a=1&b=2"`
36
- Then the output should contain "PUT request"
37
-
38
- Scenario: Make a delete request
39
- Given a remote deflate service on port '4004'
40
- And the response from the service has a body of 'DELETE request'
41
- And that service is accessed at the path '/fun'
42
- When I run `httparty http://0.0.0.0:4004/fun --action delete`
43
- Then the output should contain "DELETE request"
44
-
45
- Scenario: Set a verbose mode
46
- Given a remote deflate service on port '4005'
47
- And the response from the service has a body of 'Some request'
48
- And that service is accessed at the path '/fun'
49
- When I run `httparty http://0.0.0.0:4005/fun --verbose`
50
- Then the output should contain "content-length"
51
-
52
- Scenario: Use service with basic authentication
53
- Given a remote deflate service on port '4006'
54
- And the response from the service has a body of 'Successfull authentication'
55
- And that service is accessed at the path '/fun'
56
- And that service is protected by Basic Authentication
57
- And that service requires the username 'user' with the password 'pass'
58
- When I run `httparty http://0.0.0.0:4006/fun --user 'user:pass'`
59
- Then the output should contain "Successfull authentication"
60
-
61
- Scenario: Get response in plain format
62
- Given a remote deflate service on port '4007'
63
- And the response from the service has a body of 'Some request'
64
- And that service is accessed at the path '/fun'
65
- When I run `httparty http://0.0.0.0:4007/fun --format plain`
66
- Then the output should contain "Some request"
67
-
68
- Scenario: Get response in json format
69
- Given a remote deflate service on port '4008'
70
- Given a remote service that returns '{ "jennings": "waylon", "cash": "johnny" }'
71
- And that service is accessed at the path '/service.json'
72
- And the response from the service has a Content-Type of 'application/json'
73
- When I run `httparty http://0.0.0.0:4008/service.json --format json`
74
- Then the output should contain '"jennings": "waylon"'
75
-
76
- Scenario: Get response in xml format
77
- Given a remote deflate service on port '4009'
78
- Given a remote service that returns '<singer>waylon jennings</singer>'
79
- And that service is accessed at the path '/service.xml'
80
- And the response from the service has a Content-Type of 'text/xml'
81
- When I run `httparty http://0.0.0.0:4009/service.xml --format xml`
82
- Then the output should contain "<singer>"
83
-
84
- Scenario: Get response in csv format
85
- Given a remote deflate service on port '4010'
86
- Given a remote service that returns:
87
- """
88
- "Last Name","Name"
89
- "jennings","waylon"
90
- "cash","johnny"
91
- """
92
- And that service is accessed at the path '/service.csv'
93
- And the response from the service has a Content-Type of 'application/csv'
94
- When I run `httparty http://0.0.0.0:4010/service.csv --format csv`
95
- Then the output should contain '["Last Name", "Name"]'
@@ -1,26 +0,0 @@
1
- Feature: Deals with HTTP error codes
2
-
3
- As a developer
4
- I want to be informed of non-successful responses
5
- Because sometimes thing explode
6
- And I should probably know what happened
7
-
8
- Scenario: A response of '404 - Not Found'
9
- Given a remote service that returns a 404 status code
10
- And that service is accessed at the path '/404_service.html'
11
- When I call HTTParty#get with '/404_service.html'
12
- Then it should return a response with a 404 response code
13
-
14
- Scenario: A response of '500 - Internal Server Error'
15
- Given a remote service that returns a 500 status code
16
- And that service is accessed at the path '/500_service.html'
17
- When I call HTTParty#get with '/500_service.html'
18
- Then it should return a response with a 500 response code
19
-
20
- Scenario: A non-successful response where I need the body
21
- Given a remote service that returns a 400 status code
22
- And the response from the service has a body of 'Bad response'
23
- And that service is accessed at the path '/400_service.html'
24
- When I call HTTParty#get with '/400_service.html'
25
- Then it should return a response with a 400 response code
26
- And the return value should match 'Bad response'
@@ -1,30 +0,0 @@
1
- Feature: Digest Authentication
2
-
3
- As a developer
4
- I want to be able to use a service that requires Digest Authentication
5
- Because that is not an uncommon requirement
6
-
7
- Scenario: Passing no credentials to a page requiring Digest Authentication
8
- Given a restricted page at '/digest_auth.html'
9
- When I call HTTParty#get with '/digest_auth.html'
10
- Then it should return a response with a 401 response code
11
-
12
- Scenario: Passing proper credentials to a page requiring Digest Authentication
13
- Given a remote service that returns 'Digest Authenticated Page'
14
- And that service is accessed at the path '/digest_auth.html'
15
- And that service is protected by Digest Authentication
16
- And that service requires the username 'jcash' with the password 'maninblack'
17
- When I call HTTParty#get with '/digest_auth.html' and a digest_auth hash:
18
- | username | password |
19
- | jcash | maninblack |
20
- Then the return value should match 'Digest Authenticated Page'
21
-
22
- Scenario: Passing proper credentials to a page requiring Digest Authentication using md5-sess algorithm
23
- Given a remote service that returns 'Digest Authenticated Page Using MD5-sess'
24
- And that service is accessed at the path '/digest_auth.html'
25
- And that service is protected by MD5-sess Digest Authentication
26
- And that service requires the username 'jcash' with the password 'maninblack'
27
- When I call HTTParty#get with '/digest_auth.html' and a digest_auth hash:
28
- | username | password |
29
- | jcash | maninblack |
30
- Then the return value should match 'Digest Authenticated Page Using MD5-sess'
@@ -1,27 +0,0 @@
1
- Feature: Handles Compressed Responses
2
-
3
- In order to save bandwidth
4
- As a developer
5
- I want to uncompress compressed responses
6
-
7
- Scenario: Supports deflate encoding
8
- Given a remote deflate service
9
- And the response from the service has a body of '<h1>Some HTML</h1>'
10
- And that service is accessed at the path '/deflate_service.html'
11
- When I call HTTParty#get with '/deflate_service.html'
12
- Then the return value should match '<h1>Some HTML</h1>'
13
-
14
- Scenario: Supports gzip encoding
15
- Given a remote gzip service
16
- And the response from the service has a body of '<h1>Some HTML</h1>'
17
- And that service is accessed at the path '/gzip_service.html'
18
- When I call HTTParty#get with '/gzip_service.html'
19
- Then the return value should match '<h1>Some HTML</h1>'
20
-
21
- Scenario: Supports HEAD request with gzip encoding
22
- Given a remote gzip service
23
- And that service is accessed at the path '/gzip_head.gz.js'
24
- When I call HTTParty#head with '/gzip_head.gz.js'
25
- Then it should return a response with a 200 response code
26
- Then it should return a response with a gzip content-encoding
27
- Then it should return a response with a blank body
@@ -1,57 +0,0 @@
1
- Feature: Handles Multiple Formats
2
-
3
- As a developer
4
- I want to be able to consume remote services of many different formats
5
- And I want those formats to be automatically detected and handled
6
- Because web services take many forms
7
- And I don't want to have to do any extra work
8
-
9
- Scenario: An HTML service
10
- Given a remote service that returns '<h1>Some HTML</h1>'
11
- And that service is accessed at the path '/html_service.html'
12
- And the response from the service has a Content-Type of 'text/html'
13
- When I call HTTParty#get with '/html_service.html'
14
- Then it should return a String
15
- And the return value should match '<h1>Some HTML</h1>'
16
-
17
- Scenario: A CSV service
18
- Given a remote service that returns:
19
- """
20
- "Last Name","Name"
21
- "jennings","waylon"
22
- "cash","johnny"
23
- """
24
- And that service is accessed at the path '/service.csv'
25
- And the response from the service has a Content-Type of 'application/csv'
26
- When I call HTTParty#get with '/service.csv'
27
- Then it should return an Array equaling:
28
- | Last Name | Name |
29
- | jennings | waylon |
30
- | cash | johnny |
31
-
32
- Scenario: A JSON service
33
- Given a remote service that returns '{ "jennings": "waylon", "cash": "johnny" }'
34
- And that service is accessed at the path '/service.json'
35
- And the response from the service has a Content-Type of 'application/json'
36
- When I call HTTParty#get with '/service.json'
37
- Then it should return a Hash equaling:
38
- | key | value |
39
- | jennings | waylon |
40
- | cash | johnny |
41
-
42
- Scenario: An XML Service
43
- Given a remote service that returns '<singer>waylon jennings</singer>'
44
- And that service is accessed at the path '/service.xml'
45
- And the response from the service has a Content-Type of 'text/xml'
46
- When I call HTTParty#get with '/service.xml'
47
- Then it should return a Hash equaling:
48
- | key | value |
49
- | singer | waylon jennings |
50
-
51
- Scenario: A Javascript remote file
52
- Given a remote service that returns '$(function() { alert("hi"); });'
53
- And that service is accessed at the path '/service.js'
54
- And the response from the service has a Content-Type of 'application/javascript'
55
- When I call HTTParty#get with '/service.js'
56
- Then it should return a String
57
- And the return value should match '$(function() { alert("hi"); });'
@@ -1,27 +0,0 @@
1
- require 'mongrel'
2
- require './lib/httparty'
3
- require 'rspec/expectations'
4
- require 'aruba/cucumber'
5
-
6
- def run_server(port)
7
- @host_and_port = "0.0.0.0:#{port}"
8
- @server = Mongrel::HttpServer.new("0.0.0.0", port)
9
- @server.run
10
- @request_options = {}
11
- end
12
-
13
- def new_port
14
- server = TCPServer.new('0.0.0.0', nil)
15
- port = server.addr[1]
16
- ensure
17
- server.close
18
- end
19
-
20
- Before('~@command_line') do
21
- port = ENV["HTTPARTY_PORT"] || new_port
22
- run_server(port)
23
- end
24
-
25
- After do
26
- @server.stop if @server
27
- end
@@ -1,52 +0,0 @@
1
- # Not needed anymore in ruby 2.0, but needed to resolve constants
2
- # in nested namespaces. This is taken from rails :)
3
- def constantize(camel_cased_word)
4
- names = camel_cased_word.split('::')
5
- names.shift if names.empty? || names.first.empty?
6
-
7
- constant = Object
8
- names.each do |name|
9
- constant = constant.const_defined?(name) ? constant.const_get(name) : constant.const_missing(name)
10
- end
11
- constant
12
- end
13
-
14
- Then /it should return an? (\w+)$/ do |class_string|
15
- expect(@response_from_httparty).to be_a(class_string.class)
16
- end
17
-
18
- Then /the return value should match '(.*)'/ do |expected_text|
19
- expect(@response_from_httparty.parsed_response).to eq(expected_text)
20
- end
21
-
22
- Then /it should return a Hash equaling:/ do |hash_table|
23
- expect(@response_from_httparty).to be_a(Hash)
24
- expect(@response_from_httparty.keys.length).to eq(hash_table.rows.length)
25
- hash_table.hashes.each do |pair|
26
- key, value = pair["key"], pair["value"]
27
- expect(@response_from_httparty.keys).to include(key)
28
- expect(@response_from_httparty[key]).to eq(value)
29
- end
30
- end
31
-
32
- Then /it should return an Array equaling:/ do |array|
33
- expect(@response_from_httparty).to be_a(Array)
34
- expect(@response_from_httparty.parsed_response).to eq(array.raw)
35
- end
36
-
37
- Then /it should return a response with a (\d+) response code/ do |code|
38
- expect(@response_from_httparty.code).to eq(code.to_i)
39
- end
40
-
41
- Then /it should return a response with a (.*) content\-encoding$/ do |content_type|
42
- expect(@response_from_httparty.headers['content-encoding']).to eq('gzip')
43
- end
44
-
45
- Then /it should return a response with a blank body$/ do
46
- expect(@response_from_httparty.body).to be_nil
47
- end
48
-
49
- Then /it should raise (?:an|a) ([\w:]+) exception/ do |exception|
50
- expect(@exception_from_httparty).to_not be_nil
51
- expect(@exception_from_httparty).to be_a constantize(exception)
52
- end
@@ -1,43 +0,0 @@
1
- When /^I set my HTTParty timeout option to (\d+)$/ do |timeout|
2
- @request_options[:timeout] = timeout.to_i
3
- end
4
-
5
- When /^I set my HTTParty open_timeout option to (\d+)$/ do |timeout|
6
- @request_options[:open_timeout] = timeout.to_i
7
- end
8
-
9
- When /^I set my HTTParty read_timeout option to (\d+)$/ do |timeout|
10
- @request_options[:read_timeout] = timeout.to_i
11
- end
12
-
13
- When /I call HTTParty#get with '(.*)'$/ do |url|
14
- begin
15
- @response_from_httparty = HTTParty.get("http://#{@host_and_port}#{url}", @request_options)
16
- rescue HTTParty::RedirectionTooDeep, Timeout::Error => e
17
- @exception_from_httparty = e
18
- end
19
- end
20
-
21
- When /^I call HTTParty#head with '(.*)'$/ do |url|
22
- begin
23
- @response_from_httparty = HTTParty.head("http://#{@host_and_port}#{url}", @request_options)
24
- rescue HTTParty::RedirectionTooDeep, Timeout::Error => e
25
- @exception_from_httparty = e
26
- end
27
- end
28
-
29
- When /I call HTTParty#get with '(.*)' and a basic_auth hash:/ do |url, auth_table|
30
- h = auth_table.hashes.first
31
- @response_from_httparty = HTTParty.get(
32
- "http://#{@host_and_port}#{url}",
33
- basic_auth: { username: h["username"], password: h["password"] }
34
- )
35
- end
36
-
37
- When /I call HTTParty#get with '(.*)' and a digest_auth hash:/ do |url, auth_table|
38
- h = auth_table.hashes.first
39
- @response_from_httparty = HTTParty.get(
40
- "http://#{@host_and_port}#{url}",
41
- digest_auth: { username: h["username"], password: h["password"] }
42
- )
43
- end
@@ -1,127 +0,0 @@
1
- require 'base64'
2
- class BasicMongrelHandler < Mongrel::HttpHandler
3
- attr_accessor :content_type, :custom_headers, :response_body, :response_code, :preprocessor, :username, :password
4
-
5
- def initialize
6
- @content_type = "text/html"
7
- @response_body = ""
8
- @response_code = 200
9
- @custom_headers = {}
10
- end
11
-
12
- def process(request, response)
13
- instance_eval(&preprocessor) if preprocessor
14
- reply_with(response, response_code, response_body)
15
- end
16
-
17
- def reply_with(response, code, response_body)
18
- response.start(code) do |head, body|
19
- head["Content-Type"] = content_type
20
- custom_headers.each { |k, v| head[k] = v }
21
- body.write(response_body)
22
- end
23
- end
24
- end
25
-
26
- class DeflateHandler < BasicMongrelHandler
27
- def process(request, response)
28
- response.start do |head, body|
29
- head['Content-Encoding'] = 'deflate'
30
- body.write Zlib::Deflate.deflate(response_body)
31
- end
32
- end
33
- end
34
-
35
- class GzipHandler < BasicMongrelHandler
36
- def process(request, response)
37
- response.start do |head, body|
38
- head['Content-Encoding'] = 'gzip'
39
- body.write gzip(response_body)
40
- end
41
- end
42
-
43
- protected
44
-
45
- def gzip(string)
46
- sio = StringIO.new('', 'r+')
47
- gz = Zlib::GzipWriter.new sio
48
- gz.write string
49
- gz.finish
50
- sio.rewind
51
- sio.read
52
- end
53
- end
54
-
55
- module BasicAuthentication
56
- def self.extended(base)
57
- base.custom_headers["WWW-Authenticate"] = 'Basic Realm="Super Secret Page"'
58
- end
59
-
60
- def process(request, response)
61
- if authorized?(request)
62
- super
63
- else
64
- reply_with(response, 401, "Incorrect. You have 20 seconds to comply.")
65
- end
66
- end
67
-
68
- def authorized?(request)
69
- request.params["HTTP_AUTHORIZATION"] == "Basic " + Base64.encode64("#{@username}:#{@password}").strip
70
- end
71
- end
72
-
73
- module DigestAuthentication
74
- def self.extended(base)
75
- base.custom_headers["WWW-Authenticate"] = 'Digest realm="testrealm@host.com",qop="auth,auth-int",nonce="nonce",opaque="opaque"'
76
- end
77
-
78
- def process(request, response)
79
- if authorized?(request)
80
- super
81
- else
82
- reply_with(response, 401, "Incorrect. You have 20 seconds to comply.")
83
- end
84
- end
85
-
86
- def authorized?(request)
87
- request.params["HTTP_AUTHORIZATION"] =~ /Digest.*uri=/
88
- end
89
- end
90
-
91
- module DigestAuthenticationUsingMD5Sess
92
- NONCE = 'nonce'
93
- REALM = 'testrealm@host.com'
94
- QOP = 'auth,auth-int'
95
- def self.extended(base)
96
- base.custom_headers["WWW-Authenticate"] = %(Digest realm="#{REALM}",qop="#{QOP}",algorithm="MD5-sess",nonce="#{NONCE}",opaque="opaque"')
97
- end
98
-
99
- def process(request, response)
100
- if authorized?(request)
101
- super
102
- else
103
- reply_with(response, 401, "Incorrect. You have 20 seconds to comply.")
104
- end
105
- end
106
-
107
- def md5(str)
108
- Digest::MD5.hexdigest(str)
109
- end
110
-
111
- def authorized?(request)
112
- auth = request.params["HTTP_AUTHORIZATION"]
113
- params = {}
114
- auth.to_s.gsub(/(\w+)="(.*?)"/) { params[$1] = $2 }.gsub(/(\w+)=([^,]*)/) { params[$1] = $2 }
115
- a1a = [@username,REALM,@password].join(':')
116
- a1 = [md5(a1a),NONCE,params['cnonce'] ].join(':')
117
- a2 = [ request.params["REQUEST_METHOD"], request.params["REQUEST_URI"] ] .join(':')
118
- expected_response = md5( [md5(a1), NONCE, params['nc'], params['cnonce'], QOP, md5(a2)].join(':') )
119
- expected_response == params['response']
120
- end
121
- end
122
-
123
-
124
- def new_mongrel_redirector(target_url, relative_path = false)
125
- target_url = "http://#{@host_and_port}#{target_url}" unless relative_path
126
- Mongrel::RedirectHandler.new(target_url)
127
- end
@@ -1,90 +0,0 @@
1
- Given /a remote service that returns '(.*)'/ do |response_body|
2
- @handler = BasicMongrelHandler.new
3
- step "the response from the service has a body of '#{response_body}'"
4
- end
5
-
6
- Given /^a remote service that returns:$/ do |response_body|
7
- @handler = BasicMongrelHandler.new
8
- @handler.response_body = response_body
9
- end
10
-
11
- Given /a remote service that returns a (\d+) status code/ do |code|
12
- @handler = BasicMongrelHandler.new
13
- @handler.response_code = code
14
- end
15
-
16
- Given /that service is accessed at the path '(.*)'/ do |path|
17
- @server.register(path, @handler)
18
- end
19
-
20
- Given /^that service takes (\d+) seconds to generate a response$/ do |time|
21
- @server_response_time = time.to_i
22
- @handler.preprocessor = proc { sleep time.to_i }
23
- end
24
-
25
- Given /^a remote deflate service$/ do
26
- @handler = DeflateHandler.new
27
- end
28
-
29
- Given /^a remote deflate service on port '(\d+)'/ do |port|
30
- run_server(port)
31
- @handler = DeflateHandler.new
32
- end
33
-
34
- Given /^a remote gzip service$/ do
35
- @handler = GzipHandler.new
36
- end
37
-
38
- Given /the response from the service has a Content-Type of '(.*)'/ do |content_type|
39
- @handler.content_type = content_type
40
- end
41
-
42
- Given /the response from the service has a body of '(.*)'/ do |response_body|
43
- @handler.response_body = response_body
44
- end
45
-
46
- Given /the url '(.*)' redirects to '(.*)'/ do |redirection_url, target_url|
47
- @server.register redirection_url, new_mongrel_redirector(target_url)
48
- end
49
-
50
- Given /that service is protected by Basic Authentication/ do
51
- @handler.extend BasicAuthentication
52
- end
53
-
54
- Given /that service is protected by Digest Authentication/ do
55
- @handler.extend DigestAuthentication
56
- end
57
-
58
- Given /that service is protected by MD5-sess Digest Authentication/ do
59
- @handler.extend DigestAuthenticationUsingMD5Sess
60
- end
61
-
62
- Given /that service requires the username '(.*)' with the password '(.*)'/ do |username, password|
63
- @handler.username = username
64
- @handler.password = password
65
- end
66
-
67
- # customize aruba cucumber step
68
- Then /^the output should contain '(.*)'$/ do |expected|
69
- assert_partial_output(expected, all_output)
70
- end
71
-
72
- Given /a restricted page at '(.*)'/ do |url|
73
- steps "
74
- Given a remote service that returns 'A response I will never see'
75
- And that service is accessed at the path '#{url}'
76
- And that service is protected by Basic Authentication
77
- And that service requires the username 'something' with the password 'secret'
78
- "
79
- end
80
-
81
- # This joins the server thread, and halts cucumber, so you can actually hit the
82
- # server with a browser. Runs until you kill it with Ctrl-c
83
- Given /I want to hit this in a browser/ do
84
- @server.acceptor.join
85
- end
86
-
87
- Then /I wait for the server to recover/ do
88
- timeout = @request_options[:timeout] || 0
89
- sleep @server_response_time - timeout
90
- end
@@ -1,13 +0,0 @@
1
- Feature: Supports the read timeout option
2
- In order to handle inappropriately slow response times
3
- As a developer
4
- I want my request to raise an exception after my specified read_timeout as elapsed
5
-
6
- Scenario: A long running response
7
- Given a remote service that returns '<h1>Some HTML</h1>'
8
- And that service is accessed at the path '/long_running_service.html'
9
- And that service takes 2 seconds to generate a response
10
- When I set my HTTParty read_timeout option to 1
11
- And I call HTTParty#get with '/long_running_service.html'
12
- Then it should raise a Timeout::Error exception
13
- And I wait for the server to recover
@@ -1,22 +0,0 @@
1
- Feature: Supports Redirection
2
-
3
- As a developer
4
- I want to work with services that may redirect me
5
- And I want it to follow a reasonable number of redirects
6
- Because sometimes web services do that
7
-
8
- Scenario: A service that redirects once
9
- Given a remote service that returns 'Service Response'
10
- And that service is accessed at the path '/landing_service.html'
11
- And the url '/redirector.html' redirects to '/landing_service.html'
12
- When I call HTTParty#get with '/redirector.html'
13
- Then the return value should match 'Service Response'
14
-
15
- # TODO: Look in to why this actually fails...
16
- Scenario: A service that redirects to a relative URL
17
-
18
- Scenario: A service that redirects infinitely
19
- Given the url '/first.html' redirects to '/second.html'
20
- And the url '/second.html' redirects to '/first.html'
21
- When I call HTTParty#get with '/first.html'
22
- Then it should raise an HTTParty::RedirectionTooDeep exception
@@ -1,13 +0,0 @@
1
- Feature: Supports the timeout option
2
- In order to handle inappropriately slow response times
3
- As a developer
4
- I want my request to raise an exception after my specified timeout as elapsed
5
-
6
- Scenario: A long running response
7
- Given a remote service that returns '<h1>Some HTML</h1>'
8
- And that service is accessed at the path '/long_running_service.html'
9
- And that service takes 2 seconds to generate a response
10
- When I set my HTTParty timeout option to 1
11
- And I call HTTParty#get with '/long_running_service.html'
12
- Then it should raise a Timeout::Error exception
13
- And I wait for the server to recover