rtunnel 0.3.0 → 0.3.1
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.
- data/Manifest.txt +1 -0
- data/lib/cmds.rb +166 -0
- data/lib/core.rb +2 -2
- metadata +2 -1
data/Manifest.txt
CHANGED
data/lib/cmds.rb
ADDED
@@ -0,0 +1,166 @@
|
|
1
|
+
module RTunnel
|
2
|
+
class Command
|
3
|
+
|
4
|
+
def to_s
|
5
|
+
CLASSES_TO_CODES[self.class].dup
|
6
|
+
end
|
7
|
+
|
8
|
+
class << self
|
9
|
+
def parse(data)
|
10
|
+
klass = class_from_code(data[0..0])
|
11
|
+
|
12
|
+
new_data = data[1..-1]
|
13
|
+
cmd = klass.parse(new_data)
|
14
|
+
|
15
|
+
data.replace(new_data)
|
16
|
+
|
17
|
+
cmd
|
18
|
+
end
|
19
|
+
|
20
|
+
def match(data)
|
21
|
+
return false if ! (klass = class_from_code(data[0..0]))
|
22
|
+
|
23
|
+
klass.match(data[1..-1])
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def class_from_code(code)
|
29
|
+
CODES_TO_CLASSES[code]
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
class ConnectionCommand < Command
|
35
|
+
attr_reader :conn_id
|
36
|
+
|
37
|
+
def initialize(conn_id)
|
38
|
+
@conn_id = conn_id
|
39
|
+
end
|
40
|
+
|
41
|
+
def to_s
|
42
|
+
super + "#{conn_id}|"
|
43
|
+
end
|
44
|
+
|
45
|
+
class << self
|
46
|
+
RE = %r{^([^|]+)\|}
|
47
|
+
|
48
|
+
def parse(data)
|
49
|
+
data =~ RE
|
50
|
+
conn_id = $1
|
51
|
+
|
52
|
+
cmd = self.new(conn_id)
|
53
|
+
|
54
|
+
data.sub! RE, ''
|
55
|
+
|
56
|
+
cmd
|
57
|
+
end
|
58
|
+
|
59
|
+
def match(data)
|
60
|
+
!! (data =~ RE)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
class CreateConnectionCommand < ConnectionCommand
|
67
|
+
end
|
68
|
+
|
69
|
+
class CloseConnectionCommand < ConnectionCommand
|
70
|
+
end
|
71
|
+
|
72
|
+
class SendDataCommand < Command
|
73
|
+
attr_reader :conn_id
|
74
|
+
attr_reader :data
|
75
|
+
|
76
|
+
def initialize(conn_id, data)
|
77
|
+
@conn_id = conn_id
|
78
|
+
@data = data
|
79
|
+
end
|
80
|
+
|
81
|
+
def to_s
|
82
|
+
super + "#{conn_id}|#{data.size}|#{data}"
|
83
|
+
end
|
84
|
+
|
85
|
+
class << self
|
86
|
+
RE = %r{^([^|]+)\|([^|]+)\|}
|
87
|
+
|
88
|
+
def parse(data)
|
89
|
+
data =~ RE
|
90
|
+
|
91
|
+
conn_id = $1
|
92
|
+
data_size = $2.to_i
|
93
|
+
|
94
|
+
new_data = data.sub(RE, '')
|
95
|
+
cmd_data = new_data[0,data_size]
|
96
|
+
|
97
|
+
cmd = SendDataCommand.new(conn_id, cmd_data)
|
98
|
+
|
99
|
+
data.replace(new_data[data_size..-1])
|
100
|
+
|
101
|
+
cmd
|
102
|
+
end
|
103
|
+
|
104
|
+
def match(data)
|
105
|
+
return false if ! (data =~ RE)
|
106
|
+
|
107
|
+
data_size = $2.to_i
|
108
|
+
|
109
|
+
data.sub(RE, '').size >= data_size
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
class RemoteListenCommand < Command
|
115
|
+
attr_reader :address
|
116
|
+
|
117
|
+
def initialize(address)
|
118
|
+
@address = address
|
119
|
+
end
|
120
|
+
|
121
|
+
def to_s
|
122
|
+
super + "#{address}|"
|
123
|
+
end
|
124
|
+
|
125
|
+
class << self
|
126
|
+
RE = %r{^([^|]+)\|}
|
127
|
+
|
128
|
+
def parse(data)
|
129
|
+
data =~ RE
|
130
|
+
address = $1
|
131
|
+
|
132
|
+
cmd = self.new(address)
|
133
|
+
|
134
|
+
data.sub! RE, ''
|
135
|
+
|
136
|
+
cmd
|
137
|
+
end
|
138
|
+
|
139
|
+
def match(data)
|
140
|
+
!! (data =~ RE)
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
end
|
145
|
+
|
146
|
+
class PingCommand < Command
|
147
|
+
def self.parse(data)
|
148
|
+
PingCommand.new
|
149
|
+
end
|
150
|
+
|
151
|
+
def self.match(data)
|
152
|
+
true
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
class Command
|
157
|
+
CODES_TO_CLASSES = {
|
158
|
+
"C" => CreateConnectionCommand,
|
159
|
+
"X" => CloseConnectionCommand,
|
160
|
+
"D" => SendDataCommand,
|
161
|
+
"P" => PingCommand,
|
162
|
+
"L" => RemoteListenCommand,
|
163
|
+
}
|
164
|
+
CLASSES_TO_CODES = CODES_TO_CLASSES.invert
|
165
|
+
end
|
166
|
+
end
|
data/lib/core.rb
CHANGED
metadata
CHANGED
@@ -3,7 +3,7 @@ rubygems_version: 0.9.4
|
|
3
3
|
specification_version: 1
|
4
4
|
name: rtunnel
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.3.
|
6
|
+
version: 0.3.1
|
7
7
|
date: 2007-11-27 00:00:00 +07:00
|
8
8
|
summary: The author was too lazy to write a summary
|
9
9
|
require_paths:
|
@@ -41,6 +41,7 @@ files:
|
|
41
41
|
- lib/client.rb
|
42
42
|
- lib/core.rb
|
43
43
|
- lib/server.rb
|
44
|
+
- lib/cmds.rb
|
44
45
|
test_files: []
|
45
46
|
|
46
47
|
rdoc_options:
|