em-proxy 0.1.2 → 0.1.3

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/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.2
1
+ 0.1.3
@@ -11,6 +11,7 @@ module EventMachine
11
11
 
12
12
  def connection_completed
13
13
  debug [@name, :conn_complete]
14
+ @plexer.connected(@name)
14
15
  @connected.succeed
15
16
  end
16
17
 
@@ -2,12 +2,12 @@ module EventMachine
2
2
  module ProxyServer
3
3
  class Connection < EventMachine::Connection
4
4
  attr_accessor :debug
5
-
5
+
6
6
  ##### Proxy Methods
7
7
  def on_data(&blk); @on_data = blk; end
8
8
  def on_response(&blk); @on_response = blk; end
9
9
  def on_finish(&blk); @on_finish = blk; end
10
- def on_connect(&blk); blk.call; end
10
+ def on_connect(&blk); @on_connect = blk; end
11
11
 
12
12
  ##### EventMachine
13
13
  def initialize(options)
@@ -17,7 +17,7 @@ module EventMachine
17
17
 
18
18
  def receive_data(data)
19
19
  debug [:connection, data]
20
- processed = @on_data.call(data)
20
+ processed = @on_data.call(data) if @on_data
21
21
 
22
22
  return if processed == :async or processed.nil?
23
23
  relay_to_servers(processed)
@@ -38,7 +38,7 @@ module EventMachine
38
38
  s.send_data data unless data.nil?
39
39
  end
40
40
  end
41
-
41
+
42
42
  #
43
43
  # initialize connections to backend servers
44
44
  #
@@ -57,7 +57,8 @@ module EventMachine
57
57
  # [ip, port] of the connected client
58
58
  #
59
59
  def peer
60
- @peer ||= Socket.unpack_sockaddr_in(get_peername).reverse
60
+ peername = get_peername
61
+ @peer ||= peername ? Socket.unpack_sockaddr_in(peername).reverse : nil
61
62
  end
62
63
 
63
64
  #
@@ -66,13 +67,18 @@ module EventMachine
66
67
  def relay_from_backend(name, data)
67
68
  debug [:relay_from_backend, name, data]
68
69
 
69
- data = @on_response.call(name, data)
70
+ data = @on_response.call(name, data) if @on_response
70
71
  send_data data unless data.nil?
71
72
  end
72
73
 
74
+ def connected(name)
75
+ debug [:connected]
76
+ @on_connect.call(name) if @on_connect
77
+ end
78
+
73
79
  def unbind
74
80
  debug [:unbind, :connection]
75
-
81
+
76
82
  # terminate any unfinished connections
77
83
  @servers.values.compact.each do |s|
78
84
  s.close_connection
@@ -85,7 +91,7 @@ module EventMachine
85
91
 
86
92
  # if all connections are terminated downstream, then notify client
87
93
  close_connection_after_writing if @servers.values.compact.size.zero?
88
-
94
+
89
95
  if @on_finish
90
96
  @on_finish.call(name)
91
97
 
@@ -95,7 +101,7 @@ module EventMachine
95
101
  end
96
102
 
97
103
  private
98
-
104
+
99
105
  def debug(*data)
100
106
  if @debug
101
107
  require 'pp'
data/spec/proxy_spec.rb CHANGED
@@ -26,11 +26,13 @@ describe Proxy do
26
26
  connected = false
27
27
  EM.run do
28
28
  EventMachine.add_timer(0.1) do
29
- EventMachine::HttpRequest.new('http://127.0.0.1:8080/test').get({:timeout => 1})
29
+ EventMachine::HttpRequest.new('http://127.0.0.1:8080/').get({:timeout => 1})
30
30
  end
31
31
 
32
32
  Proxy.start(:host => "0.0.0.0", :port => 8080) do |conn|
33
- conn.on_connect do
33
+ conn.server :goog, :host => "google.com", :port => 80
34
+
35
+ conn.on_connect do |name|
34
36
  connected = true
35
37
  EventMachine.stop
36
38
  end
@@ -62,7 +64,7 @@ describe Proxy do
62
64
  it "should duplex TCP traffic to two backends google & yahoo" do
63
65
  EM.run do
64
66
  EventMachine.add_timer(0.1) do
65
- EventMachine::HttpRequest.new('http://127.0.0.1:8080/').get({:timeout => 1})
67
+ EventMachine::HttpRequest.new('http://127.0.0.1:8080/test').get({:timeout => 1})
66
68
  end
67
69
 
68
70
  Proxy.start(:host => "0.0.0.0", :port => 8080) do |conn|
@@ -74,10 +76,10 @@ describe Proxy do
74
76
  conn.on_response do |backend, resp|
75
77
  case backend
76
78
  when :goog then
77
- resp.should =~ /google/
79
+ resp.should =~ /404/
78
80
  seen.push backend
79
81
  when :yhoo
80
- resp.should =~ /yahoo|yimg/
82
+ resp.should =~ /404/
81
83
  seen.push backend
82
84
  end
83
85
  seen.uniq!
@@ -134,12 +136,12 @@ describe Proxy do
134
136
  http =EventMachine::HttpRequest.new('http://127.0.0.1:8080/').get({:timeout => 1})
135
137
  http.callback { EventMachine.stop }
136
138
  end
137
-
139
+
138
140
  Proxy.start(:host => "0.0.0.0", :port => 8080) do |conn|
139
141
  conn.server :goog, :host => "google.com", :port => 80, :relay_client => true
140
142
  conn.on_data { |data| raise "Should not be here"; data }
141
143
  conn.on_response { |backend, resp| resp }
142
-
144
+
143
145
  end
144
146
  end
145
147
  }.should_not raise_error
@@ -152,12 +154,12 @@ describe Proxy do
152
154
  http =EventMachine::HttpRequest.new('http://127.0.0.1:8080/').get({:timeout => 1})
153
155
  http.callback { EventMachine.stop }
154
156
  end
155
-
157
+
156
158
  Proxy.start(:host => "0.0.0.0", :port => 8080) do |conn|
157
159
  conn.server :goog, :host => "google.com", :port => 80, :relay_server => true
158
160
  conn.on_data { |data| data }
159
161
  conn.on_response { |backend, resp| raise "Should not be here"; }
160
-
162
+
161
163
  end
162
164
  end
163
165
  }.should_not raise_error
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 1
8
- - 2
9
- version: 0.1.2
8
+ - 3
9
+ version: 0.1.3
10
10
  platform: ruby
11
11
  authors:
12
12
  - Ilya Grigorik
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-03-26 00:00:00 -04:00
17
+ date: 2010-05-29 00:00:00 -04:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -98,7 +98,6 @@ test_files:
98
98
  - examples/line_interceptor.rb
99
99
  - examples/port_forward.rb
100
100
  - examples/relay_port_forward.rb
101
- - examples/schemaless-mysql/client.rb
102
101
  - examples/schemaless-mysql/mysql_interceptor.rb
103
102
  - examples/selective_forward.rb
104
103
  - examples/smtp_spam_filter.rb
@@ -1,17 +0,0 @@
1
- require "rubygems"
2
- require "mysql" # gem install ruby-mysql -v 2.9.2
3
-
4
- my = Mysql.connect('127.0.0.1', 'root', '', 'noschema', 3307)
5
-
6
- p my.list_tables
7
- __END__
8
-
9
- # look ma, no schema! ooh yeah.
10
- my.query("create table posts")
11
-
12
- # insert a few records into our schemaless MySQL store... :-)
13
- my.query("insert into posts values('first post'('author', 'Ilya'),('nick', 'igrigorik'))")
14
- my.query("insert into posts values('author:Ilya','location:Waterloo')")
15
-
16
- my.query("select author from posts") { |r| puts r }
17
- my.query("select nick from posts") { |r| puts r }