ftw 0.0.39 → 0.0.40
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.
- checksums.yaml +5 -13
- data/lib/ftw/agent.rb +2 -0
- data/lib/ftw/connection.rb +16 -1
- data/lib/ftw/pool.rb +1 -0
- data/lib/ftw/protocol.rb +24 -8
- data/lib/ftw/version.rb +1 -1
- data/test/ftw/protocol.rb +79 -0
- metadata +37 -36
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
Y2VhYTRmMzNiNzM1NzI3YmMxNjllZDA1MGVlNjVkODE4ZTM4Yzc2OQ==
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 1ab7afb8f3c6e07bf4f80b2635bff119eef99e04
|
4
|
+
data.tar.gz: 5b59a556ba16516104ae26dc2b80ad87d08bfce8
|
7
5
|
SHA512:
|
8
|
-
metadata.gz:
|
9
|
-
|
10
|
-
OWJkNzc0NjdmZjMzOGNhYWYwNWNiYmQyZjE0MDVmYmQ2MTg5ODM2MmE1NDcx
|
11
|
-
YjMxZTk4MzJhYmI1ZjFlNmI0OWIxNDMxYTA3N2ZiNjQ3YWE3MGQ=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
NzA4ZjlmMTYzOThjMDRjZWI2MjkxNmYzZTExZTI0ZDkxY2MyNjM2MTFlYWNi
|
14
|
-
ZWUyNjFiZjZhMWNjZTRiNjkyMTIzNjkwZDQzZWU1YWRiMWU4ZTUyZDg2Yjkx
|
15
|
-
YjA4MTFiZTRkYjQyOWNjYzk3N2MwNGQ5MjMxNjEwZmI0MjMzNzk=
|
6
|
+
metadata.gz: 6186e1580975f891bfe1f2f774def4c193abaf4db82fd2b20d845cbb661a998892467ba73a2d260f4c686e206a82de2cc907a9dfa319a1fd46edc5849c60e661
|
7
|
+
data.tar.gz: 35836d9e9d0ea74922d84dbc9115f00885b4e2710c6d71904d70fdbd09931a684c9100395abe34c7051cabeb083e2529954dffc0836b996a79aa4de09511a26e
|
data/lib/ftw/agent.rb
CHANGED
@@ -208,11 +208,13 @@ class FTW::Agent
|
|
208
208
|
m = name.upcase
|
209
209
|
|
210
210
|
# 'def get' (put, post, etc)
|
211
|
+
public
|
211
212
|
define_method(name.to_sym) do |uri, options={}|
|
212
213
|
return request(m, uri, options)
|
213
214
|
end
|
214
215
|
|
215
216
|
# 'def get!' (put!, post!, etc)
|
217
|
+
public
|
216
218
|
define_method("#{name}!".to_sym) do |uri, options={}|
|
217
219
|
return execute(request(m, uri, options))
|
218
220
|
end
|
data/lib/ftw/connection.rb
CHANGED
@@ -244,6 +244,8 @@ class FTW::Connection
|
|
244
244
|
data << @read_buffer
|
245
245
|
return data
|
246
246
|
rescue EOFError => e
|
247
|
+
@socket.close
|
248
|
+
@connected = false
|
247
249
|
raise e
|
248
250
|
end
|
249
251
|
else
|
@@ -329,13 +331,26 @@ class FTW::Connection
|
|
329
331
|
# If you use VERIFY_NONE, you are removing the trust feature of TLS. Don't do that.
|
330
332
|
# Encryption without trust means you don't know who you are talking to.
|
331
333
|
sslcontext.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
334
|
+
|
335
|
+
# ruby-core is refusing to patch ruby's default openssl settings to be more
|
336
|
+
# secure, so let's fix that here. The next few lines setting options and
|
337
|
+
# ciphers come from jmhodges proposed patch
|
338
|
+
ssloptions = OpenSSL::SSL::OP_ALL
|
339
|
+
if defined?(OpenSSL::SSL::OP_DONT_INSERT_EMPTY_FRAGMENTS)
|
340
|
+
ssloptions &= ~OpenSSL::SSL::OP_DONT_INSERT_EMPTY_FRAGMENTS
|
341
|
+
end
|
342
|
+
if defined?(OpenSSL::SSL::OP_NO_COMPRESSION)
|
343
|
+
ssloptions |= OpenSSL::SSL::OP_NO_COMPRESSION
|
344
|
+
end
|
345
|
+
sslcontext.options = ssloptions
|
346
|
+
sslcontext.ciphers = "DEFAULT:!aNULL:!eNULL:!LOW:!EXPORT:!SSLv2"
|
347
|
+
|
332
348
|
sslcontext.verify_callback = proc do |*args|
|
333
349
|
@logger.debug("Verify peer via FTW::Connection#secure", :callback => settings[:verify_callback])
|
334
350
|
if settings[:verify_callback].respond_to?(:call)
|
335
351
|
settings[:verify_callback].call(*args)
|
336
352
|
end
|
337
353
|
end
|
338
|
-
sslcontext.ssl_version = :TLSv1
|
339
354
|
sslcontext.cert_store = options[:certificate_store]
|
340
355
|
@socket = OpenSSL::SSL::SSLSocket.new(@socket, sslcontext)
|
341
356
|
|
data/lib/ftw/pool.rb
CHANGED
data/lib/ftw/protocol.rb
CHANGED
@@ -74,29 +74,45 @@ module FTW::Protocol
|
|
74
74
|
|
75
75
|
def write_http_body_chunked(body, io)
|
76
76
|
if body.is_a?(String)
|
77
|
-
io
|
77
|
+
write_all( io, encode_chunked(body))
|
78
78
|
elsif body.respond_to?(:sysread)
|
79
|
-
|
79
|
+
begin
|
80
|
+
while cont = body.sysread(16384)
|
81
|
+
write_all( io, encode_chunked(cont))
|
82
|
+
end
|
83
|
+
rescue EOFError
|
84
|
+
end
|
80
85
|
elsif body.respond_to?(:read)
|
81
|
-
|
86
|
+
while cont = body.read(16384)
|
87
|
+
write_all( io, encode_chunked(cont) )
|
88
|
+
end
|
82
89
|
elsif body.respond_to?(:each)
|
83
|
-
body.each { |s| io
|
90
|
+
body.each { |s| write_all( io, encode_chunked(s)) }
|
84
91
|
end
|
85
92
|
|
86
93
|
# The terminating chunk is an empty one.
|
87
|
-
io
|
94
|
+
write_all(io, encode_chunked(""))
|
88
95
|
end # def write_http_body_chunked
|
89
96
|
|
90
97
|
def write_http_body_normal(body, io)
|
91
98
|
if body.is_a?(String)
|
92
|
-
io
|
99
|
+
write_all(io, body)
|
93
100
|
elsif body.respond_to?(:read)
|
94
|
-
|
101
|
+
while cont = body.read(16384)
|
102
|
+
write_all(io, cont)
|
103
|
+
end
|
95
104
|
elsif body.respond_to?(:each)
|
96
|
-
body.each { |s| io
|
105
|
+
body.each { |s| write_all( io, s) }
|
97
106
|
end
|
98
107
|
end # def write_http_body_normal
|
99
108
|
|
109
|
+
def write_all(io, string)
|
110
|
+
while string.bytesize > 0
|
111
|
+
w = io.write(string)
|
112
|
+
string = string[w..-1]
|
113
|
+
end
|
114
|
+
end # def write_all
|
115
|
+
|
100
116
|
# Read the body of this message. The block is called with chunks of the
|
101
117
|
# response as they are read in.
|
102
118
|
#
|
data/lib/ftw/version.rb
CHANGED
@@ -0,0 +1,79 @@
|
|
1
|
+
#require File.join(File.expand_path(__FILE__).sub(/\/ftw\/.*/, "/testing"))
|
2
|
+
require 'ftw/protocol'
|
3
|
+
require 'stringio'
|
4
|
+
|
5
|
+
describe FTW::Protocol do
|
6
|
+
|
7
|
+
class OnlySysread < Struct.new(:io)
|
8
|
+
def sysread(*args)
|
9
|
+
io.sysread(*args)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class OnlyRead < Struct.new(:io)
|
14
|
+
def read(*args)
|
15
|
+
io.read(*args)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
test "reading body via #read" do
|
20
|
+
protocol = Object.new
|
21
|
+
protocol.extend FTW::Protocol
|
22
|
+
|
23
|
+
output = StringIO.new
|
24
|
+
input = OnlyRead.new( StringIO.new('Some example input') )
|
25
|
+
|
26
|
+
protocol.write_http_body(input, output, false)
|
27
|
+
|
28
|
+
output.rewind
|
29
|
+
assert_equal( output.string, 'Some example input')
|
30
|
+
end
|
31
|
+
|
32
|
+
test "reading body via #sysread chunked" do
|
33
|
+
protocol = Object.new
|
34
|
+
protocol.extend FTW::Protocol
|
35
|
+
|
36
|
+
output = StringIO.new
|
37
|
+
input = OnlySysread.new( StringIO.new('Some example input') )
|
38
|
+
|
39
|
+
protocol.write_http_body(input, output, true)
|
40
|
+
|
41
|
+
output.rewind
|
42
|
+
assert_equal( output.string, "12\r\nSome example input\r\n0\r\n\r\n")
|
43
|
+
end
|
44
|
+
|
45
|
+
test "reading body via #read chunked" do
|
46
|
+
protocol = Object.new
|
47
|
+
protocol.extend FTW::Protocol
|
48
|
+
|
49
|
+
output = StringIO.new
|
50
|
+
input = OnlyRead.new( StringIO.new('Some example input') )
|
51
|
+
|
52
|
+
protocol.write_http_body(input, output, true)
|
53
|
+
|
54
|
+
output.rewind
|
55
|
+
assert_equal( output.string, "12\r\nSome example input\r\n0\r\n\r\n")
|
56
|
+
end
|
57
|
+
|
58
|
+
class OneByteWriter < Struct.new(:io)
|
59
|
+
|
60
|
+
def write( str )
|
61
|
+
io.write(str[0..1])
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
test "writing partially" do
|
67
|
+
protocol = Object.new
|
68
|
+
protocol.extend FTW::Protocol
|
69
|
+
|
70
|
+
output = OneByteWriter.new( StringIO.new )
|
71
|
+
input = OnlyRead.new( StringIO.new('Some example input') )
|
72
|
+
|
73
|
+
protocol.write_http_body(input, output, true)
|
74
|
+
|
75
|
+
output.io.rewind
|
76
|
+
assert_equal( output.io.string, "12\r\nSome example input\r\n0\r\n\r\n")
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
metadata
CHANGED
@@ -1,27 +1,27 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ftw
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.40
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jordan Sissel
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-09-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cabin
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">"
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ">"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
@@ -42,42 +42,42 @@ dependencies:
|
|
42
42
|
name: addressable
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: backports
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: 2.6.2
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: 2.6.2
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: minitest
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- -
|
73
|
+
- - ">"
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '0'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- -
|
80
|
+
- - ">"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
83
|
description: For The Web. Trying to build a solid and sane API for client and server
|
@@ -88,42 +88,43 @@ executables: []
|
|
88
88
|
extensions: []
|
89
89
|
extra_rdoc_files: []
|
90
90
|
files:
|
91
|
-
-
|
92
|
-
- lib/ftw
|
93
|
-
- lib/ftw/dns/dns.rb
|
94
|
-
- lib/ftw/dns/hash.rb
|
91
|
+
- README.md
|
92
|
+
- lib/ftw.rb
|
95
93
|
- lib/ftw/agent.rb
|
96
94
|
- lib/ftw/agent/configuration.rb
|
97
|
-
- lib/ftw/
|
98
|
-
- lib/ftw/websocket.rb
|
95
|
+
- lib/ftw/cacert.pem
|
99
96
|
- lib/ftw/connection.rb
|
97
|
+
- lib/ftw/cookies.rb
|
98
|
+
- lib/ftw/crlf.rb
|
99
|
+
- lib/ftw/dns.rb
|
100
|
+
- lib/ftw/dns/dns.rb
|
101
|
+
- lib/ftw/dns/hash.rb
|
100
102
|
- lib/ftw/http/headers.rb
|
101
103
|
- lib/ftw/http/message.rb
|
104
|
+
- lib/ftw/namespace.rb
|
105
|
+
- lib/ftw/pool.rb
|
102
106
|
- lib/ftw/poolable.rb
|
103
|
-
- lib/ftw/server.rb
|
104
|
-
- lib/ftw/response.rb
|
105
107
|
- lib/ftw/protocol.rb
|
106
|
-
- lib/ftw/cacert.pem
|
107
|
-
- lib/ftw/version.rb
|
108
|
-
- lib/ftw/namespace.rb
|
109
108
|
- lib/ftw/request.rb
|
110
|
-
- lib/ftw/
|
111
|
-
- lib/ftw/
|
109
|
+
- lib/ftw/response.rb
|
110
|
+
- lib/ftw/server.rb
|
111
|
+
- lib/ftw/singleton.rb
|
112
|
+
- lib/ftw/version.rb
|
112
113
|
- lib/ftw/webserver.rb
|
113
|
-
- lib/ftw/websocket
|
114
|
-
- lib/ftw/websocket/rack.rb
|
115
|
-
- lib/ftw/websocket/parser.rb
|
114
|
+
- lib/ftw/websocket.rb
|
116
115
|
- lib/ftw/websocket/constants.rb
|
117
|
-
- lib/ftw/
|
118
|
-
- lib/ftw.rb
|
119
|
-
-
|
116
|
+
- lib/ftw/websocket/parser.rb
|
117
|
+
- lib/ftw/websocket/rack.rb
|
118
|
+
- lib/ftw/websocket/writer.rb
|
119
|
+
- lib/rack/handler/ftw.rb
|
120
120
|
- test/all.rb
|
121
|
-
- test/
|
121
|
+
- test/docs.rb
|
122
|
+
- test/ftw/crlf.rb
|
122
123
|
- test/ftw/http/dns.rb
|
123
124
|
- test/ftw/http/headers.rb
|
124
|
-
- test/ftw/
|
125
|
-
- test/
|
126
|
-
-
|
125
|
+
- test/ftw/protocol.rb
|
126
|
+
- test/ftw/singleton.rb
|
127
|
+
- test/testing.rb
|
127
128
|
homepage: http://github.com/jordansissel/ruby-ftw
|
128
129
|
licenses:
|
129
130
|
- Apache License (2.0)
|
@@ -135,17 +136,17 @@ require_paths:
|
|
135
136
|
- lib
|
136
137
|
required_ruby_version: !ruby/object:Gem::Requirement
|
137
138
|
requirements:
|
138
|
-
- -
|
139
|
+
- - ">="
|
139
140
|
- !ruby/object:Gem::Version
|
140
141
|
version: '0'
|
141
142
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
142
143
|
requirements:
|
143
|
-
- -
|
144
|
+
- - ">="
|
144
145
|
- !ruby/object:Gem::Version
|
145
146
|
version: '0'
|
146
147
|
requirements: []
|
147
148
|
rubyforge_project:
|
148
|
-
rubygems_version: 2.
|
149
|
+
rubygems_version: 2.2.2
|
149
150
|
signing_key:
|
150
151
|
specification_version: 4
|
151
152
|
summary: For The Web. Trying to build a solid and sane API for client and server web
|