surro-gate 0.1.1 → 0.2.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/README.md +1 -0
- data/codecov.yml +1 -0
- data/lib/surro-gate/proxy.rb +21 -8
- data/lib/surro-gate/version.rb +1 -1
- data/lib/surro-gate.rb +2 -2
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e7ca2413b4164e0b24ab63bc4045b6032f547a98
|
4
|
+
data.tar.gz: 4d962b753c9dc1fd90c6eb4ba1d8f4608fbb36eb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d77bfb4c20a74d1551f0946cd600e01c26d5cdae9bcc8ba23788f6503edc78fd4871534a0a74e186b6e8cec29a8e0fcb764ba9c1ad6b6607330da47c80b8e203
|
7
|
+
data.tar.gz: a46c65fb6da65c8735dc35fc37f7965081ce4070e0f1fb68044fdce1530f2379893255e7eb50c61c5745e9a4632fe0766663649159a4303aa8cb47534f2b4613
|
data/README.md
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
# SurroGate
|
2
2
|
|
3
|
+
[](https://badge.fury.io/rb/surro-gate)
|
3
4
|
[](https://travis-ci.org/skateman/surro-gate)
|
4
5
|
[](https://gemnasium.com/skateman/surro-gate)
|
5
6
|
[](http://inch-ci.org/github/skateman/surro-gate)
|
data/codecov.yml
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
comment: off
|
data/lib/surro-gate/proxy.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'nio'
|
2
|
+
require 'logger'
|
2
3
|
|
3
4
|
module SurroGate
|
4
5
|
# This class is responsible for connecting TCP socket pairs and proxying between them.
|
@@ -10,9 +11,11 @@ module SurroGate
|
|
10
11
|
#
|
11
12
|
# The proxy was designed to be highly reusable and it can handle multiple socket pairs.
|
12
13
|
class Proxy
|
13
|
-
def initialize
|
14
|
+
def initialize(logger)
|
14
15
|
@mutex = Mutex.new
|
15
16
|
@selector = NIO::Selector.new
|
17
|
+
@log = logger || Logger.new(STDOUT)
|
18
|
+
@log.level = Logger::WARN
|
16
19
|
end
|
17
20
|
|
18
21
|
# Registers a pair of socket for proxying.
|
@@ -22,12 +25,15 @@ module SurroGate
|
|
22
25
|
# @raise [ProxyError] when at least one of the pushed sockets is already registered
|
23
26
|
# @param left [TCPSocket]
|
24
27
|
# @param right [TCPSocket]
|
28
|
+
# @yield The block responsible for additional cleanup
|
25
29
|
# @return the registered socket pair as an array
|
26
|
-
def push(left, right)
|
30
|
+
def push(left, right, &block)
|
27
31
|
raise ProxyError, 'Socket already handled by the proxy' if includes?(left, right)
|
28
32
|
|
33
|
+
@log.info("Connecting #{left} <-> #{right}")
|
34
|
+
|
29
35
|
@mutex.synchronize do
|
30
|
-
proxy(left, right)
|
36
|
+
proxy(left, right, block)
|
31
37
|
end
|
32
38
|
|
33
39
|
[left, right]
|
@@ -45,7 +51,7 @@ module SurroGate
|
|
45
51
|
|
46
52
|
private
|
47
53
|
|
48
|
-
def proxy(left, right)
|
54
|
+
def proxy(left, right, block = nil)
|
49
55
|
# Pass boths sockets to the Nio4r selector
|
50
56
|
monitors = [left, right].map { |socket| @selector.register(socket, :rw) }
|
51
57
|
|
@@ -56,9 +62,9 @@ module SurroGate
|
|
56
62
|
# Set up a proc for future transmissions
|
57
63
|
src.value = proc do
|
58
64
|
# Clean up the connection if one of the endpoints gets closed
|
59
|
-
cleanup(src.io, dst.io) if src.io.closed? || dst.io.closed?
|
65
|
+
cleanup(src.io, dst.io, &block) if src.io.closed? || dst.io.closed?
|
60
66
|
# Do the transmission and return with the bytes transferred
|
61
|
-
transmit(src.io, dst.io) if src.readable? && dst.writable?
|
67
|
+
transmit(src.io, dst.io, block) if src.readable? && dst.writable?
|
62
68
|
end
|
63
69
|
end
|
64
70
|
|
@@ -66,10 +72,11 @@ module SurroGate
|
|
66
72
|
thread_start unless @selector.empty?
|
67
73
|
end
|
68
74
|
|
69
|
-
def transmit(src, dst)
|
75
|
+
def transmit(src, dst, block)
|
70
76
|
dst.write_nonblock(src.read_nonblock(4096))
|
71
77
|
rescue # Clean up both sockets if something bad happens
|
72
|
-
|
78
|
+
@log.warn("Transmission failure between #{src} <-> #{dst}")
|
79
|
+
cleanup(src, dst, &block)
|
73
80
|
end
|
74
81
|
|
75
82
|
def cleanup(*sockets)
|
@@ -79,11 +86,16 @@ module SurroGate
|
|
79
86
|
socket.close unless socket.closed?
|
80
87
|
end
|
81
88
|
|
89
|
+
@log.info("Disconnecting #{sockets.join(' <-> ')}")
|
90
|
+
|
91
|
+
yield if block_given?
|
92
|
+
|
82
93
|
# Make sure that the internal thread is stopped if no sockets remain
|
83
94
|
thread_stop if @selector.empty?
|
84
95
|
end
|
85
96
|
|
86
97
|
def thread_start
|
98
|
+
@log.debug('Starting the internal thread')
|
87
99
|
@thread ||= Thread.new do
|
88
100
|
loop do
|
89
101
|
reactor
|
@@ -93,6 +105,7 @@ module SurroGate
|
|
93
105
|
|
94
106
|
def thread_stop
|
95
107
|
return if @thread.nil?
|
108
|
+
@log.debug('Stopping the internal thread')
|
96
109
|
thread = @thread
|
97
110
|
@thread = nil
|
98
111
|
thread.kill
|
data/lib/surro-gate/version.rb
CHANGED
data/lib/surro-gate.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: surro-gate
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dávid Halász
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-01-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nio4r
|
@@ -127,6 +127,7 @@ files:
|
|
127
127
|
- Rakefile
|
128
128
|
- bin/console
|
129
129
|
- bin/setup
|
130
|
+
- codecov.yml
|
130
131
|
- lib/surro-gate.rb
|
131
132
|
- lib/surro-gate/proxy.rb
|
132
133
|
- lib/surro-gate/proxy_error.rb
|
@@ -152,7 +153,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
152
153
|
version: '0'
|
153
154
|
requirements: []
|
154
155
|
rubyforge_project:
|
155
|
-
rubygems_version: 2.5.
|
156
|
+
rubygems_version: 2.5.2
|
156
157
|
signing_key:
|
157
158
|
specification_version: 4
|
158
159
|
summary: A general purrpose TCP-to-TCP proxy written in Ruby
|