protocol-zmtp 0.5.0 → 0.6.0
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 +4 -4
- data/lib/protocol/zmtp/codec/command.rb +7 -4
- data/lib/protocol/zmtp/codec/frame.rb +25 -6
- data/lib/protocol/zmtp/connection.rb +9 -4
- data/lib/protocol/zmtp/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: fe0884f347da68db2bbd04949c944108a997d67f545e511e5a74973a84c1d359
|
|
4
|
+
data.tar.gz: ff1542dd2feffb84db290fc1dacb8e06d10da80282619c342a59d8d239388125
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 41b15de98c2e4f0ed6db44f9cf9d9524e4dac42c1f01bf75652a363c9afbedc1af755b7531e113e32abea1a3fd64f164446190c81e036a172989868b5bd712a0
|
|
7
|
+
data.tar.gz: 7325e3b59a72b14776128de68361f0507ebfca31d52646aadd1688b6b022e8b04fa9308c3b8a2da7ddccccaaa1d5ed81d58f9f8a0f15a308fd0e196f8b45ceb9
|
|
@@ -20,14 +20,16 @@ module Protocol
|
|
|
20
20
|
# @return [String] command name (e.g. "READY", "SUBSCRIBE")
|
|
21
21
|
attr_reader :name
|
|
22
22
|
|
|
23
|
+
|
|
23
24
|
# @return [String] command data (binary)
|
|
24
25
|
attr_reader :data
|
|
25
26
|
|
|
27
|
+
|
|
26
28
|
# @param name [String] command name
|
|
27
29
|
# @param data [String] command data
|
|
28
|
-
def initialize(name, data =
|
|
30
|
+
def initialize(name, data = EMPTY_BINARY)
|
|
29
31
|
@name = name
|
|
30
|
-
@data = data.b
|
|
32
|
+
@data = data.encoding == Encoding::BINARY ? data : data.b
|
|
31
33
|
end
|
|
32
34
|
|
|
33
35
|
|
|
@@ -35,8 +37,9 @@ module Protocol
|
|
|
35
37
|
#
|
|
36
38
|
# @return [String] binary body (name-length + name + data)
|
|
37
39
|
def to_body
|
|
38
|
-
name_bytes = @name.b
|
|
39
|
-
|
|
40
|
+
name_bytes = @name.encoding == Encoding::BINARY ? @name : @name.b
|
|
41
|
+
buf = String.new(capacity: 1 + name_bytes.bytesize + @data.bytesize, encoding: Encoding::BINARY)
|
|
42
|
+
buf << Frame::FLAG_BYTES[name_bytes.bytesize] << name_bytes << @data
|
|
40
43
|
end
|
|
41
44
|
|
|
42
45
|
|
|
@@ -3,6 +3,11 @@
|
|
|
3
3
|
module Protocol
|
|
4
4
|
module ZMTP
|
|
5
5
|
module Codec
|
|
6
|
+
|
|
7
|
+
# Frozen empty binary string for zero-length frame bodies.
|
|
8
|
+
EMPTY_BINARY = "".b.freeze
|
|
9
|
+
|
|
10
|
+
|
|
6
11
|
# ZMTP frame encode/decode.
|
|
7
12
|
#
|
|
8
13
|
# Wire format:
|
|
@@ -19,6 +24,9 @@ module Protocol
|
|
|
19
24
|
# Short frame: 1-byte size, max body 255 bytes.
|
|
20
25
|
SHORT_MAX = 255
|
|
21
26
|
|
|
27
|
+
# Pre-computed single-byte flag strings (avoids Integer#chr + String#b per frame).
|
|
28
|
+
FLAG_BYTES = Array.new(256) { |i| i.chr.b.freeze }.freeze
|
|
29
|
+
|
|
22
30
|
|
|
23
31
|
# @return [String] frame body (binary)
|
|
24
32
|
attr_reader :body
|
|
@@ -49,9 +57,9 @@ module Protocol
|
|
|
49
57
|
flags |= FLAGS_COMMAND if @command
|
|
50
58
|
|
|
51
59
|
if size > SHORT_MAX
|
|
52
|
-
|
|
60
|
+
FLAG_BYTES[flags | FLAGS_LONG] + [size].pack("Q>") + @body
|
|
53
61
|
else
|
|
54
|
-
flags
|
|
62
|
+
FLAG_BYTES[flags] + FLAG_BYTES[size] + @body
|
|
55
63
|
end
|
|
56
64
|
end
|
|
57
65
|
|
|
@@ -64,9 +72,20 @@ module Protocol
|
|
|
64
72
|
# @return [String] frozen binary wire representation
|
|
65
73
|
#
|
|
66
74
|
def self.encode_message(parts)
|
|
67
|
-
buf
|
|
68
|
-
parts.
|
|
69
|
-
|
|
75
|
+
buf = String.new(encoding: Encoding::BINARY)
|
|
76
|
+
last = parts.size - 1
|
|
77
|
+
i = 0
|
|
78
|
+
while i < parts.size
|
|
79
|
+
body = parts[i]
|
|
80
|
+
body = body.b unless body.encoding == Encoding::BINARY
|
|
81
|
+
size = body.bytesize
|
|
82
|
+
flags = i < last ? FLAGS_MORE : 0
|
|
83
|
+
if size > SHORT_MAX
|
|
84
|
+
buf << FLAG_BYTES[flags | FLAGS_LONG] << [size].pack("Q>") << body
|
|
85
|
+
else
|
|
86
|
+
buf << FLAG_BYTES[flags] << FLAG_BYTES[size] << body
|
|
87
|
+
end
|
|
88
|
+
i += 1
|
|
70
89
|
end
|
|
71
90
|
buf.freeze
|
|
72
91
|
end
|
|
@@ -95,7 +114,7 @@ module Protocol
|
|
|
95
114
|
raise Error, "frame size #{size} exceeds max_message_size #{max_message_size}"
|
|
96
115
|
end
|
|
97
116
|
|
|
98
|
-
body = size > 0 ? io.read_exactly(size) :
|
|
117
|
+
body = size > 0 ? io.read_exactly(size) : EMPTY_BINARY
|
|
99
118
|
|
|
100
119
|
new(body, more: more, command: command)
|
|
101
120
|
end
|
|
@@ -306,13 +306,17 @@ module Protocol
|
|
|
306
306
|
def write_frames(parts)
|
|
307
307
|
encrypted = @mechanism.encrypted?
|
|
308
308
|
buf = @header_buf
|
|
309
|
+
last = parts.size - 1
|
|
309
310
|
|
|
310
|
-
|
|
311
|
-
|
|
311
|
+
i = 0
|
|
312
|
+
while i < parts.size
|
|
313
|
+
part = parts[i]
|
|
314
|
+
more = i < last
|
|
312
315
|
if encrypted
|
|
313
|
-
|
|
316
|
+
body = part.encoding == Encoding::BINARY ? part : part.b
|
|
317
|
+
@io.write(@mechanism.encrypt(body, more: more))
|
|
314
318
|
else
|
|
315
|
-
body = part.b
|
|
319
|
+
body = part.encoding == Encoding::BINARY ? part : part.b
|
|
316
320
|
size = body.bytesize
|
|
317
321
|
flags = more ? Codec::Frame::FLAGS_MORE : 0
|
|
318
322
|
buf.clear
|
|
@@ -324,6 +328,7 @@ module Protocol
|
|
|
324
328
|
@io.write(buf)
|
|
325
329
|
@io.write(body)
|
|
326
330
|
end
|
|
331
|
+
i += 1
|
|
327
332
|
end
|
|
328
333
|
end
|
|
329
334
|
end
|