httparty 0.13.7 → 0.20.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of httparty might be problematic. Click here for more details.

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