multitunnels 1.0.1 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -56,6 +56,10 @@ As the name implies, you can create lots of proxies in one command (but do not f
56
56
 
57
57
  This command creates four proxies.
58
58
 
59
+ Compatibility
60
+ ---------
61
+ MRI Ruby >= 1.8.7
62
+
59
63
  Copyright
60
64
  ---------
61
65
 
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
- client = nil
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
- client.send_data data
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
- raise ClientError.new "Cannot support scheme: #{to_scheme}"
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
- raise(ClientError.new "Cannot find a client for #{host}:#{port}")
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
@@ -1,3 +1,3 @@
1
1
  module Tunnels
2
- VERSION = "1.0.1"
2
+ VERSION = "1.0.2"
3
3
  end
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
- version: 1.0.1
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
- date: 2014-06-05 00:00:00.000000000 Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
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
- version_requirements: !ruby/object:Gem::Requirement
24
- requirements:
25
+ requirement: &id001 !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
25
28
  - - ">="
26
- - !ruby/object:Gem::Version
27
- version: '0'
28
- - !ruby/object:Gem::Dependency
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
- requirement: !ruby/object:Gem::Requirement
31
- requirements:
38
+ prerelease: false
39
+ requirement: &id002 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
32
42
  - - ">="
33
- - !ruby/object:Gem::Version
34
- version: '0'
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
- version_requirements: !ruby/object:Gem::Requirement
38
- requirements:
53
+ requirement: &id003 !ruby/object:Gem::Requirement
54
+ none: false
55
+ requirements:
39
56
  - - ">="
40
- - !ruby/object:Gem::Version
41
- version: '0'
42
- - !ruby/object:Gem::Dependency
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
- requirement: !ruby/object:Gem::Requirement
45
- requirements:
66
+ prerelease: false
67
+ requirement: &id004 !ruby/object:Gem::Requirement
68
+ none: false
69
+ requirements:
46
70
  - - ">="
47
- - !ruby/object:Gem::Version
48
- version: '0'
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
- version_requirements: !ruby/object:Gem::Requirement
52
- requirements:
81
+ requirement: &id005 !ruby/object:Gem::Requirement
82
+ none: false
83
+ requirements:
53
84
  - - ">="
54
- - !ruby/object:Gem::Version
55
- version: '0'
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
- files:
65
- - ".gitignore"
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
- metadata: {}
117
+
78
118
  post_install_message:
79
119
  rdoc_options: []
80
- require_paths:
120
+
121
+ require_paths:
81
122
  - lib
82
- required_ruby_version: !ruby/object:Gem::Requirement
83
- requirements:
123
+ required_ruby_version: !ruby/object:Gem::Requirement
124
+ none: false
125
+ requirements:
84
126
  - - ">="
85
- - !ruby/object:Gem::Version
86
- version: '0'
87
- required_rubygems_version: !ruby/object:Gem::Requirement
88
- requirements:
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
- version: '0'
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: 2.2.2
144
+ rubygems_version: 1.6.2
95
145
  signing_key:
96
- specification_version: 4
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