httpotato 1.0.2

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 (70) hide show
  1. data/.gitignore +7 -0
  2. data/History +216 -0
  3. data/MIT-LICENSE +20 -0
  4. data/Manifest +47 -0
  5. data/README.rdoc +52 -0
  6. data/Rakefile +90 -0
  7. data/VERSION +1 -0
  8. data/bin/httpotato +108 -0
  9. data/cucumber.yml +1 -0
  10. data/examples/aaws.rb +32 -0
  11. data/examples/basic.rb +11 -0
  12. data/examples/custom_parsers.rb +67 -0
  13. data/examples/delicious.rb +37 -0
  14. data/examples/google.rb +16 -0
  15. data/examples/rubyurl.rb +14 -0
  16. data/examples/twitter.rb +31 -0
  17. data/examples/whoismyrep.rb +10 -0
  18. data/features/basic_authentication.feature +20 -0
  19. data/features/command_line.feature +7 -0
  20. data/features/deals_with_http_error_codes.feature +26 -0
  21. data/features/digest_authentication.feature +20 -0
  22. data/features/handles_compressed_responses.feature +19 -0
  23. data/features/handles_multiple_formats.feature +34 -0
  24. data/features/steps/env.rb +23 -0
  25. data/features/steps/httpotato_response_steps.rb +26 -0
  26. data/features/steps/httpotato_steps.rb +27 -0
  27. data/features/steps/mongrel_helper.rb +94 -0
  28. data/features/steps/remote_service_steps.rb +69 -0
  29. data/features/supports_redirection.feature +22 -0
  30. data/features/supports_timeout_option.feature +13 -0
  31. data/httpotato.gemspec +150 -0
  32. data/lib/httpotato.rb +371 -0
  33. data/lib/httpotato/cookie_hash.rb +22 -0
  34. data/lib/httpotato/core_extensions.rb +31 -0
  35. data/lib/httpotato/exceptions.rb +26 -0
  36. data/lib/httpotato/module_inheritable_attributes.rb +34 -0
  37. data/lib/httpotato/net_digest_auth.rb +35 -0
  38. data/lib/httpotato/parser.rb +146 -0
  39. data/lib/httpotato/request.rb +231 -0
  40. data/lib/httpotato/response.rb +79 -0
  41. data/spec/fixtures/delicious.xml +23 -0
  42. data/spec/fixtures/empty.xml +0 -0
  43. data/spec/fixtures/google.html +3 -0
  44. data/spec/fixtures/ssl/generate.sh +29 -0
  45. data/spec/fixtures/ssl/generated/1fe462c2.0 +15 -0
  46. data/spec/fixtures/ssl/generated/bogushost.crt +13 -0
  47. data/spec/fixtures/ssl/generated/ca.crt +15 -0
  48. data/spec/fixtures/ssl/generated/ca.key +15 -0
  49. data/spec/fixtures/ssl/generated/selfsigned.crt +14 -0
  50. data/spec/fixtures/ssl/generated/server.crt +13 -0
  51. data/spec/fixtures/ssl/generated/server.key +15 -0
  52. data/spec/fixtures/ssl/openssl-exts.cnf +9 -0
  53. data/spec/fixtures/twitter.json +1 -0
  54. data/spec/fixtures/twitter.xml +403 -0
  55. data/spec/fixtures/undefined_method_add_node_for_nil.xml +2 -0
  56. data/spec/httpotato/cookie_hash_spec.rb +71 -0
  57. data/spec/httpotato/parser_spec.rb +155 -0
  58. data/spec/httpotato/request_spec.rb +430 -0
  59. data/spec/httpotato/response_spec.rb +188 -0
  60. data/spec/httpotato/ssl_spec.rb +54 -0
  61. data/spec/httpotato_spec.rb +570 -0
  62. data/spec/spec.opts +3 -0
  63. data/spec/spec_helper.rb +20 -0
  64. data/spec/support/ssl_test_helper.rb +25 -0
  65. data/spec/support/ssl_test_server.rb +69 -0
  66. data/spec/support/stub_response.rb +30 -0
  67. data/test.rb +39 -0
  68. data/website/css/common.css +47 -0
  69. data/website/index.html +66 -0
  70. metadata +260 -0
@@ -0,0 +1,3 @@
1
+ --colour
2
+ --format specdoc
3
+ --backtrace
@@ -0,0 +1,20 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'lib', 'httpotato')
2
+ require 'spec/autorun'
3
+ require 'fakeweb'
4
+
5
+ def file_fixture(filename)
6
+ open(File.join(File.dirname(__FILE__), 'fixtures', "#{filename.to_s}")).read
7
+ end
8
+
9
+ Dir[File.expand_path(File.join(File.dirname(__FILE__),'support','**','*.rb'))].each {|f| require f}
10
+
11
+ Spec::Runner.configure do |config|
12
+ config.include HTTPotato::StubResponse
13
+ config.include HTTPotato::SSLTestHelper
14
+ config.before(:suite) do
15
+ FakeWeb.allow_net_connect = false
16
+ end
17
+ config.after(:suite) do
18
+ FakeWeb.allow_net_connect = true
19
+ end
20
+ end
@@ -0,0 +1,25 @@
1
+ module HTTPotato
2
+ module SSLTestHelper
3
+ def ssl_verify_test(mode, ca_basename, server_cert_filename)
4
+ test_server = nil
5
+ begin
6
+ # Start an HTTPS server
7
+ test_server = SSLTestServer.new(
8
+ :rsa_key => File.read(File.expand_path("../../fixtures/ssl/generated/server.key", __FILE__)),
9
+ :cert => File.read(File.expand_path("../../fixtures/ssl/generated/#{server_cert_filename}", __FILE__)))
10
+ test_server.start
11
+
12
+ # Build a request
13
+ if mode
14
+ ca_path = File.expand_path("../../fixtures/ssl/generated/#{ca_basename}", __FILE__)
15
+ raise ArgumentError.new("#{ca_path} does not exist") unless File.exist?(ca_path)
16
+ return HTTPotato.get("https://localhost:#{test_server.port}/", :format => :json, :timeout=>30, mode => ca_path)
17
+ else
18
+ return HTTPotato.get("https://localhost:#{test_server.port}/", :format => :json, :timeout=>30)
19
+ end
20
+ ensure
21
+ test_server.stop if test_server
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,69 @@
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 HTTPotato.
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
+ if @port == 0
26
+ @port = Socket::getnameinfo(@raw_server.getsockname, Socket::NI_NUMERICHOST|Socket::NI_NUMERICSERV)[1].to_i
27
+ end
28
+ @ssl_server = OpenSSL::SSL::SSLServer.new(@raw_server, @ctx)
29
+ @stopping_mutex.synchronize{
30
+ return if @stopping
31
+ @thread = Thread.new{ thread_main }
32
+ }
33
+ nil
34
+ end
35
+
36
+ def stop
37
+ @stopping_mutex.synchronize{
38
+ return if @stopping
39
+ @stopping = true
40
+ }
41
+ @thread.join
42
+ end
43
+
44
+ private
45
+
46
+ def thread_main
47
+ until @stopping_mutex.synchronize{ @stopping }
48
+ (rr,ww,ee) = select([@ssl_server.to_io], nil, nil, 0.1)
49
+ next unless rr && rr.include?(@ssl_server.to_io)
50
+ socket = @ssl_server.accept
51
+ Thread.new{
52
+ header = []
53
+ until (line = socket.readline).rstrip.empty?
54
+ header << line
55
+ end
56
+
57
+ socket.write <<'EOF'.gsub(/\r\n/n, "\n").gsub(/\n/n, "\r\n")
58
+ HTTP/1.1 200 OK
59
+ Connection: close
60
+ Content-Type: application/json; charset=UTF-8
61
+
62
+ {"success":true}
63
+ EOF
64
+ socket.close
65
+ }
66
+ end
67
+ @ssl_server.close
68
+ end
69
+ end
@@ -0,0 +1,30 @@
1
+ module HTTPotato
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
+ response.stub!(:body).and_return(data)
9
+
10
+ http_request = HTTPotato::Request.new(Net::HTTP::Get, 'http://localhost', :format => format)
11
+ http_request.stub!(:perform_actual_request).and_return(response)
12
+
13
+ HTTPotato::Request.should_receive(:new).and_return(http_request)
14
+ end
15
+
16
+ def stub_response(body, code = 200)
17
+ unless defined?(@http) && @http
18
+ @http = Net::HTTP.new('localhost', 80)
19
+ @request.stub!(:http).and_return(@http)
20
+ @request.stub!(:uri).and_return(URI.parse("http://foo.com/foobar"))
21
+ end
22
+
23
+ response = Net::HTTPResponse::CODE_TO_OBJ[code.to_s].new("1.1", code, body)
24
+ response.stub!(:body).and_return(body)
25
+
26
+ @http.stub!(:request).and_return(response)
27
+ response
28
+ end
29
+ end
30
+ end
data/test.rb ADDED
@@ -0,0 +1,39 @@
1
+ require 'rubygems'
2
+ require 'httpotato'
3
+ require 'auth-hmac'
4
+ require 'ruby-prof'
5
+ require 'ruby-debug'
6
+
7
+ class Getter
8
+
9
+ include HTTPotato
10
+
11
+
12
+ format :json
13
+ base_uri "http://athenavcs.democrats.org/"
14
+
15
+ def self.get_campaigns(state)
16
+ get('/campaign', {:query => {:state => state}, :hmac => {:id => 'dnc-platypus', :secret => '64968b89756446d5a6653fbd08354b3b433e9b72'}})
17
+ end
18
+
19
+
20
+ end
21
+
22
+ states = ["AK", "AL", "AR", "AZ", "CA", "CO", "CT", "DC", "DE", "FL", "GA", "HI", "IA", "ID", "IL", "IN", "KS", "KY", "LA", "MA", "MD", "ME", "MI", "MN", "MO", "MS", "MT", "NC", "ND", "NE", "NH", "NJ", "NM", "NV", "NY", "OH", "OK", "OR", "PA", "RI", "SC", "SD", "TN", "TX", "UT", "VA", "VT", "WA", "WI", "WV", "WY"]
23
+
24
+
25
+ RubyProf.start
26
+ 2.times do |i|
27
+
28
+ states.each do |state|
29
+ campaigns = Getter.get_campaigns(state)
30
+ end
31
+
32
+ end
33
+
34
+ result = RubyProf.stop
35
+ printer = RubyProf::CallTreePrinter.new(result)
36
+ file = File.open("/tmp/results", "w+")
37
+ printer.print(file, 0)
38
+ file.close
39
+
@@ -0,0 +1,47 @@
1
+ @media screen, projection {
2
+ /*
3
+ Copyright (c) 2007, Yahoo! Inc. All rights reserved.
4
+ Code licensed under the BSD License:
5
+ http://developer.yahoo.net/yui/license.txt
6
+ version: 2.2.0
7
+ */
8
+ body {font:13px arial,helvetica,clean,sans-serif;*font-size:small;*font:x-small;}table {font-size:inherit;font:100%;}select, input, textarea {font:99% arial,helvetica,clean,sans-serif;}pre, code {font:115% monospace;*font-size:100%;}body * {line-height:1.22em;}
9
+ body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,textarea,p,blockquote,th,td{margin:0;padding:0;}table{border-collapse:collapse;border-spacing:0;}fieldset,img{border:0;}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal;}/*ol,ul {list-style:none;}*/caption,th {text-align:left;}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal;}q:before,q:after{content:'';}abbr,acronym {border:0;}
10
+ /* end of yahoo reset and fonts */
11
+
12
+ body {color:#333; background:#4b1a1a; line-height:1.3;}
13
+ p {margin:0 0 20px;}
14
+ a {color:#4b1a1a;}
15
+ a:hover {text-decoration:none;}
16
+ strong {font-weight:bold;}
17
+ em {font-style:italics;}
18
+ h1,h2,h3,h4,h5,h6 {font-weight:bold;}
19
+ h1 {font-size:197%; margin:30px 0; color:#4b1a1a;}
20
+ h2 {font-size:174%; margin:20px 0; color:#b8111a;}
21
+ h3 {font-size:152%; margin:10px 0;}
22
+ h4 {font-size:129%; margin:10px 0;}
23
+ pre {background:#eee; margin:0 0 20px; padding:20px; border:1px solid #ccc; font-size:100%; overflow:auto;}
24
+ code {font-size:100%; margin:0; padding:0;}
25
+ ul, ol {margin:10px 0 10px 25px;}
26
+ ol li {margin:0 0 10px;}
27
+
28
+
29
+
30
+
31
+
32
+ div#wrapper {background:#fff; width:560px; margin:0 auto; padding:20px; border:10px solid #bc8c46; border-width:0 10px;}
33
+ div#header {position:relative; border-bottom:1px dotted; margin:0 0 10px; padding:0 0 10px;}
34
+ div#header p {margin:0; padding:0;}
35
+ div#header h1 {margin:0; padding:0;}
36
+ ul#nav {position:absolute; top:0; right:0; list-style:none; margin:0; padding:0;}
37
+ ul#nav li {display:inline; padding:0 0 0 5px;}
38
+ ul#nav li a {}
39
+ div#content {}
40
+ div#footer {margin:40px 0 0; border-top:1px dotted; padding:10px 0 0;}
41
+
42
+
43
+
44
+
45
+
46
+
47
+ }
@@ -0,0 +1,66 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
2
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
5
+ <title>HTTPotato -- Forked from HTTParty</title>
6
+ <link rel="stylesheet" href="css/common.css" type="text/css" />
7
+ </head>
8
+ <body>
9
+
10
+ <div id="wrapper">
11
+ <div id="header">
12
+ <h1>HTTPotato</h1>
13
+ <p>The Internet is a series of tubers!</p>
14
+
15
+ <ul id="nav">
16
+ <li><a href="rdoc/">Docs</a></li>
17
+ <li><a href="http://github.com/dnclabs/httpotato">Github</a></li>
18
+ </ul>
19
+ </div>
20
+
21
+ <div id="content">
22
+ <h2>Install</h2>
23
+ <pre><code>$ sudo gem install httpotato</code></pre>
24
+
25
+ <h2>Some Quick Examples</h2>
26
+
27
+ <p>The following is a simple example of wrapping Twitter's API for posting updates.</p>
28
+
29
+ <pre><code>class Twitter
30
+ include HTTPotato
31
+ base_uri 'twitter.com'
32
+ basic_auth 'username', 'password'
33
+ end
34
+
35
+ Twitter.post('/statuses/update.json', :query => {:status => "HTTPotato is tasty and fast!"})</code></pre>
36
+
37
+ <p>That is really it! The object returned is a ruby hash that is decoded from Twitter's json response. JSON parsing is used because of the .json extension in the path of the request. You can also explicitly set a format (see the examples).</p>
38
+ <p>Unlike HTTParty, HTTPotato uses the JSON gem's fast parsing to keep things peppy. It's a drop-in replacement for HTTParty and depends on the json gem.</p>
39
+
40
+ <p>That works and all but what if you don't want to embed your username and password in the class? Below is an example to fix that:</p>
41
+
42
+ <pre><code>class Twitter
43
+ include HTTPotato
44
+ base_uri 'twitter.com'
45
+
46
+ def initialize(u, p)
47
+ @auth = {:username => u, :password => p}
48
+ end
49
+
50
+ def post(text)
51
+ options = { :query => {:status => text}, :basic_auth => @auth }
52
+ self.class.post('/statuses/update.json', options)
53
+ end
54
+ end
55
+
56
+ Twitter.new('username', 'password').post("It's an HTTPotato and everyone is invited!")</code></pre>
57
+
58
+ <p><strong>More Examples:</strong> There are <a href="http://github.com/dnclabs/httpotato/tree/master/examples/">several examples in the gem itself</a>.</p>
59
+
60
+
61
+ </div>
62
+
63
+ </div>
64
+
65
+ </body>
66
+ </html>
metadata ADDED
@@ -0,0 +1,260 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: httpotato
3
+ version: !ruby/object:Gem::Version
4
+ hash: 19
5
+ prerelease: false
6
+ segments:
7
+ - 1
8
+ - 0
9
+ - 2
10
+ version: 1.0.2
11
+ platform: ruby
12
+ authors:
13
+ - Wes Morgan
14
+ - Adrian Cushman
15
+ - Chris Gill
16
+ autorequire:
17
+ bindir: bin
18
+ cert_chain: []
19
+
20
+ date: 2010-11-01 00:00:00 -04:00
21
+ default_executable: httpotato
22
+ dependencies:
23
+ - !ruby/object:Gem::Dependency
24
+ name: crack
25
+ prerelease: false
26
+ requirement: &id001 !ruby/object:Gem::Requirement
27
+ none: false
28
+ requirements:
29
+ - - "="
30
+ - !ruby/object:Gem::Version
31
+ hash: 11
32
+ segments:
33
+ - 0
34
+ - 1
35
+ - 8
36
+ version: 0.1.8
37
+ type: :runtime
38
+ version_requirements: *id001
39
+ - !ruby/object:Gem::Dependency
40
+ name: json
41
+ prerelease: false
42
+ requirement: &id002 !ruby/object:Gem::Requirement
43
+ none: false
44
+ requirements:
45
+ - - "="
46
+ - !ruby/object:Gem::Version
47
+ hash: 11
48
+ segments:
49
+ - 1
50
+ - 4
51
+ - 6
52
+ version: 1.4.6
53
+ type: :runtime
54
+ version_requirements: *id002
55
+ - !ruby/object:Gem::Dependency
56
+ name: activesupport
57
+ prerelease: false
58
+ requirement: &id003 !ruby/object:Gem::Requirement
59
+ none: false
60
+ requirements:
61
+ - - ~>
62
+ - !ruby/object:Gem::Version
63
+ hash: 5
64
+ segments:
65
+ - 2
66
+ - 3
67
+ version: "2.3"
68
+ type: :development
69
+ version_requirements: *id003
70
+ - !ruby/object:Gem::Dependency
71
+ name: cucumber
72
+ prerelease: false
73
+ requirement: &id004 !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ~>
77
+ - !ruby/object:Gem::Version
78
+ hash: 5
79
+ segments:
80
+ - 0
81
+ - 7
82
+ version: "0.7"
83
+ type: :development
84
+ version_requirements: *id004
85
+ - !ruby/object:Gem::Dependency
86
+ name: fakeweb
87
+ prerelease: false
88
+ requirement: &id005 !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ hash: 11
94
+ segments:
95
+ - 1
96
+ - 2
97
+ version: "1.2"
98
+ type: :development
99
+ version_requirements: *id005
100
+ - !ruby/object:Gem::Dependency
101
+ name: mongrel
102
+ prerelease: false
103
+ requirement: &id006 !ruby/object:Gem::Requirement
104
+ none: false
105
+ requirements:
106
+ - - ~>
107
+ - !ruby/object:Gem::Version
108
+ hash: 13
109
+ segments:
110
+ - 1
111
+ - 1
112
+ version: "1.1"
113
+ type: :development
114
+ version_requirements: *id006
115
+ - !ruby/object:Gem::Dependency
116
+ name: rspec
117
+ prerelease: false
118
+ requirement: &id007 !ruby/object:Gem::Requirement
119
+ none: false
120
+ requirements:
121
+ - - ~>
122
+ - !ruby/object:Gem::Version
123
+ hash: 9
124
+ segments:
125
+ - 1
126
+ - 3
127
+ version: "1.3"
128
+ type: :development
129
+ version_requirements: *id007
130
+ description: Makes http fun & JSON parsing fast! Also, makes consuming restful web services dead easy. Forked from HTTParty.
131
+ email: innovationlab@dnc.org
132
+ executables:
133
+ - httpotato
134
+ extensions: []
135
+
136
+ extra_rdoc_files:
137
+ - README.rdoc
138
+ files:
139
+ - .gitignore
140
+ - History
141
+ - MIT-LICENSE
142
+ - Manifest
143
+ - README.rdoc
144
+ - Rakefile
145
+ - VERSION
146
+ - bin/httpotato
147
+ - cucumber.yml
148
+ - examples/aaws.rb
149
+ - examples/basic.rb
150
+ - examples/custom_parsers.rb
151
+ - examples/delicious.rb
152
+ - examples/google.rb
153
+ - examples/rubyurl.rb
154
+ - examples/twitter.rb
155
+ - examples/whoismyrep.rb
156
+ - features/basic_authentication.feature
157
+ - features/command_line.feature
158
+ - features/deals_with_http_error_codes.feature
159
+ - features/digest_authentication.feature
160
+ - features/handles_compressed_responses.feature
161
+ - features/handles_multiple_formats.feature
162
+ - features/steps/env.rb
163
+ - features/steps/httpotato_response_steps.rb
164
+ - features/steps/httpotato_steps.rb
165
+ - features/steps/mongrel_helper.rb
166
+ - features/steps/remote_service_steps.rb
167
+ - features/supports_redirection.feature
168
+ - features/supports_timeout_option.feature
169
+ - httpotato.gemspec
170
+ - lib/httpotato.rb
171
+ - lib/httpotato/cookie_hash.rb
172
+ - lib/httpotato/core_extensions.rb
173
+ - lib/httpotato/exceptions.rb
174
+ - lib/httpotato/module_inheritable_attributes.rb
175
+ - lib/httpotato/net_digest_auth.rb
176
+ - lib/httpotato/parser.rb
177
+ - lib/httpotato/request.rb
178
+ - lib/httpotato/response.rb
179
+ - spec/fixtures/delicious.xml
180
+ - spec/fixtures/empty.xml
181
+ - spec/fixtures/google.html
182
+ - spec/fixtures/ssl/generate.sh
183
+ - spec/fixtures/ssl/generated/1fe462c2.0
184
+ - spec/fixtures/ssl/generated/bogushost.crt
185
+ - spec/fixtures/ssl/generated/ca.crt
186
+ - spec/fixtures/ssl/generated/ca.key
187
+ - spec/fixtures/ssl/generated/selfsigned.crt
188
+ - spec/fixtures/ssl/generated/server.crt
189
+ - spec/fixtures/ssl/generated/server.key
190
+ - spec/fixtures/ssl/openssl-exts.cnf
191
+ - spec/fixtures/twitter.json
192
+ - spec/fixtures/twitter.xml
193
+ - spec/fixtures/undefined_method_add_node_for_nil.xml
194
+ - spec/httpotato/cookie_hash_spec.rb
195
+ - spec/httpotato/parser_spec.rb
196
+ - spec/httpotato/request_spec.rb
197
+ - spec/httpotato/response_spec.rb
198
+ - spec/httpotato/ssl_spec.rb
199
+ - spec/httpotato_spec.rb
200
+ - spec/spec.opts
201
+ - spec/spec_helper.rb
202
+ - spec/support/ssl_test_helper.rb
203
+ - spec/support/ssl_test_server.rb
204
+ - spec/support/stub_response.rb
205
+ - test.rb
206
+ - website/css/common.css
207
+ - website/index.html
208
+ has_rdoc: true
209
+ homepage: http://github.com/dnclabs/httpotato/
210
+ licenses: []
211
+
212
+ post_install_message: Winners don't use crack.
213
+ rdoc_options:
214
+ - --charset=UTF-8
215
+ require_paths:
216
+ - lib
217
+ required_ruby_version: !ruby/object:Gem::Requirement
218
+ none: false
219
+ requirements:
220
+ - - ">="
221
+ - !ruby/object:Gem::Version
222
+ hash: 3
223
+ segments:
224
+ - 0
225
+ version: "0"
226
+ required_rubygems_version: !ruby/object:Gem::Requirement
227
+ none: false
228
+ requirements:
229
+ - - ">="
230
+ - !ruby/object:Gem::Version
231
+ hash: 3
232
+ segments:
233
+ - 0
234
+ version: "0"
235
+ requirements: []
236
+
237
+ rubyforge_project: httpotato
238
+ rubygems_version: 1.3.7
239
+ signing_key:
240
+ specification_version: 3
241
+ summary: Makes http fun & JSON parsing fast! Also, makes consuming restful web services dead easy.
242
+ test_files:
243
+ - spec/httpotato/cookie_hash_spec.rb
244
+ - spec/httpotato/parser_spec.rb
245
+ - spec/httpotato/request_spec.rb
246
+ - spec/httpotato/response_spec.rb
247
+ - spec/httpotato/ssl_spec.rb
248
+ - spec/httpotato_spec.rb
249
+ - spec/spec_helper.rb
250
+ - spec/support/ssl_test_helper.rb
251
+ - spec/support/ssl_test_server.rb
252
+ - spec/support/stub_response.rb
253
+ - examples/aaws.rb
254
+ - examples/basic.rb
255
+ - examples/custom_parsers.rb
256
+ - examples/delicious.rb
257
+ - examples/google.rb
258
+ - examples/rubyurl.rb
259
+ - examples/twitter.rb
260
+ - examples/whoismyrep.rb