multitunnels 1.0.1 → 1.0.2
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/README.md +4 -0
- data/lib/tunnels.rb +30 -14
- data/lib/tunnels/parser.rb +27 -0
- data/lib/tunnels/version.rb +1 -1
- data/tunnels.gemspec +2 -0
- metadata +102 -53
- checksums.yaml +0 -7
data/README.md
CHANGED
data/lib/tunnels.rb
CHANGED
@@ -1,12 +1,11 @@
|
|
1
1
|
require 'tunnels/version'
|
2
|
+
require 'tunnels/parser'
|
2
3
|
require 'uri'
|
3
4
|
require 'eventmachine'
|
4
5
|
|
5
6
|
# most of code is from [thin-glazed](https://github.com/freelancing-god/thin-glazed).
|
6
7
|
# Copyright © 2012, Thin::Glazed was a Rails Camp New Zealand project, and is developed and maintained by Pat Allan. It is released under the open MIT Licence.
|
7
8
|
|
8
|
-
class ClientError < StandardError; end
|
9
|
-
|
10
9
|
module Tunnels
|
11
10
|
def self.run!(params)
|
12
11
|
maps = parse_params params
|
@@ -33,8 +32,6 @@ module Tunnels
|
|
33
32
|
rescue RuntimeError => e
|
34
33
|
STDERR.puts e.message
|
35
34
|
STDERR.puts "Maybe you should run on `sudo`"
|
36
|
-
rescue ClientError => e
|
37
|
-
STDERR.puts e.message
|
38
35
|
end
|
39
36
|
|
40
37
|
def self.help
|
@@ -132,16 +129,17 @@ Examples:
|
|
132
129
|
end
|
133
130
|
|
134
131
|
def receive_data(data)
|
135
|
-
unless data.nil?
|
136
|
-
|
137
|
-
data.sub! /\r\nHost:\s*(.+?)\s*\r\n/i do
|
138
|
-
host, port = $1.split(':') if $1
|
139
|
-
client = client host, port
|
140
|
-
"\r\nHost: #{client.to_host}:#{client.to_port}\r\n"
|
141
|
-
end
|
132
|
+
parser << data unless data.nil?
|
133
|
+
end
|
142
134
|
|
143
|
-
|
135
|
+
def send data
|
136
|
+
data.sub!(/\r\nHost:\s*(.+?)\s*\r\n/i) do
|
137
|
+
host, port = $1.split(':') if $1
|
138
|
+
self.last_client = client host, port
|
139
|
+
"\r\nHost: #{last_client.to_host}:#{last_client.to_port}\r\n"
|
144
140
|
end
|
141
|
+
|
142
|
+
last_client.send_data data
|
145
143
|
end
|
146
144
|
|
147
145
|
def relay_from_client(data)
|
@@ -168,7 +166,7 @@ Examples:
|
|
168
166
|
when :https
|
169
167
|
EventMachine.connect to_host, to_port, HttpsClient, self, from_host, from_port, to_host, to_port
|
170
168
|
else
|
171
|
-
|
169
|
+
STDERR.puts "Cannot support scheme: #{to_scheme}"
|
172
170
|
end
|
173
171
|
end
|
174
172
|
|
@@ -176,7 +174,7 @@ Examples:
|
|
176
174
|
port = port.to_i
|
177
175
|
search_client_by_host_and_port(host, port) ||
|
178
176
|
search_client_by_host(host) ||
|
179
|
-
|
177
|
+
STDERR.puts("Cannot find a client for #{host}:#{port}")
|
180
178
|
end
|
181
179
|
|
182
180
|
def search_client_by_host_and_port host, port
|
@@ -208,6 +206,24 @@ Examples:
|
|
208
206
|
def clear_clients
|
209
207
|
@clients.clear
|
210
208
|
end
|
209
|
+
|
210
|
+
def parser
|
211
|
+
Thread.current['parser'] ||= begin
|
212
|
+
parser = Parser.new
|
213
|
+
parser.on_complete do |data|
|
214
|
+
send data
|
215
|
+
end
|
216
|
+
parser
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
def last_client
|
221
|
+
Thread.current['client'] ||= client '127.0.0.1'
|
222
|
+
end
|
223
|
+
|
224
|
+
def last_client= client
|
225
|
+
Thread.current['client'] = client
|
226
|
+
end
|
211
227
|
end
|
212
228
|
|
213
229
|
class HttpsProxy < HttpProxy
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'http/parser'
|
2
|
+
|
3
|
+
class Parser
|
4
|
+
attr_reader :raw
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
@parser = Http::Parser.new
|
8
|
+
@raw = ''
|
9
|
+
end
|
10
|
+
|
11
|
+
def << data
|
12
|
+
@raw << data
|
13
|
+
@parser << data
|
14
|
+
end
|
15
|
+
|
16
|
+
def on_complete
|
17
|
+
@parser.on_message_complete = proc do
|
18
|
+
yield @raw
|
19
|
+
reset
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def reset
|
24
|
+
@parser.reset!
|
25
|
+
@raw.respond_to?(:clear) ? @raw.clear : @raw = ''
|
26
|
+
end
|
27
|
+
end
|
data/lib/tunnels/version.rb
CHANGED
data/tunnels.gemspec
CHANGED
@@ -20,5 +20,7 @@ Gem::Specification.new do |s|
|
|
20
20
|
# s.add_development_dependency "rspec"
|
21
21
|
s.add_development_dependency 'rspec'
|
22
22
|
s.add_development_dependency 'rr'
|
23
|
+
s.add_development_dependency 'rake'
|
23
24
|
s.add_runtime_dependency 'eventmachine'
|
25
|
+
s.add_runtime_dependency 'http_parser.rb'
|
24
26
|
end
|
metadata
CHANGED
@@ -1,101 +1,150 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: multitunnels
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 19
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 1
|
8
|
+
- 0
|
9
|
+
- 2
|
10
|
+
version: 1.0.2
|
5
11
|
platform: ruby
|
6
|
-
authors:
|
12
|
+
authors:
|
7
13
|
- jugyo
|
8
14
|
- bachue
|
9
15
|
autorequire:
|
10
16
|
bindir: bin
|
11
17
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
18
|
+
|
19
|
+
date: 2014-06-06 00:00:00 +08:00
|
20
|
+
default_executable:
|
21
|
+
dependencies:
|
22
|
+
- !ruby/object:Gem::Dependency
|
15
23
|
name: rspec
|
16
|
-
requirement: !ruby/object:Gem::Requirement
|
17
|
-
requirements:
|
18
|
-
- - ">="
|
19
|
-
- !ruby/object:Gem::Version
|
20
|
-
version: '0'
|
21
|
-
type: :development
|
22
24
|
prerelease: false
|
23
|
-
|
24
|
-
|
25
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
27
|
+
requirements:
|
25
28
|
- - ">="
|
26
|
-
- !ruby/object:Gem::Version
|
27
|
-
|
28
|
-
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
hash: 3
|
31
|
+
segments:
|
32
|
+
- 0
|
33
|
+
version: "0"
|
34
|
+
type: :development
|
35
|
+
version_requirements: *id001
|
36
|
+
- !ruby/object:Gem::Dependency
|
29
37
|
name: rr
|
30
|
-
|
31
|
-
|
38
|
+
prerelease: false
|
39
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
32
42
|
- - ">="
|
33
|
-
- !ruby/object:Gem::Version
|
34
|
-
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
hash: 3
|
45
|
+
segments:
|
46
|
+
- 0
|
47
|
+
version: "0"
|
35
48
|
type: :development
|
49
|
+
version_requirements: *id002
|
50
|
+
- !ruby/object:Gem::Dependency
|
51
|
+
name: rake
|
36
52
|
prerelease: false
|
37
|
-
|
38
|
-
|
53
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
54
|
+
none: false
|
55
|
+
requirements:
|
39
56
|
- - ">="
|
40
|
-
- !ruby/object:Gem::Version
|
41
|
-
|
42
|
-
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
hash: 3
|
59
|
+
segments:
|
60
|
+
- 0
|
61
|
+
version: "0"
|
62
|
+
type: :development
|
63
|
+
version_requirements: *id003
|
64
|
+
- !ruby/object:Gem::Dependency
|
43
65
|
name: eventmachine
|
44
|
-
|
45
|
-
|
66
|
+
prerelease: false
|
67
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
68
|
+
none: false
|
69
|
+
requirements:
|
46
70
|
- - ">="
|
47
|
-
- !ruby/object:Gem::Version
|
48
|
-
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
hash: 3
|
73
|
+
segments:
|
74
|
+
- 0
|
75
|
+
version: "0"
|
49
76
|
type: :runtime
|
77
|
+
version_requirements: *id004
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: http_parser.rb
|
50
80
|
prerelease: false
|
51
|
-
|
52
|
-
|
81
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
82
|
+
none: false
|
83
|
+
requirements:
|
53
84
|
- - ">="
|
54
|
-
- !ruby/object:Gem::Version
|
55
|
-
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
hash: 3
|
87
|
+
segments:
|
88
|
+
- 0
|
89
|
+
version: "0"
|
90
|
+
type: :runtime
|
91
|
+
version_requirements: *id005
|
56
92
|
description: This tunnels http/https to http/https.
|
57
|
-
email:
|
93
|
+
email:
|
58
94
|
- jugyo.org@gmail.com
|
59
95
|
- bachue.shu@gmail.com
|
60
|
-
executables:
|
96
|
+
executables:
|
61
97
|
- multitunnels
|
62
98
|
extensions: []
|
99
|
+
|
63
100
|
extra_rdoc_files: []
|
64
|
-
|
65
|
-
|
101
|
+
|
102
|
+
files:
|
103
|
+
- .gitignore
|
66
104
|
- Gemfile
|
67
105
|
- README.md
|
68
106
|
- Rakefile
|
69
107
|
- bin/multitunnels
|
70
108
|
- lib/tunnels.rb
|
109
|
+
- lib/tunnels/parser.rb
|
71
110
|
- lib/tunnels/version.rb
|
72
111
|
- spec/spec_helper.rb
|
73
112
|
- spec/tunnels_spec.rb
|
74
113
|
- tunnels.gemspec
|
114
|
+
has_rdoc: true
|
75
115
|
homepage: https://github.com/bachue/tunnels
|
76
116
|
licenses: []
|
77
|
-
|
117
|
+
|
78
118
|
post_install_message:
|
79
119
|
rdoc_options: []
|
80
|
-
|
120
|
+
|
121
|
+
require_paths:
|
81
122
|
- lib
|
82
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
83
|
-
|
123
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
124
|
+
none: false
|
125
|
+
requirements:
|
84
126
|
- - ">="
|
85
|
-
- !ruby/object:Gem::Version
|
86
|
-
|
87
|
-
|
88
|
-
|
127
|
+
- !ruby/object:Gem::Version
|
128
|
+
hash: 3
|
129
|
+
segments:
|
130
|
+
- 0
|
131
|
+
version: "0"
|
132
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
133
|
+
none: false
|
134
|
+
requirements:
|
89
135
|
- - ">="
|
90
|
-
- !ruby/object:Gem::Version
|
91
|
-
|
136
|
+
- !ruby/object:Gem::Version
|
137
|
+
hash: 3
|
138
|
+
segments:
|
139
|
+
- 0
|
140
|
+
version: "0"
|
92
141
|
requirements: []
|
142
|
+
|
93
143
|
rubyforge_project:
|
94
|
-
rubygems_version:
|
144
|
+
rubygems_version: 1.6.2
|
95
145
|
signing_key:
|
96
|
-
specification_version:
|
146
|
+
specification_version: 3
|
97
147
|
summary: https/http --(--)--> https/http
|
98
|
-
test_files:
|
148
|
+
test_files:
|
99
149
|
- spec/spec_helper.rb
|
100
150
|
- spec/tunnels_spec.rb
|
101
|
-
has_rdoc:
|
checksums.yaml
DELETED
@@ -1,7 +0,0 @@
|
|
1
|
-
---
|
2
|
-
SHA1:
|
3
|
-
metadata.gz: 96d6b4eb916daf80561c9c02514753883c61e322
|
4
|
-
data.tar.gz: 66b3abbe084a87245b39245ed0ca7fb41f6118d6
|
5
|
-
SHA512:
|
6
|
-
metadata.gz: f3cf787c20df1330aa7340996132a39bd752e8d53d6a9b2e5d4ac8522186ee2b3827b62f5e51b25400f17b2bb4590efaaca1e41d482c98df2b0be212c609d0f0
|
7
|
-
data.tar.gz: a29d6e85a28278d081d6dfd3e9717b9e6823a0f9409e3787d628d467c3e0cdd369693f9425827eb769ddf8206c826e859ea958e2ea385c93a974cc69666e6f5f
|