httparty-responsibly 0.17.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. checksums.yaml +7 -0
  2. data/.editorconfig +18 -0
  3. data/.gitignore +13 -0
  4. data/.rubocop.yml +92 -0
  5. data/.rubocop_todo.yml +124 -0
  6. data/.simplecov +1 -0
  7. data/.travis.yml +11 -0
  8. data/CONTRIBUTING.md +23 -0
  9. data/Changelog.md +509 -0
  10. data/Gemfile +24 -0
  11. data/Guardfile +16 -0
  12. data/MIT-LICENSE +20 -0
  13. data/README.md +78 -0
  14. data/Rakefile +10 -0
  15. data/bin/httparty +123 -0
  16. data/cucumber.yml +1 -0
  17. data/docs/README.md +106 -0
  18. data/examples/README.md +86 -0
  19. data/examples/aaws.rb +32 -0
  20. data/examples/basic.rb +28 -0
  21. data/examples/body_stream.rb +14 -0
  22. data/examples/crack.rb +19 -0
  23. data/examples/custom_parsers.rb +68 -0
  24. data/examples/delicious.rb +37 -0
  25. data/examples/google.rb +16 -0
  26. data/examples/headers_and_user_agents.rb +10 -0
  27. data/examples/logging.rb +36 -0
  28. data/examples/microsoft_graph.rb +52 -0
  29. data/examples/multipart.rb +22 -0
  30. data/examples/nokogiri_html_parser.rb +19 -0
  31. data/examples/peer_cert.rb +9 -0
  32. data/examples/rescue_json.rb +17 -0
  33. data/examples/rubyurl.rb +14 -0
  34. data/examples/stackexchange.rb +24 -0
  35. data/examples/stream_download.rb +26 -0
  36. data/examples/tripit_sign_in.rb +44 -0
  37. data/examples/twitter.rb +31 -0
  38. data/examples/whoismyrep.rb +10 -0
  39. data/httparty-responsibly.gemspec +27 -0
  40. data/lib/httparty.rb +668 -0
  41. data/lib/httparty/connection_adapter.rb +254 -0
  42. data/lib/httparty/cookie_hash.rb +21 -0
  43. data/lib/httparty/exceptions.rb +33 -0
  44. data/lib/httparty/hash_conversions.rb +69 -0
  45. data/lib/httparty/headers_processor.rb +30 -0
  46. data/lib/httparty/logger/apache_formatter.rb +45 -0
  47. data/lib/httparty/logger/curl_formatter.rb +91 -0
  48. data/lib/httparty/logger/logger.rb +28 -0
  49. data/lib/httparty/logger/logstash_formatter.rb +59 -0
  50. data/lib/httparty/module_inheritable_attributes.rb +56 -0
  51. data/lib/httparty/net_digest_auth.rb +136 -0
  52. data/lib/httparty/parser.rb +150 -0
  53. data/lib/httparty/request.rb +386 -0
  54. data/lib/httparty/request/body.rb +84 -0
  55. data/lib/httparty/request/multipart_boundary.rb +11 -0
  56. data/lib/httparty/response.rb +140 -0
  57. data/lib/httparty/response/headers.rb +33 -0
  58. data/lib/httparty/response_fragment.rb +19 -0
  59. data/lib/httparty/text_encoder.rb +70 -0
  60. data/lib/httparty/utils.rb +11 -0
  61. data/lib/httparty/version.rb +3 -0
  62. data/script/release +42 -0
  63. data/website/css/common.css +47 -0
  64. data/website/index.html +73 -0
  65. metadata +138 -0
data/Gemfile ADDED
@@ -0,0 +1,24 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
3
+
4
+ gem 'rake'
5
+ gem 'mongrel', '1.2.0.pre2'
6
+
7
+ group :development do
8
+ gem 'guard'
9
+ gem 'guard-rspec'
10
+ gem 'guard-bundler'
11
+ end
12
+
13
+ group :test do
14
+ gem 'rspec', '~> 3.4'
15
+ gem 'simplecov', require: false
16
+ gem 'aruba'
17
+ gem 'cucumber', '~> 2.3'
18
+ gem 'webmock'
19
+ gem 'addressable'
20
+ end
21
+
22
+ group :development, :test do
23
+ gem 'pry'
24
+ end
@@ -0,0 +1,16 @@
1
+ rspec_options = {
2
+ version: 1,
3
+ all_after_pass: false,
4
+ all_on_start: false
5
+ }
6
+
7
+ guard 'rspec', rspec_options do
8
+ watch(%r{^spec/.+_spec\.rb$})
9
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
10
+ watch('spec/spec_helper.rb') { "spec" }
11
+ end
12
+
13
+ guard 'bundler' do
14
+ watch('Gemfile')
15
+ watch(/^.+\.gemspec/)
16
+ end
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2008 John Nunemaker
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,78 @@
1
+ # httparty
2
+
3
+ An up-to-date fork of httparty, without the post-install nonsense.
4
+
5
+ ## Install
6
+
7
+ ```
8
+ gem install httparty
9
+ ```
10
+
11
+ ## Requirements
12
+
13
+ * Ruby 2.0.0 or higher
14
+ * multi_xml
15
+
16
+ ## Examples
17
+
18
+ ```ruby
19
+ # Use the class methods to get down to business quickly
20
+ response = HTTParty.get('http://api.stackexchange.com/2.2/questions?site=stackoverflow')
21
+
22
+ puts response.body, response.code, response.message, response.headers.inspect
23
+
24
+ # Or wrap things up in your own class
25
+ class StackExchange
26
+ include HTTParty
27
+ base_uri 'api.stackexchange.com'
28
+
29
+ def initialize(service, page)
30
+ @options = { query: { site: service, page: page } }
31
+ end
32
+
33
+ def questions
34
+ self.class.get("/2.2/questions", @options)
35
+ end
36
+
37
+ def users
38
+ self.class.get("/2.2/users", @options)
39
+ end
40
+ end
41
+
42
+ stack_exchange = StackExchange.new("stackoverflow", 1)
43
+ puts stack_exchange.questions
44
+ puts stack_exchange.users
45
+ ```
46
+
47
+ See the [examples directory](http://github.com/jnunemaker/httparty/tree/master/examples) for even more goodies.
48
+
49
+ ## Command Line Interface
50
+
51
+ httparty also includes the executable `httparty` which can be
52
+ used to query web services and examine the resulting output. By default
53
+ it will output the response as a pretty-printed Ruby object (useful for
54
+ grokking the structure of output). This can also be overridden to output
55
+ formatted XML or JSON. Execute `httparty --help` for all the
56
+ options. Below is an example of how easy it is.
57
+
58
+ ```
59
+ httparty "https://api.stackexchange.com/2.2/questions?site=stackoverflow"
60
+ ```
61
+
62
+ ## Help and Docs
63
+
64
+ * [Docs](https://github.com/jnunemaker/httparty/tree/master/docs)
65
+ * https://groups.google.com/forum/#!forum/httparty-gem
66
+ * https://www.rubydoc.info/github/jnunemaker/httparty
67
+ * http://stackoverflow.com/questions/tagged/httparty
68
+
69
+ ## Contributing
70
+
71
+ * Fork the project.
72
+ * Run `bundle`
73
+ * Run `bundle exec rake`
74
+ * Make your feature addition or bug fix.
75
+ * Add tests for it. This is important so I don't break it in a future version unintentionally.
76
+ * Run `bundle exec rake` (No, REALLY :))
77
+ * Commit, do not mess with rakefile, version, or history. (if you want to have your own version, that is fine but bump version in a commit by itself in another branch so I can ignore when I pull)
78
+ * Send me a pull request. Bonus points for topic branches.
@@ -0,0 +1,10 @@
1
+ begin
2
+ require 'rspec/core/rake_task'
3
+ RSpec::Core::RakeTask.new(:spec)
4
+ rescue LoadError
5
+ end
6
+
7
+ require 'cucumber/rake/task'
8
+ Cucumber::Rake::Task.new(:features)
9
+
10
+ task default: [:spec, :features]
@@ -0,0 +1,123 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "optparse"
4
+ require "pp"
5
+
6
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "/../lib"))
7
+ require "httparty"
8
+
9
+ opts = {
10
+ action: :get,
11
+ headers: {},
12
+ verbose: false
13
+ }
14
+
15
+ OptionParser.new do |o|
16
+ o.banner = "USAGE: #{$PROGRAM_NAME} [options] [url]"
17
+
18
+ o.on("-f",
19
+ "--format [FORMAT]",
20
+ "Output format to use instead of pretty-print ruby: " \
21
+ "plain, csv, json or xml") do |f|
22
+ opts[:output_format] = f.downcase.to_sym
23
+ end
24
+
25
+ o.on("-a",
26
+ "--action [ACTION]",
27
+ "HTTP action: get (default), post, put, delete, head, or options") do |a|
28
+ opts[:action] = a.downcase.to_sym
29
+ end
30
+
31
+ o.on("-d",
32
+ "--data [BODY]",
33
+ "Data to put in request body (prefix with '@' for file)") do |d|
34
+ if d =~ /^@/
35
+ opts[:body] = open(d[1..-1]).read
36
+ else
37
+ opts[:body] = d
38
+ end
39
+ end
40
+
41
+ o.on("-H", "--header [NAME:VALUE]", "Additional HTTP headers in NAME:VALUE form") do |h|
42
+ abort "Invalid header specification, should be Name:Value" unless h =~ /.+:.+/
43
+ name, value = h.split(':')
44
+ opts[:headers][name.strip] = value.strip
45
+ end
46
+
47
+ o.on("-v", "--verbose", "If set, print verbose output") do |v|
48
+ opts[:verbose] = true
49
+ end
50
+
51
+ o.on("-u", "--user [CREDS]", "Use basic authentication. Value should be user:password") do |u|
52
+ abort "Invalid credentials format. Must be user:password" unless u =~ /.*:.+/
53
+ user, password = u.split(':')
54
+ opts[:basic_auth] = { username: user, password: password }
55
+ end
56
+
57
+ o.on("-r", "--response-code", "Command fails if response code >= 400") do
58
+ opts[:response_code] = true
59
+ end
60
+
61
+ o.on("-h", "--help", "Show help documentation") do |h|
62
+ puts o
63
+ exit
64
+ end
65
+
66
+ o.on("--version", "Show HTTParty version") do |ver|
67
+ puts "Version: #{HTTParty::VERSION}"
68
+ exit
69
+ end
70
+ end.parse!
71
+
72
+ if ARGV.empty?
73
+ STDERR.puts "You need to provide a URL"
74
+ STDERR.puts "USAGE: #{$PROGRAM_NAME} [options] [url]"
75
+ end
76
+
77
+ def dump_headers(response)
78
+ resp_type = Net::HTTPResponse::CODE_TO_OBJ[response.code.to_s]
79
+ puts "#{response.code} #{resp_type.to_s.sub(/^Net::HTTP/, '')}"
80
+ response.headers.each do |n, v|
81
+ puts "#{n}: #{v}"
82
+ end
83
+ puts
84
+ end
85
+
86
+ if opts[:verbose]
87
+ puts "#{opts[:action].to_s.upcase} #{ARGV.first}"
88
+ opts[:headers].each do |n, v|
89
+ puts "#{n}: #{v}"
90
+ end
91
+ puts
92
+ end
93
+
94
+ response = HTTParty.send(opts[:action], ARGV.first, opts)
95
+ if opts[:output_format].nil?
96
+ dump_headers(response) if opts[:verbose]
97
+ pp response
98
+ else
99
+ print_format = opts[:output_format]
100
+ dump_headers(response) if opts[:verbose]
101
+
102
+ case opts[:output_format]
103
+ when :json
104
+ begin
105
+ require 'json'
106
+ puts JSON.pretty_generate(response.parsed_response)
107
+ rescue LoadError
108
+ puts YAML.dump(response)
109
+ rescue JSON::JSONError
110
+ puts response.inspect
111
+ end
112
+ when :xml
113
+ require 'rexml/document'
114
+ REXML::Document.new(response.body).write(STDOUT, 2)
115
+ puts
116
+ when :csv
117
+ require 'csv'
118
+ puts CSV.parse(response.body).map(&:to_s)
119
+ else
120
+ puts response
121
+ end
122
+ end
123
+ exit false if opts[:response_code] && response.code >= 400
@@ -0,0 +1 @@
1
+ default: features --format progress
@@ -0,0 +1,106 @@
1
+ # httparty
2
+
3
+ Makes http fun again!
4
+
5
+ ## Table of contents
6
+ - [Parsing JSON](#parsing-json)
7
+ - [Working with SSL](#working-with-ssl)
8
+
9
+ ## Parsing JSON
10
+ If the response Content Type is `application/json`, HTTParty will parse the response and return Ruby objects such as a hash or array. The default behavior for parsing JSON will return keys as strings. This can be supressed with the `format` option. To get hash keys as symbols:
11
+
12
+ ```ruby
13
+ response = HTTParty.get('http://example.com', format: :plain)
14
+ JSON.parse response, symbolize_names: true
15
+ ```
16
+
17
+ ## Working with SSL
18
+
19
+ You can use this guide to work with SSL certificates.
20
+
21
+ #### Using `pem` option
22
+
23
+ ```ruby
24
+ # Use this example if you are using a pem file
25
+
26
+ class Client
27
+ include HTTParty
28
+
29
+ base_uri "https://example.com"
30
+ pem File.read("#{File.expand_path('.')}/path/to/certs/cert.pem"), "123456"
31
+ end
32
+ ```
33
+
34
+ #### Using `pkcs12` option
35
+
36
+ ```ruby
37
+ # Use this example if you are using a pkcs12 file
38
+
39
+ class Client
40
+ include HTTParty
41
+
42
+ base_uri "https://example.com"
43
+ pkcs12 File.read("#{File.expand_path('.')}/path/to/certs/cert.p12"), "123456"
44
+ end
45
+ ```
46
+
47
+ #### Using `ssl_ca_file` option
48
+
49
+ ```ruby
50
+ # Use this example if you are using a pkcs12 file
51
+
52
+ class Client
53
+ include HTTParty
54
+
55
+ base_uri "https://example.com"
56
+ ssl_ca_file "#{File.expand_path('.')}/path/to/certs/cert.pem"
57
+ end
58
+ ```
59
+
60
+ #### Using `ssl_ca_path` option
61
+
62
+ ```ruby
63
+ # Use this example if you are using a pkcs12 file
64
+
65
+ class Client
66
+ include HTTParty
67
+
68
+ base_uri "https://example.com"
69
+ ssl_ca_path '/path/to/certs'
70
+ end
71
+ ```
72
+
73
+ You can also include this options with the call:
74
+
75
+ ```ruby
76
+ class Client
77
+ include HTTParty
78
+
79
+ base_uri "https://example.com"
80
+
81
+ def self.fetch
82
+ get("/resources", pem: (File.read("#{File.expand_path('.')}/path/to/certs/cert.pem"), "123456")
83
+ end
84
+ end
85
+ ```
86
+
87
+ ### Avoid SSL verification
88
+
89
+ In some cases you may want to skip SSL verification, because the entity that issue the certificate is not a valid one, but you still want to work with it. You can achieve this through:
90
+
91
+ ```ruby
92
+ # Skips SSL certificate verification
93
+
94
+ class Client
95
+ include HTTParty
96
+
97
+ base_uri "https://example.com"
98
+ pem File.read("#{File.expand_path('.')}/path/to/certs/cert.pem"), "123456"
99
+
100
+ def self.fetch
101
+ get("/resources", verify: false)
102
+ # You can also use something like:
103
+ # get("resources", verify_peer: false)
104
+ end
105
+ end
106
+ ```
@@ -0,0 +1,86 @@
1
+ ## Examples
2
+
3
+ * [Amazon Book Search](aaws.rb)
4
+ * Httparty included into poro class
5
+ * Uses `get` requests
6
+ * Transforms query params to uppercased params
7
+
8
+ * [Google Search](google.rb)
9
+ * Httparty included into poro class
10
+ * Uses `get` requests
11
+
12
+ * [Crack Custom Parser](crack.rb)
13
+ * Creates a custom parser for XML using crack gem
14
+ * Uses `get` request
15
+
16
+ * [Create HTML Nokogiri parser](nokogiri_html_parser.rb)
17
+ * Adds Html as a format
18
+ * passed the body of request to Nokogiri
19
+
20
+ * [More Custom Parsers](custom_parsers.rb)
21
+ * Create an additional parser for atom or make it the ONLY parser
22
+
23
+ * [Basic Auth, Delicious](delicious.rb)
24
+ * Basic Auth, shows how to merge those into options
25
+ * Uses `get` requests
26
+
27
+ * [Passing Headers, User Agent](headers_and_user_agents.rb)
28
+ * Use the class method of Httparty
29
+ * Pass the User-Agent in the headers
30
+ * Uses `get` requests
31
+
32
+ * [Basic Post Request](basic.rb)
33
+ * Httparty included into poro class
34
+ * Uses `post` requests
35
+
36
+ * [Access Rubyurl Shortener](rubyurl.rb)
37
+ * Httparty included into poro class
38
+ * Uses `post` requests
39
+
40
+ * [Add a custom log file](logging.rb)
41
+ * create a log file and have httparty log requests
42
+
43
+ * [Accessing StackExchange](stackexchange.rb)
44
+ * Httparty included into poro class
45
+ * Creates methods for different endpoints
46
+ * Uses `get` requests
47
+
48
+ * [Accessing Tripit](tripit_sign_in.rb)
49
+ * Httparty included into poro class
50
+ * Example of using `debug_output` to see headers/urls passed
51
+ * Getting and using Cookies
52
+ * Uses `get` requests
53
+
54
+ * [Accessing Twitter](twitter.rb)
55
+ * Httparty included into poro class
56
+ * Basic Auth
57
+ * Loads settings from a config file
58
+ * Uses `get` requests
59
+ * Uses `post` requests
60
+
61
+ * [Accessing WhoIsMyRep](whoismyrep.rb)
62
+ * Httparty included into poro class
63
+ * Uses `get` requests
64
+ * Two ways to pass params to get, inline on the url or in query hash
65
+
66
+ * [Rescue Json Error](rescue_json.rb)
67
+ * Rescue errors due to parsing response
68
+
69
+ * [Download file using stream mode](stream_download.rb)
70
+ * Uses `get` requests
71
+ * Uses `stream_body` mode
72
+ * Download file without using the memory
73
+
74
+ * [Microsoft graph](microsoft_graph.rb)
75
+ * Basic Auth
76
+ * Uses `post` requests
77
+ * Uses multipart
78
+
79
+ * [Multipart](multipart.rb)
80
+ * Multipart data upload _(with and without file)_
81
+
82
+ * [Uploading File](body_stream.rb)
83
+ * Uses `body_stream` to upload file
84
+
85
+ * [Accessing x509 Peer Certificate](peer_cert.rb)
86
+ * Provides access to the server's TLS certificate