http 0.3.0 → 0.4.0

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

Potentially problematic release.


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

data/CHANGES.md CHANGED
@@ -1,3 +1,10 @@
1
+ 0.4.0
2
+ -----
3
+ * Fix bug accessing https URLs
4
+ * Fix several instances of broken redirect handling
5
+ * Add default user agent
6
+ * Many additional minor bugfixes
7
+
1
8
  0.3.0
2
9
  -----
3
10
  * New implementation based on tmm1's http_parser.rb instead of Net::HTTP
data/README.md CHANGED
@@ -25,8 +25,15 @@ Http.post "http://example.com/resource", :form => {:foo => "42"}
25
25
  ```
26
26
 
27
27
  Want to POST with a specific body, JSON for instance?
28
+
29
+ ```ruby
30
+ Http.post "http://example.com/resource", :body => JSON.dump(:foo => '42')
31
+ ```
32
+
33
+ Or have it serialize JSON for you:
34
+
28
35
  ```ruby
29
- Http.post "http://example.com/resource", :body => JSON.dump(:foo => "42")
36
+ Http.post "http://example.com/resource", :json => {:foo => '42'}
30
37
  ```
31
38
 
32
39
  It's easy!
data/http.gemspec CHANGED
@@ -13,7 +13,7 @@ Gem::Specification.new do |gem|
13
13
  gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
14
14
  gem.name = "http"
15
15
  gem.require_paths = ["lib"]
16
- gem.version = Http::VERSION
16
+ gem.version = HTTP::VERSION
17
17
 
18
18
  gem.add_runtime_dependency 'http_parser.rb'
19
19
  gem.add_runtime_dependency 'certified'
data/lib/http.rb CHANGED
@@ -8,12 +8,13 @@ require 'http/client'
8
8
  require 'http/mime_type'
9
9
  require 'http/options'
10
10
  require 'http/request'
11
+ require 'http/request_stream'
11
12
  require 'http/response'
12
13
  require 'http/response_parser'
13
14
  require 'http/uri_backport' if RUBY_VERSION < "1.9.0"
14
15
 
15
16
  # HTTP should be easy
16
- module Http
17
+ module HTTP
17
18
  extend Chainable
18
19
 
19
20
  # The method given was not understood
@@ -38,3 +39,5 @@ module Http
38
39
  end
39
40
  end
40
41
  end
42
+
43
+ Http = HTTP unless defined?(Http)
@@ -1,4 +1,4 @@
1
- module Http
1
+ module HTTP
2
2
  module Chainable
3
3
  # Request a get sans response body
4
4
  def head(uri, options = {})
@@ -54,15 +54,15 @@ module Http
54
54
  def on(event, &block)
55
55
  branch default_options.with_callback(event, block)
56
56
  end
57
-
57
+
58
58
  # Make a request through an HTTP proxy
59
59
  def via(*proxy)
60
- proxy_hash = {}
60
+ proxy_hash = {}
61
61
  proxy_hash[:proxy_address] = proxy[0] if proxy[0].is_a? String
62
62
  proxy_hash[:proxy_port] = proxy[1] if proxy[1].is_a? Integer
63
63
  proxy_hash[:proxy_username]= proxy[2] if proxy[2].is_a? String
64
64
  proxy_hash[:proxy_password]= proxy[3] if proxy[3].is_a? String
65
-
65
+
66
66
  if proxy_hash.keys.size >=2
67
67
  branch default_options.with_proxy(proxy_hash)
68
68
  else
data/lib/http/client.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  require 'uri'
2
2
 
3
- module Http
3
+ module HTTP
4
4
  # Clients make requests and receive responses
5
5
  class Client
6
6
  include Chainable
@@ -25,17 +25,23 @@ module Http
25
25
  # Make an HTTP request
26
26
  def request(method, uri, options = {})
27
27
  opts = @default_options.merge(options)
28
+ host = URI.parse(uri).host
29
+ opts.headers["Host"] = host
28
30
  headers = opts.headers
29
31
  proxy = opts.proxy
30
32
 
31
33
  method_body = body(opts, headers)
32
- puts method_body
33
34
  request = Request.new method, uri, headers, proxy, method_body
34
35
 
35
36
  if opts.follow
36
37
  code = 302
37
38
  while code == 302 or code == 301
38
- puts uri
39
+ # if the uri isn't fully formed complete it
40
+ if not uri.match /\./
41
+ uri = "http://#{host}#{uri}"
42
+ end
43
+ host = URI.parse(uri).host
44
+ opts.headers["Host"] = host
39
45
  method_body = body(opts, headers)
40
46
  request = Request.new method, uri, headers, proxy, method_body
41
47
  response = perform request, opts
@@ -57,7 +63,12 @@ module Http
57
63
  socket = options[:socket_class].open(uri.host, uri.port) # TODO: proxy support
58
64
 
59
65
  if uri.is_a?(URI::HTTPS)
60
- socket = options[:ssl_socket_class].open(socket, options[:ssl_context])
66
+ if options[:ssl_context] == nil
67
+ context = OpenSSL::SSL::SSLContext.new
68
+ else
69
+ context = options[:ssl_context]
70
+ end
71
+ socket = options[:ssl_socket_class].new(socket, context)
61
72
  socket.connect
62
73
  end
63
74
 
@@ -62,21 +62,21 @@ module Curl
62
62
  perform
63
63
  end
64
64
  end
65
-
65
+
66
66
  class Multi
67
67
  def initialize
68
68
  @clients = []
69
69
  @done = false
70
70
  end
71
-
71
+
72
72
  def add(client)
73
73
  @clients << client
74
74
  end
75
-
76
-
75
+
76
+
77
77
  def perform
78
78
  return if @done
79
-
79
+
80
80
  @clients.map do |client|
81
81
  Thread.new { client.perform }
82
82
  end.each(&:join)
@@ -84,4 +84,4 @@ module Curl
84
84
  @done = true
85
85
  end
86
86
  end
87
- end
87
+ end
@@ -1,4 +1,4 @@
1
- module Http
1
+ module HTTP
2
2
  # Yes, Http bundles its own MIME type library. Maybe it should be spun off
3
3
  # as a separate gem or something.
4
4
  class MimeType
@@ -16,4 +16,4 @@ json.emit_with do |obj|
16
16
  else
17
17
  obj
18
18
  end
19
- end
19
+ end
data/lib/http/options.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  require 'socket'
2
2
  require 'openssl'
3
3
 
4
- module Http
4
+ module HTTP
5
5
  class Options
6
6
 
7
7
  # How to format the response [:object, :body, :parse_body]
@@ -57,6 +57,8 @@ module Http
57
57
  @socket_class = options[:socket_class] || self.class.default_socket_class
58
58
  @ssl_socket_class = options[:ssl_socket_class] || self.class.default_ssl_socket_class
59
59
  @ssl_context = options[:ssl_context]
60
+
61
+ @headers["User-Agent"] ||= "RubyHttpGem/#{Http::VERSION}"
60
62
  end
61
63
 
62
64
  def with_response(response)
data/lib/http/request.rb CHANGED
@@ -1,4 +1,4 @@
1
- module Http
1
+ module HTTP
2
2
  class Request
3
3
  # Method is given as a lowercase symbol e.g. :get, :post
4
4
  attr_reader :method
@@ -33,38 +33,9 @@ module Http
33
33
 
34
34
  # Stream the request to a socket
35
35
  def stream(socket)
36
- request_header = "#{method.to_s.upcase} #{uri.path} HTTP/#{version}#{CRLF}"
37
- @headers.each do |field, value|
38
- request_header << "#{field}: #{value}#{CRLF}"
39
- end
40
-
41
- case body
42
- when NilClass
43
- socket << request_header << CRLF
44
- return
45
- when String
46
- request_header << "Content-Length: #{body.length}#{CRLF}" unless @headers['Content-Length']
47
- request_header << CRLF
48
-
49
- socket << request_header
50
- socket << body.to_s
51
- when Enumerable
52
- if encoding = @headers['Transfer-Encoding']
53
- raise ArgumentError, "invalid transfer encoding" unless encoding == "chunked"
54
- request_header << CRLF
55
- else
56
- request_header << "Transfer-Encoding: chunked#{CRLF * 2}"
57
- end
58
-
59
- socket << request_header
60
- body.each do |chunk|
61
- socket << chunk.bytesize.to_s(16) << CRLF
62
- socket << chunk
63
- end
64
-
65
- socket << "0" << CRLF * 2
66
- else raise TypeError, "invalid body type: #{body.class}"
67
- end
36
+ request_header = "#{method.to_s.upcase} #{uri.path} HTTP/#{version}"
37
+ rs = Http::RequestStream.new socket, body, @headers, request_header
38
+ rs.stream
68
39
  end
69
40
  end
70
41
  end
@@ -0,0 +1,73 @@
1
+ module HTTP
2
+ class RequestStream
3
+ def initialize(socket, body, headers, headerstart)
4
+ @body = body
5
+ raise ArgumentError, "body of wrong type" unless valid_body_type
6
+ @socket = socket
7
+ @headers = headers
8
+ @request_header = [headerstart]
9
+ end
10
+
11
+ def valid_body_type
12
+ valid_types= [String, NilClass, Enumerable]
13
+ checks = valid_types.map {|type| @body.is_a? type}
14
+ checks.any?
15
+ end
16
+
17
+ #Adds headers to the request header from the headers array
18
+ def add_headers
19
+ @headers.each do |field, value|
20
+ @request_header << "#{field}: #{value}"
21
+ end
22
+ end
23
+
24
+ # Stream the request to a socket
25
+ def stream
26
+ self.send_request_header
27
+ self.send_request_body
28
+ end
29
+
30
+ # Adds the headers to the header array for the given request body we are working
31
+ # with
32
+ def add_body_type_headers
33
+ if @body.is_a? String and not @headers['Content-Length']
34
+ @request_header << "Content-Length: #{@body.length}"
35
+ elsif @body.is_a? Enumerable
36
+ if encoding = @headers['Transfer-Encoding'] and not encoding == "chunked"
37
+ raise ArgumentError, "invalid transfer encoding"
38
+ else
39
+ @request_header << "Transfer-Encoding: chunked"
40
+ end
41
+ end
42
+ end
43
+
44
+ # Joins the headers specified in the request into a correctly formatted
45
+ # http request header string
46
+ def join_headers
47
+ # join the headers array with crlfs, stick two on the end because
48
+ # that ends the request header
49
+ @request_header.join(CRLF) + (CRLF)*2
50
+ end
51
+
52
+ def send_request_header
53
+ self.add_headers
54
+ self.add_body_type_headers
55
+ header = self.join_headers
56
+
57
+ @socket << header
58
+ end
59
+
60
+ def send_request_body
61
+ if @body.is_a? String
62
+ @socket << @body
63
+ elsif @body.is_a? Enumerable
64
+ @body.each do |chunk|
65
+ @socket << chunk.bytesize.to_s(16) << CRLF
66
+ @socket << chunk
67
+ end
68
+
69
+ @socket << "0" << CRLF * 2
70
+ end
71
+ end
72
+ end
73
+ end
data/lib/http/response.rb CHANGED
@@ -1,4 +1,4 @@
1
- module Http
1
+ module HTTP
2
2
  class Response
3
3
  STATUS_CODES = {
4
4
  100 => 'Continue',
@@ -1,4 +1,4 @@
1
- module Http
1
+ module HTTP
2
2
  class Response
3
3
  class Parser
4
4
  attr_reader :headers
data/lib/http/version.rb CHANGED
@@ -1,3 +1,3 @@
1
- module Http
2
- VERSION = "0.3.0"
1
+ module HTTP
2
+ VERSION = "0.4.0"
3
3
  end
@@ -19,14 +19,14 @@ describe Curl do
19
19
  end
20
20
  end
21
21
  end
22
-
22
+
23
23
  describe Curl::Multi do
24
24
  it "gets resources" do
25
25
  requests = [test_endpoint]
26
26
  responses = []
27
-
27
+
28
28
  multi = Curl::Multi.new
29
-
29
+
30
30
  requests.each do |url|
31
31
  response = Curl::Easy.new url, :get
32
32
  multi.add response
@@ -37,4 +37,4 @@ describe Curl do
37
37
  responses.first.body_str.should match(/<!doctype html>/)
38
38
  end
39
39
  end
40
- end
40
+ end
@@ -2,16 +2,17 @@ require 'spec_helper'
2
2
 
3
3
  describe Http::Options, "headers" do
4
4
 
5
- let(:opts){ Http::Options.new }
5
+ let(:opts) { Http::Options.new }
6
+ let(:user_agent) { "RubyHttpGem/#{Http::VERSION}" }
6
7
 
7
- it 'defaults to {}' do
8
- opts.headers.should eq({})
8
+ it 'defaults to just the user agent' do
9
+ opts.headers.should eq("User-Agent" => user_agent)
9
10
  end
10
11
 
11
12
  it 'may be specified with with_headers' do
12
13
  opts2 = opts.with_headers("accept" => "json")
13
- opts.headers.should eq({})
14
- opts2.headers.should eq("accept" => "json")
14
+ opts.headers.should eq("User-Agent" => user_agent)
15
+ opts2.headers.should eq("accept" => "json", "User-Agent" => user_agent)
15
16
  end
16
17
 
17
18
  it 'accepts any object that respond to :to_hash' do
@@ -2,7 +2,8 @@ require 'spec_helper'
2
2
 
3
3
  describe Http::Options, "merge" do
4
4
 
5
- let(:opts){ Http::Options.new }
5
+ let(:opts) { Http::Options.new }
6
+ let(:user_agent) { "RubyHttpGem/#{Http::VERSION}" }
6
7
 
7
8
  it 'supports a Hash' do
8
9
  old_response = opts.response
@@ -34,7 +35,7 @@ describe Http::Options, "merge" do
34
35
  :response => :parsed_body,
35
36
  :form => {:bar => 'bar'},
36
37
  :body => "body-bar",
37
- :headers => {:accept => "xml", :foo => "foo", :bar => 'bar'},
38
+ :headers => {:accept => "xml", :foo => "foo", :bar => 'bar', "User-Agent" => user_agent},
38
39
  :proxy => {:proxy_address => "127.0.0.1", :proxy_port => 8080},
39
40
  :callbacks => {:request => ["common"], :response => ["foo", "bar"]},
40
41
  :follow => nil
@@ -1,6 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Http::Options, "new" do
4
+ let(:user_agent) { "RubyHttpGem/#{Http::VERSION}" }
4
5
 
5
6
  it 'supports a Options instance' do
6
7
  opts = Http::Options.new
@@ -8,7 +9,6 @@ describe Http::Options, "new" do
8
9
  end
9
10
 
10
11
  context 'with a Hash' do
11
-
12
12
  it 'coerces :response correctly' do
13
13
  opts = Http::Options.new(:response => :object)
14
14
  opts.response.should eq(:object)
@@ -16,9 +16,9 @@ describe Http::Options, "new" do
16
16
 
17
17
  it 'coerces :headers correctly' do
18
18
  opts = Http::Options.new(:headers => {:accept => "json"})
19
- opts.headers.should eq(:accept => "json")
19
+ opts.headers.should eq(:accept => "json", "User-Agent" => user_agent)
20
20
  end
21
-
21
+
22
22
  it 'coerces :proxy correctly' do
23
23
  opts = Http::Options.new(:proxy => {:proxy_address => "127.0.0.1", :proxy_port => 8080})
24
24
  opts.proxy.should eq(:proxy_address => "127.0.0.1", :proxy_port => 8080)
@@ -18,4 +18,4 @@ describe Http::Options, "proxy" do
18
18
  opts2 = opts.with_proxy(:proxy_address => "127.0.0.1", :proxy_port => 8080, :proxy_username => "username", :proxy_password => "password")
19
19
  opts2.proxy.should eq(:proxy_address => "127.0.0.1", :proxy_port => 8080, :proxy_username => "username", :proxy_password => "password")
20
20
  end
21
- end
21
+ end
@@ -15,7 +15,7 @@ describe Http::Options, "response" do
15
15
  end
16
16
 
17
17
  it 'recognizes invalid responses' do
18
- lambda{
18
+ lambda{
19
19
  opts.with_response(:not_a_valid_response)
20
20
  }.should raise_error(ArgumentError, /not_a_valid_response/)
21
21
  end
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+
3
+ describe Http::RequestStream do
4
+ describe "#initalize" do
5
+ def construct(body)
6
+ Http::RequestStream.new(nil, body, [], "")
7
+ end
8
+
9
+ it "doesn't throw on a nil body" do
10
+ expect {construct []}.to_not raise_error(ArgumentError)
11
+ end
12
+
13
+ it "doesn't throw on a String body" do
14
+ expect {construct "string body"}.to_not raise_error(ArgumentError)
15
+ end
16
+
17
+ it "doesn't throw on an Enumerable body" do
18
+ expect {construct ["bees", "cows"]}.to_not raise_error(ArgumentError)
19
+ end
20
+
21
+ it "does throw on a body that isn't string, enumerable or nil" do
22
+ expect {construct true}.to raise_error(ArgumentError)
23
+
24
+ end
25
+ end
26
+ end
data/spec/http_spec.rb CHANGED
@@ -11,6 +11,19 @@ describe Http do
11
11
  response.should match(/<!doctype html>/)
12
12
  end
13
13
 
14
+ it "should be easy to get a https resource" do
15
+ response = Http.with_headers(:accept => 'application/json').get "https://api.github.com/users/samphippen"
16
+ response["type"].should == "User"
17
+ end
18
+
19
+ it "can get some real world sites, following redirects if necessary" do
20
+ sites = ["http://github.com/", "http://xkcd.com/", "http://www.spotify.com/"]
21
+ sites.each do |site|
22
+ resp = Http.with_response(:object).with_follow(true).get site
23
+ resp.status.should == 200
24
+ end
25
+ end
26
+
14
27
  context "with_response" do
15
28
  it 'allows specifying :object' do
16
29
  res = Http.with_response(:object).get test_endpoint
data/spec/spec_helper.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  require 'http'
2
2
  require 'support/example_server'
3
- require 'support/proxy_server'
3
+ require 'support/proxy_server'
@@ -1,17 +1,17 @@
1
1
  require 'webrick/httpproxy'
2
-
2
+
3
3
  ProxyServer = WEBrick::HTTPProxyServer.new(:Port => 8080, :AccessLog => [])
4
-
4
+
5
5
  t = Thread.new { ProxyServer.start }
6
6
  trap("INT") { ProxyServer.shutdown; exit }
7
7
 
8
- AuthenticatedProxyServer = WEBrick::HTTPProxyServer.new(:Port => 8081,
8
+ AuthenticatedProxyServer = WEBrick::HTTPProxyServer.new(:Port => 8081,
9
9
  :ProxyAuthProc => Proc.new do | req, res |
10
10
  WEBrick::HTTPAuth.proxy_basic_auth(req, res, 'proxy') do | user, pass |
11
11
  user == 'username' and pass == 'password'
12
12
  end
13
13
  end)
14
-
14
+
15
15
 
16
16
  t = Thread.new { AuthenticatedProxyServer.start }
17
17
  trap("INT") { AuthenticatedProxyServer.shutdown; exit }
metadata CHANGED
@@ -1,79 +1,102 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: http
3
- version: !ruby/object:Gem::Version
4
- version: 0.3.0
3
+ version: !ruby/object:Gem::Version
4
+ hash: 15
5
5
  prerelease:
6
+ segments:
7
+ - 0
8
+ - 4
9
+ - 0
10
+ version: 0.4.0
6
11
  platform: ruby
7
- authors:
12
+ authors:
8
13
  - Tony Arcieri
9
14
  autorequire:
10
15
  bindir: bin
11
16
  cert_chain: []
12
- date: 2012-09-01 00:00:00.000000000 Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
17
+
18
+ date: 2012-10-12 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
15
21
  name: http_parser.rb
16
- requirement: &70356765427900 !ruby/object:Gem::Requirement
22
+ version_requirements: &id001 !ruby/object:Gem::Requirement
17
23
  none: false
18
- requirements:
19
- - - ! '>='
20
- - !ruby/object:Gem::Version
21
- version: '0'
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ hash: 3
28
+ segments:
29
+ - 0
30
+ version: "0"
22
31
  type: :runtime
32
+ requirement: *id001
23
33
  prerelease: false
24
- version_requirements: *70356765427900
25
- - !ruby/object:Gem::Dependency
34
+ - !ruby/object:Gem::Dependency
26
35
  name: certified
27
- requirement: &70356765427240 !ruby/object:Gem::Requirement
36
+ version_requirements: &id002 !ruby/object:Gem::Requirement
28
37
  none: false
29
- requirements:
30
- - - ! '>='
31
- - !ruby/object:Gem::Version
32
- version: '0'
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ hash: 3
42
+ segments:
43
+ - 0
44
+ version: "0"
33
45
  type: :runtime
46
+ requirement: *id002
34
47
  prerelease: false
35
- version_requirements: *70356765427240
36
- - !ruby/object:Gem::Dependency
48
+ - !ruby/object:Gem::Dependency
37
49
  name: rake
38
- requirement: &70356765442460 !ruby/object:Gem::Requirement
50
+ version_requirements: &id003 !ruby/object:Gem::Requirement
39
51
  none: false
40
- requirements:
41
- - - ! '>='
42
- - !ruby/object:Gem::Version
43
- version: '0'
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ hash: 3
56
+ segments:
57
+ - 0
58
+ version: "0"
44
59
  type: :development
60
+ requirement: *id003
45
61
  prerelease: false
46
- version_requirements: *70356765442460
47
- - !ruby/object:Gem::Dependency
62
+ - !ruby/object:Gem::Dependency
48
63
  name: rspec
49
- requirement: &70356765441700 !ruby/object:Gem::Requirement
64
+ version_requirements: &id004 !ruby/object:Gem::Requirement
50
65
  none: false
51
- requirements:
52
- - - ! '>='
53
- - !ruby/object:Gem::Version
54
- version: '0'
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ hash: 3
70
+ segments:
71
+ - 0
72
+ version: "0"
55
73
  type: :development
74
+ requirement: *id004
56
75
  prerelease: false
57
- version_requirements: *70356765441700
58
- - !ruby/object:Gem::Dependency
76
+ - !ruby/object:Gem::Dependency
59
77
  name: json
60
- requirement: &70356765441120 !ruby/object:Gem::Requirement
78
+ version_requirements: &id005 !ruby/object:Gem::Requirement
61
79
  none: false
62
- requirements:
63
- - - ! '>='
64
- - !ruby/object:Gem::Version
65
- version: '0'
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ hash: 3
84
+ segments:
85
+ - 0
86
+ version: "0"
66
87
  type: :development
88
+ requirement: *id005
67
89
  prerelease: false
68
- version_requirements: *70356765441120
69
- description: HTTP so awesome it will lure Catherine Zeta Jones into your unicorn petting
70
- zoo
71
- email:
90
+ description: HTTP so awesome it will lure Catherine Zeta Jones into your unicorn petting zoo
91
+ email:
72
92
  - tony.arcieri@gmail.com
73
93
  executables: []
94
+
74
95
  extensions: []
96
+
75
97
  extra_rdoc_files: []
76
- files:
98
+
99
+ files:
77
100
  - .gitignore
78
101
  - .rspec
79
102
  - .travis.yml
@@ -91,6 +114,7 @@ files:
91
114
  - lib/http/mime_types/json.rb
92
115
  - lib/http/options.rb
93
116
  - lib/http/request.rb
117
+ - lib/http/request_stream.rb
94
118
  - lib/http/response.rb
95
119
  - lib/http/response_parser.rb
96
120
  - lib/http/streaming_body.rb
@@ -106,6 +130,7 @@ files:
106
130
  - spec/http/options/proxy_spec.rb
107
131
  - spec/http/options/response_spec.rb
108
132
  - spec/http/options_spec.rb
133
+ - spec/http/request_stream_spec.rb
109
134
  - spec/http/response_spec.rb
110
135
  - spec/http_spec.rb
111
136
  - spec/spec_helper.rb
@@ -113,29 +138,38 @@ files:
113
138
  - spec/support/proxy_server.rb
114
139
  homepage: https://github.com/tarcieri/http
115
140
  licenses: []
141
+
116
142
  post_install_message:
117
143
  rdoc_options: []
118
- require_paths:
144
+
145
+ require_paths:
119
146
  - lib
120
- required_ruby_version: !ruby/object:Gem::Requirement
147
+ required_ruby_version: !ruby/object:Gem::Requirement
121
148
  none: false
122
- requirements:
123
- - - ! '>='
124
- - !ruby/object:Gem::Version
125
- version: '0'
126
- required_rubygems_version: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ hash: 3
153
+ segments:
154
+ - 0
155
+ version: "0"
156
+ required_rubygems_version: !ruby/object:Gem::Requirement
127
157
  none: false
128
- requirements:
129
- - - ! '>='
130
- - !ruby/object:Gem::Version
131
- version: '0'
158
+ requirements:
159
+ - - ">="
160
+ - !ruby/object:Gem::Version
161
+ hash: 3
162
+ segments:
163
+ - 0
164
+ version: "0"
132
165
  requirements: []
166
+
133
167
  rubyforge_project:
134
- rubygems_version: 1.8.10
168
+ rubygems_version: 1.8.24
135
169
  signing_key:
136
170
  specification_version: 3
137
171
  summary: HTTP should be easy
138
- test_files:
172
+ test_files:
139
173
  - spec/http/compat/curb_spec.rb
140
174
  - spec/http/options/body_spec.rb
141
175
  - spec/http/options/callbacks_spec.rb
@@ -146,9 +180,9 @@ test_files:
146
180
  - spec/http/options/proxy_spec.rb
147
181
  - spec/http/options/response_spec.rb
148
182
  - spec/http/options_spec.rb
183
+ - spec/http/request_stream_spec.rb
149
184
  - spec/http/response_spec.rb
150
185
  - spec/http_spec.rb
151
186
  - spec/spec_helper.rb
152
187
  - spec/support/example_server.rb
153
188
  - spec/support/proxy_server.rb
154
- has_rdoc: