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.
- data/.gitignore +7 -0
- data/History +216 -0
- data/MIT-LICENSE +20 -0
- data/Manifest +47 -0
- data/README.rdoc +52 -0
- data/Rakefile +90 -0
- data/VERSION +1 -0
- data/bin/httpotato +108 -0
- data/cucumber.yml +1 -0
- data/examples/aaws.rb +32 -0
- data/examples/basic.rb +11 -0
- data/examples/custom_parsers.rb +67 -0
- data/examples/delicious.rb +37 -0
- data/examples/google.rb +16 -0
- data/examples/rubyurl.rb +14 -0
- data/examples/twitter.rb +31 -0
- data/examples/whoismyrep.rb +10 -0
- data/features/basic_authentication.feature +20 -0
- data/features/command_line.feature +7 -0
- data/features/deals_with_http_error_codes.feature +26 -0
- data/features/digest_authentication.feature +20 -0
- data/features/handles_compressed_responses.feature +19 -0
- data/features/handles_multiple_formats.feature +34 -0
- data/features/steps/env.rb +23 -0
- data/features/steps/httpotato_response_steps.rb +26 -0
- data/features/steps/httpotato_steps.rb +27 -0
- data/features/steps/mongrel_helper.rb +94 -0
- data/features/steps/remote_service_steps.rb +69 -0
- data/features/supports_redirection.feature +22 -0
- data/features/supports_timeout_option.feature +13 -0
- data/httpotato.gemspec +150 -0
- data/lib/httpotato.rb +371 -0
- data/lib/httpotato/cookie_hash.rb +22 -0
- data/lib/httpotato/core_extensions.rb +31 -0
- data/lib/httpotato/exceptions.rb +26 -0
- data/lib/httpotato/module_inheritable_attributes.rb +34 -0
- data/lib/httpotato/net_digest_auth.rb +35 -0
- data/lib/httpotato/parser.rb +146 -0
- data/lib/httpotato/request.rb +231 -0
- data/lib/httpotato/response.rb +79 -0
- data/spec/fixtures/delicious.xml +23 -0
- data/spec/fixtures/empty.xml +0 -0
- data/spec/fixtures/google.html +3 -0
- data/spec/fixtures/ssl/generate.sh +29 -0
- data/spec/fixtures/ssl/generated/1fe462c2.0 +15 -0
- data/spec/fixtures/ssl/generated/bogushost.crt +13 -0
- data/spec/fixtures/ssl/generated/ca.crt +15 -0
- data/spec/fixtures/ssl/generated/ca.key +15 -0
- data/spec/fixtures/ssl/generated/selfsigned.crt +14 -0
- data/spec/fixtures/ssl/generated/server.crt +13 -0
- data/spec/fixtures/ssl/generated/server.key +15 -0
- data/spec/fixtures/ssl/openssl-exts.cnf +9 -0
- data/spec/fixtures/twitter.json +1 -0
- data/spec/fixtures/twitter.xml +403 -0
- data/spec/fixtures/undefined_method_add_node_for_nil.xml +2 -0
- data/spec/httpotato/cookie_hash_spec.rb +71 -0
- data/spec/httpotato/parser_spec.rb +155 -0
- data/spec/httpotato/request_spec.rb +430 -0
- data/spec/httpotato/response_spec.rb +188 -0
- data/spec/httpotato/ssl_spec.rb +54 -0
- data/spec/httpotato_spec.rb +570 -0
- data/spec/spec.opts +3 -0
- data/spec/spec_helper.rb +20 -0
- data/spec/support/ssl_test_helper.rb +25 -0
- data/spec/support/ssl_test_server.rb +69 -0
- data/spec/support/stub_response.rb +30 -0
- data/test.rb +39 -0
- data/website/css/common.css +47 -0
- data/website/index.html +66 -0
- metadata +260 -0
data/spec/spec.opts
ADDED
data/spec/spec_helper.rb
ADDED
@@ -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
|
+
}
|
data/website/index.html
ADDED
@@ -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
|