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 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