zerg_support 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +2 -0
- data/Rakefile +1 -1
- data/lib/zerg_support/protocols/frame_protocol.rb +5 -4
- data/lib/zerg_support/socket_factory.rb +18 -0
- data/lib/zerg_support/sockets/protocol_adapter.rb +9 -2
- data/lib/zerg_support/spawn.rb +2 -2
- data/test/test_frame_protocol.rb +2 -1
- data/test/test_socket_factory.rb +10 -6
- data/zerg_support.gemspec +2 -2
- metadata +2 -2
data/CHANGELOG
CHANGED
data/Rakefile
CHANGED
@@ -10,7 +10,7 @@ module FrameProtocol
|
|
10
10
|
|
11
11
|
i = 0
|
12
12
|
loop do
|
13
|
-
while @frame_protocol_buffer.nil? and i < data.
|
13
|
+
while @frame_protocol_buffer.nil? and i < data.length
|
14
14
|
@frame_protocol_varsize << data[i]
|
15
15
|
if (data[i] & 0x80) == 0
|
16
16
|
@frame_protocol_bytes_left =
|
@@ -21,15 +21,16 @@ module FrameProtocol
|
|
21
21
|
end
|
22
22
|
|
23
23
|
return if @frame_protocol_buffer.nil?
|
24
|
-
break if @frame_protocol_bytes_left > data.
|
24
|
+
break if @frame_protocol_bytes_left > data.length - i
|
25
25
|
|
26
|
-
received_frame @frame_protocol_buffer +
|
26
|
+
received_frame @frame_protocol_buffer +
|
27
|
+
data[i, @frame_protocol_bytes_left]
|
27
28
|
@frame_protocol_varsize, @frame_protocol_buffer = '', nil
|
28
29
|
i += @frame_protocol_bytes_left
|
29
30
|
end
|
30
31
|
|
31
32
|
@frame_protocol_buffer << data[i..-1]
|
32
|
-
@frame_protocol_bytes_left -= data.
|
33
|
+
@frame_protocol_bytes_left -= data.length - i
|
33
34
|
end
|
34
35
|
|
35
36
|
# Override to process incoming frames.
|
@@ -94,6 +94,15 @@ module SocketFactory
|
|
94
94
|
BasicSocket.do_not_reverse_lookup = true
|
95
95
|
end
|
96
96
|
end
|
97
|
+
|
98
|
+
if options[:linger]
|
99
|
+
socket.setsockopt Socket::SOL_SOCKET, Socket::SO_LINGER,
|
100
|
+
[1, options[:linger]].pack('ii')
|
101
|
+
else
|
102
|
+
# No lingering sockets.
|
103
|
+
socket.setsockopt Socket::SOL_SOCKET, Socket::SO_LINGER, [1, 0].pack('ii')
|
104
|
+
sugar_socket_close socket
|
105
|
+
end
|
97
106
|
end
|
98
107
|
|
99
108
|
# Hacks a socket's accept method so that new sockets have the given flags set.
|
@@ -116,6 +125,15 @@ module SocketFactory
|
|
116
125
|
super(*args)
|
117
126
|
end
|
118
127
|
end
|
128
|
+
|
129
|
+
# Sugar-coat the socket's close() call with the proper way to close a socket.
|
130
|
+
def self.sugar_socket_close(socket)
|
131
|
+
def socket.close
|
132
|
+
shutdown rescue nil
|
133
|
+
recv 1 rescue nil
|
134
|
+
super
|
135
|
+
end
|
136
|
+
end
|
119
137
|
|
120
138
|
# Binds a socket to an address based on the options.
|
121
139
|
def self.bind(socket, options)
|
@@ -23,7 +23,7 @@ module ProtocolAdapter
|
|
23
23
|
# Receives an object from a socket.
|
24
24
|
define_method :"recv_#{object_name}" do
|
25
25
|
@zerg_protocol_adapter_state ||= state_class.new self
|
26
|
-
while @zerg_protocol_adapter_state.recv_object_buffer.
|
26
|
+
while @zerg_protocol_adapter_state.recv_object_buffer.empty?
|
27
27
|
data = recv 65536
|
28
28
|
return nil if data.length == 0 # Other side closed socket.
|
29
29
|
@zerg_protocol_adapter_state.received_bytes data
|
@@ -51,7 +51,14 @@ module ProtocolAdapter
|
|
51
51
|
|
52
52
|
# Called by the protocol when an entire object is available.
|
53
53
|
def send_bytes(data)
|
54
|
-
|
54
|
+
# NOTE: need to chunk the data so kernel buffers don't overflow.
|
55
|
+
# Found out about this the hard way -- sending 150k in one call
|
56
|
+
# drops data.
|
57
|
+
i = 0
|
58
|
+
while i < data.length
|
59
|
+
@target.send data[i, 65536], 0
|
60
|
+
i += 65536
|
61
|
+
end
|
55
62
|
end
|
56
63
|
end
|
57
64
|
end
|
data/lib/zerg_support/spawn.rb
CHANGED
data/test/test_frame_protocol.rb
CHANGED
@@ -101,7 +101,8 @@ module FrameProtocolTestMethods
|
|
101
101
|
def test_natural_encoding
|
102
102
|
table = [[0, "\0"], [1, "\x01"], [127, "\x7f"], [128, "\x80\x01"],
|
103
103
|
[65535, "\xff\xff\x03"], [0xf0f0f0, "\xf0\xe1\xc3\x07"],
|
104
|
-
[0xaa55aa55aa55, "\xd5\xd4\xd6\xd2\xda\xca\x2a"]
|
104
|
+
[0xaa55aa55aa55, "\xd5\xd4\xd6\xd2\xda\xca\x2a"],
|
105
|
+
[148296, "\310\206\t"]]
|
105
106
|
table.each do |entry|
|
106
107
|
assert_equal entry.last, FP.encode_natural(entry.first)
|
107
108
|
assert_equal entry.first, FP.decode_natural(entry.last)
|
data/test/test_socket_factory.rb
CHANGED
@@ -10,11 +10,14 @@ class SocketFactoryTest < Test::Unit::TestCase
|
|
10
10
|
OPAdapter = Zerg::Support::Sockets::ProtocolAdapter.adapter_module OP
|
11
11
|
|
12
12
|
def setup
|
13
|
+
super
|
14
|
+
@thread_abort = Thread.abort_on_exception
|
13
15
|
Thread.abort_on_exception = true
|
14
16
|
end
|
15
17
|
|
16
18
|
def teardown
|
17
|
-
|
19
|
+
Thread.abort_on_exception = @thread_abort
|
20
|
+
super
|
18
21
|
end
|
19
22
|
|
20
23
|
def test_host_from_address
|
@@ -54,21 +57,21 @@ class SocketFactoryTest < Test::Unit::TestCase
|
|
54
57
|
client_options ||= server_options
|
55
58
|
test_port = 31996
|
56
59
|
|
57
|
-
cli_gold = { :request_type => 1, :request_name => "moo"
|
58
|
-
|
60
|
+
cli_gold = { :request_type => 1, :request_name => "moo",
|
61
|
+
:blob => 'abc' * 43000 }
|
62
|
+
srv_gold = { :response_type => 2, :response_value => [true, 314],
|
63
|
+
:rblob => 'xyz' * 41000 }
|
59
64
|
cli_hash = nil
|
60
65
|
|
61
66
|
# Server thread.
|
67
|
+
server = SF.socket({:in_addr => ":#{test_port}"}.merge server_options)
|
62
68
|
Thread.new do
|
63
|
-
server = SF.socket({:in_addr => ":#{test_port}"}.merge server_options)
|
64
69
|
server.listen
|
65
70
|
serv_client, client_addrinfo = server.accept
|
66
71
|
serv_client.extend OPAdapter
|
67
72
|
cli_hash = serv_client.recv_object
|
68
73
|
serv_client.send_object srv_gold
|
69
74
|
serv_client.close
|
70
|
-
|
71
|
-
server.close
|
72
75
|
end
|
73
76
|
|
74
77
|
# Client.
|
@@ -78,6 +81,7 @@ class SocketFactoryTest < Test::Unit::TestCase
|
|
78
81
|
client.send_object cli_gold
|
79
82
|
srv_hash = client.recv_object
|
80
83
|
client.close
|
84
|
+
server.close
|
81
85
|
|
82
86
|
# Checks
|
83
87
|
assert_equal cli_gold, cli_hash, "Client -> server failed"
|
data/zerg_support.gemspec
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{zerg_support}
|
5
|
-
s.version = "0.1.
|
5
|
+
s.version = "0.1.4"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Victor Costan"]
|
9
|
-
s.date = %q{2009-11-
|
9
|
+
s.date = %q{2009-11-11}
|
10
10
|
s.description = %q{Support libraries used by Zergling.Net deployment code.}
|
11
11
|
s.email = %q{victor@zergling.net}
|
12
12
|
s.extra_rdoc_files = ["CHANGELOG", "lib/zerg_support/event_machine/connection_mocks.rb", "lib/zerg_support/event_machine/protocol_adapter.rb", "lib/zerg_support/gems.rb", "lib/zerg_support/open_ssh.rb", "lib/zerg_support/process.rb", "lib/zerg_support/protocols/frame_protocol.rb", "lib/zerg_support/protocols/object_protocol.rb", "lib/zerg_support/socket_factory.rb", "lib/zerg_support/sockets/protocol_adapter.rb", "lib/zerg_support/sockets/socket_mocks.rb", "lib/zerg_support/spawn.rb", "lib/zerg_support.rb", "LICENSE", "README"]
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zerg_support
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Victor Costan
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-11-
|
12
|
+
date: 2009-11-11 00:00:00 -05:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|