right_http_connection 1.2.4 → 1.5.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/History.txt +27 -0
- data/Manifest.txt +1 -0
- data/Rakefile +46 -57
- data/lib/{net_fix.rb → base/net_fix.rb} +24 -4
- data/lib/base/support.rb +109 -0
- data/lib/base/version.rb +32 -0
- data/lib/right_http_connection.rb +198 -80
- data/right_http_connection.gemspec +63 -0
- data/spec/bad.ca +2794 -0
- data/spec/ca/Rakefile +64 -0
- data/spec/ca/ca.crt +23 -0
- data/spec/ca/ca.key +18 -0
- data/spec/ca/demoCA/index.txt +1 -0
- data/spec/ca/demoCA/serial +1 -0
- data/spec/ca/passphrase.txt +1 -0
- data/spec/ca/server.csr +12 -0
- data/spec/client/cacert.cer +0 -0
- data/spec/client/cacert.pem +17 -0
- data/spec/client/cert.pem +18 -0
- data/spec/client/key.pem +27 -0
- data/spec/good.ca +23 -0
- data/spec/proxy_server.rb +75 -0
- data/spec/really_dumb_webserver.rb +122 -0
- data/spec/server.crt +62 -0
- data/spec/server.key +15 -0
- metadata +130 -36
- data/setup.rb +0 -1585
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 8ba2dac9f5194cfcb8a8e6dec24f973418d07f22
|
4
|
+
data.tar.gz: 59e6d3f82e45ca7679849320fc7fd89f6e776d20
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: fd754b030589555f947f2a52bb64c4d3524c902f3e0d95c00fbecf5a340c06d7d6353360763b225b3e05464357610e2dae54d7e21df17b899a65c3bef5430c02
|
7
|
+
data.tar.gz: 2ee74c4fc7cf86908f8a06b96be6cd892aeb25e16a345ea959e0fbe7907712a126c73704c8a3da013dec9443cecd8cc6e1caace3ebd4737c7e0e4da4e5287488
|
data/History.txt
CHANGED
@@ -57,3 +57,30 @@ Initial public release
|
|
57
57
|
* fixed a bug: <NoMethodError: You have a nil object when you didn't expect it!
|
58
58
|
The error occurred while evaluating nil.body_stream>
|
59
59
|
|
60
|
+
== 1.2.5
|
61
|
+
|
62
|
+
- ActiveSupport dependency removal
|
63
|
+
|
64
|
+
|
65
|
+
== 1.3.0
|
66
|
+
- Added:
|
67
|
+
- support for using through proxies
|
68
|
+
- functional tests
|
69
|
+
|
70
|
+
== 1.3.1
|
71
|
+
- Added:
|
72
|
+
- SSL certificate handshake support
|
73
|
+
- more specs
|
74
|
+
- ability to give client side key and certificate inline
|
75
|
+
- Fixed: some minor glitches
|
76
|
+
|
77
|
+
== 1.4.0
|
78
|
+
- Added
|
79
|
+
- license
|
80
|
+
- HTTP_PROXY env variable support
|
81
|
+
- Fixed
|
82
|
+
- context-length issue (thx kristianm)
|
83
|
+
- exception handling
|
84
|
+
- connection is now closed on any exception
|
85
|
+
- connection is reestablished when credentials change
|
86
|
+
- some other minor bugs
|
data/Manifest.txt
CHANGED
data/Rakefile
CHANGED
@@ -1,72 +1,34 @@
|
|
1
1
|
require 'rubygems'
|
2
|
+
require 'bundler'
|
3
|
+
Bundler::GemHelper.install_tasks
|
2
4
|
require 'rake'
|
3
5
|
require 'rake/clean'
|
4
6
|
require 'rake/testtask'
|
5
7
|
require 'rake/packagetask'
|
6
|
-
require 'rake/gempackagetask'
|
7
|
-
require 'rake/rdoctask'
|
8
|
-
require 'rake/contrib/rubyforgepublisher'
|
8
|
+
#require 'rake/gempackagetask'
|
9
|
+
#require 'rake/rdoctask'
|
10
|
+
#require 'rake/contrib/rubyforgepublisher'
|
11
|
+
require 'rspec/core/rake_task'
|
12
|
+
require 'cucumber/rake/task'
|
9
13
|
require 'fileutils'
|
10
|
-
require 'hoe'
|
11
14
|
include FileUtils
|
12
15
|
require File.join(File.dirname(__FILE__), 'lib', 'right_http_connection')
|
13
16
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
GEM_NAME = 'right_http_connection' # what ppl will type to install your gem
|
18
|
-
RUBYFORGE_PROJECT = 'rightscale' # The unix name for your project
|
19
|
-
HOMEPATH = "http://#{RUBYFORGE_PROJECT}.rubyforge.org"
|
20
|
-
DOWNLOAD_PATH = "http://rubyforge.org/projects/#{RUBYFORGE_PROJECT}"
|
21
|
-
|
22
|
-
NAME = "right_http_connection"
|
23
|
-
REV = nil # UNCOMMENT IF REQUIRED: File.read(".svn/entries")[/committed-rev="(d+)"/, 1] rescue nil
|
24
|
-
VERS = RightHttpConnection::VERSION::STRING + (REV ? ".#{REV}" : "")
|
25
|
-
CLEAN.include ['**/.*.sw?', '*.gem', '.config', '**/.DS_Store']
|
26
|
-
RDOC_OPTS = ['--quiet', '--title', 'right_http_connection documentation',
|
27
|
-
"--opname", "index.html",
|
28
|
-
"--line-numbers",
|
29
|
-
"--main", "README",
|
30
|
-
"--inline-source"]
|
31
|
-
|
32
|
-
# Suppress Hoe's self-inclusion as a dependency for our Gem. This also keeps
|
33
|
-
# Rake & rubyforge out of the dependency list. Users must manually install
|
34
|
-
# these gems to run tests, etc.
|
35
|
-
# TRB 2/19/09: also do this for the extra_dev_deps array present in newer hoes.
|
36
|
-
# Older versions of RubyGems will try to install developer-dependencies as
|
37
|
-
# required runtime dependencies....
|
38
|
-
class Hoe
|
39
|
-
def extra_deps
|
40
|
-
@extra_deps.reject do |x|
|
41
|
-
Array(x).first == 'hoe'
|
42
|
-
end
|
43
|
-
end
|
44
|
-
def extra_dev_deps
|
45
|
-
@extra_dev_deps.reject do |x|
|
46
|
-
Array(x).first == 'hoe'
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
17
|
+
Bundler::GemHelper.install_tasks
|
18
|
+
|
19
|
+
=begin
|
50
20
|
|
51
|
-
#
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
p.summary = DESCRIPTION
|
58
|
-
p.url = HOMEPATH
|
59
|
-
p.rubyforge_name = RUBYFORGE_PROJECT if RUBYFORGE_PROJECT
|
60
|
-
p.test_globs = ["test/**/test_*.rb"]
|
61
|
-
p.clean_globs = CLEAN #An array of file patterns to delete on clean.
|
62
|
-
p.remote_rdoc_dir = "right_http_gem_doc"
|
63
|
-
|
64
|
-
# == Optional
|
65
|
-
p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n")
|
66
|
-
#p.extra_deps = [] # An array of rubygem dependencies [name, version], e.g. [ ['active_support', '>= 1.3.1'] ]
|
67
|
-
#p.spec_extras = {} # A hash of extra values to set in the gemspec.
|
21
|
+
# == Gem == #
|
22
|
+
|
23
|
+
gemtask = Rake::GemPackageTask.new(Gem::Specification.load("right_http_connection.gemspec")) do |package|
|
24
|
+
package.package_dir = ENV['PACKAGE_DIR'] || 'pkg'
|
25
|
+
package.need_zip = true
|
26
|
+
package.need_tar = true
|
68
27
|
end
|
69
28
|
|
29
|
+
directory gemtask.package_dir
|
30
|
+
|
31
|
+
CLEAN.include(gemtask.package_dir)
|
70
32
|
|
71
33
|
desc 'Generate website files'
|
72
34
|
task :website_generate do
|
@@ -101,3 +63,30 @@ task :check_version do
|
|
101
63
|
exit
|
102
64
|
end
|
103
65
|
end
|
66
|
+
=end
|
67
|
+
|
68
|
+
task :default => 'spec'
|
69
|
+
|
70
|
+
# == Unit Tests == #
|
71
|
+
|
72
|
+
desc "Run unit tests"
|
73
|
+
RSpec::Core::RakeTask.new
|
74
|
+
|
75
|
+
namespace :spec do
|
76
|
+
desc "Run unit tests with RCov"
|
77
|
+
RSpec::Core::RakeTask.new(:rcov) do |t|
|
78
|
+
t.rcov = true
|
79
|
+
t.rcov_opts = %q[--exclude "spec"]
|
80
|
+
end
|
81
|
+
|
82
|
+
desc "Print Specdoc for unit tests"
|
83
|
+
RSpec::Core::RakeTask.new(:doc) do |t|
|
84
|
+
t.rspec_opts = ["--format", "documentation"]
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
# == Functional tests == #
|
89
|
+
desc "Run functional tests"
|
90
|
+
Cucumber::Rake::Task.new do |t|
|
91
|
+
t.cucumber_opts = %w{--color --format pretty}
|
92
|
+
end
|
@@ -25,6 +25,7 @@
|
|
25
25
|
# Net::HTTP and Net::HTTPGenericRequest fixes to support 100-continue on
|
26
26
|
# POST and PUT. The request must have 'expect' field set to '100-continue'.
|
27
27
|
|
28
|
+
require 'timeout'
|
28
29
|
|
29
30
|
module Net
|
30
31
|
|
@@ -48,7 +49,7 @@ module Net
|
|
48
49
|
end
|
49
50
|
|
50
51
|
def rbuf_fill
|
51
|
-
timeout(@read_timeout) {
|
52
|
+
Timeout.timeout(@read_timeout) {
|
52
53
|
@rbuf << @io.sysread(@@socket_read_size)
|
53
54
|
}
|
54
55
|
end
|
@@ -91,18 +92,30 @@ module Net
|
|
91
92
|
private
|
92
93
|
|
93
94
|
def send_request_with_body(sock, ver, path, body, send_only=nil)
|
94
|
-
self.content_length = body.length
|
95
|
+
self.content_length = body.respond_to?(:bytesize) ? body.bytesize : body.length
|
95
96
|
delete 'Transfer-Encoding'
|
96
97
|
supply_default_content_type
|
97
98
|
write_header(sock, ver, path) unless send_only == :body
|
98
|
-
sock.write(body)
|
99
|
+
sock.write(body && body.to_s) unless send_only == :header
|
99
100
|
end
|
100
101
|
|
101
102
|
def send_request_with_body_stream(sock, ver, path, f, send_only=nil)
|
103
|
+
# KD: Fix 'content-length': it must not be greater than a piece of file left to be read.
|
104
|
+
# Otherwise the connection may behave like crazy causing 4xx or 5xx responses
|
105
|
+
#
|
106
|
+
# Only do this helpful thing if the stream responds to :pos (it may be something
|
107
|
+
# that responds to :read and :size but not :pos).
|
108
|
+
if f.respond_to?(:pos)
|
109
|
+
file_size = f.respond_to?(:lstat) ? f.lstat.size : f.size
|
110
|
+
bytes_to_read = [ file_size - f.pos, self.content_length.to_i ].sort.first
|
111
|
+
self.content_length = bytes_to_read
|
112
|
+
end
|
113
|
+
|
102
114
|
unless content_length() or chunked?
|
103
115
|
raise ArgumentError,
|
104
116
|
"Content-Length not given and Transfer-Encoding is not `chunked'"
|
105
117
|
end
|
118
|
+
bytes_to_read ||= content_length()
|
106
119
|
supply_default_content_type
|
107
120
|
write_header(sock, ver, path) unless send_only == :body
|
108
121
|
unless send_only == :header
|
@@ -112,8 +125,14 @@ module Net
|
|
112
125
|
end
|
113
126
|
sock.write "0\r\n\r\n"
|
114
127
|
else
|
115
|
-
|
128
|
+
# KD: When we read/write over file EOF it sometimes make the connection unstable
|
129
|
+
read_size = [ @@local_read_size, bytes_to_read ].sort.first
|
130
|
+
while s = f.read(read_size)
|
116
131
|
sock.write s
|
132
|
+
# Make sure we do not read over EOF or more than expected content-length
|
133
|
+
bytes_to_read -= read_size
|
134
|
+
break if bytes_to_read <= 0
|
135
|
+
read_size = bytes_to_read if bytes_to_read < read_size
|
117
136
|
end
|
118
137
|
end
|
119
138
|
end
|
@@ -144,6 +163,7 @@ module Net
|
|
144
163
|
req.exec @socket, @curr_http_version, edit_path(req.path), send_only
|
145
164
|
begin
|
146
165
|
res = HTTPResponse.read_new(@socket)
|
166
|
+
res.decode_content = req.decode_content if RUBY_VERSION > '2.0'
|
147
167
|
# if we expected 100-continue then send a body
|
148
168
|
if res.is_a?(HTTPContinue) && send_only && req['content-length'].to_i > 0
|
149
169
|
req.exec @socket, @curr_http_version, edit_path(req.path), :body
|
data/lib/base/support.rb
ADDED
@@ -0,0 +1,109 @@
|
|
1
|
+
# These are ActiveSupport-;like extensions to do a few handy things in the gems
|
2
|
+
# Derived from ActiveSupport, so the AS copyright notice applies:
|
3
|
+
#
|
4
|
+
#
|
5
|
+
#
|
6
|
+
# Copyright (c) 2005 David Heinemeier Hansson
|
7
|
+
#
|
8
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
9
|
+
# a copy of this software and associated documentation files (the
|
10
|
+
# "Software"), to deal in the Software without restriction, including
|
11
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
12
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
13
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
14
|
+
# the following conditions:
|
15
|
+
#
|
16
|
+
# The above copyright notice and this permission notice shall be
|
17
|
+
# included in all copies or substantial portions of the Software.
|
18
|
+
#
|
19
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
20
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
21
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
22
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
23
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
24
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
25
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
26
|
+
#++
|
27
|
+
#
|
28
|
+
#
|
29
|
+
class String #:nodoc:
|
30
|
+
|
31
|
+
# Constantize tries to find a declared constant with the name specified
|
32
|
+
# in the string. It raises a NameError when the name is not in CamelCase
|
33
|
+
# or is not initialized.
|
34
|
+
#
|
35
|
+
# Examples
|
36
|
+
# "Module".constantize #=> Module
|
37
|
+
# "Class".constantize #=> Class
|
38
|
+
def right_constantize()
|
39
|
+
unless /\A(?:::)?([A-Z]\w*(?:::[A-Z]\w*)*)\z/ =~ self
|
40
|
+
raise NameError, "#{self.inspect} is not a valid constant name!"
|
41
|
+
end
|
42
|
+
Object.module_eval("::#{$1}", __FILE__, __LINE__)
|
43
|
+
end
|
44
|
+
|
45
|
+
def right_camelize()
|
46
|
+
self.dup.split(/_/).map{ |word| word.capitalize }.join('')
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
class Object #:nodoc:
|
53
|
+
# "", " ", nil, [], and {} are blank
|
54
|
+
def right_blank?
|
55
|
+
if respond_to?(:empty?) && respond_to?(:strip)
|
56
|
+
empty? or strip.empty?
|
57
|
+
elsif respond_to?(:empty?)
|
58
|
+
empty?
|
59
|
+
else
|
60
|
+
!self
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
class NilClass #:nodoc:
|
66
|
+
def right_blank?
|
67
|
+
true
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
class FalseClass #:nodoc:
|
72
|
+
def right_blank?
|
73
|
+
true
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
class TrueClass #:nodoc:
|
78
|
+
def right_blank?
|
79
|
+
false
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
class Array #:nodoc:
|
84
|
+
alias_method :right_blank?, :empty?
|
85
|
+
end
|
86
|
+
|
87
|
+
class Hash #:nodoc:
|
88
|
+
alias_method :right_blank?, :empty?
|
89
|
+
|
90
|
+
# Return a new hash with all keys converted to symbols.
|
91
|
+
def right_symbolize_keys
|
92
|
+
inject({}) do |options, (key, value)|
|
93
|
+
options[key.to_sym] = value
|
94
|
+
options
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
class String #:nodoc:
|
100
|
+
def right_blank?
|
101
|
+
empty? || strip.empty?
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
class Numeric #:nodoc:
|
106
|
+
def right_blank?
|
107
|
+
false
|
108
|
+
end
|
109
|
+
end
|
data/lib/base/version.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
#-- -*- mode: ruby; encoding: utf-8 -*-
|
2
|
+
# Copyright: Copyright (c) 2010 RightScale, Inc.
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
5
|
+
# a copy of this software and associated documentation files (the
|
6
|
+
# 'Software'), to deal in the Software without restriction, including
|
7
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
8
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
9
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
10
|
+
# the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be
|
13
|
+
# included in all copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
18
|
+
# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
19
|
+
# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
20
|
+
# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
21
|
+
# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
#++
|
23
|
+
|
24
|
+
module RightHttpConnection #:nodoc:
|
25
|
+
module VERSION #:nodoc:
|
26
|
+
MAJOR = 1 unless defined?(MAJOR)
|
27
|
+
MINOR = 5 unless defined?(MINOR)
|
28
|
+
TINY = 1 unless defined?(TINY)
|
29
|
+
|
30
|
+
STRING = [MAJOR, MINOR, TINY].join('.') unless defined?(STRING)
|
31
|
+
end
|
32
|
+
end
|