lib/shadowsocks/local.rb in shadowsocks-0.6 vs lib/shadowsocks/local.rb in shadowsocks-0.7
- old
+ new
@@ -16,11 +16,28 @@
server.send_data decrypt(data)
outbound_scheduler
end
end
+ class DirectConnector < ::Shadowsocks::Tunnel
+ def post_init
+ p "connecting #{server.remote_addr[3..-1]} directly"
+ server.cached_pieces.each { |piece| send_data piece }
+ server.cached_pieces = []
+
+ server.stage = 5
+ end
+
+ def receive_data data
+ server.send_data data
+ outbound_scheduler
+ end
+ end
+
class LocalListener < ::Shadowsocks::Listener
+ attr_accessor :behind_gfw
+
private
def data_handler data
case stage
when 0
@@ -29,52 +46,49 @@
when 1
fireup_tunnel data
when 4
cached_pieces.push data
when 5
- connector.send_data(encrypt(data)) and return
+ to_send = \
+ if behind_gfw
+ data
+ else
+ encrypt(data)
+ end
+ connector.send_data(to_send) and return
end
end
def fireup_tunnel(data)
begin
unless data[1] == "\x01"
send_data "\x05\x07\x00\x01"
connection_cleanup and return
end
- @addr_to_send = data[3]
+ parse_data Shadowsocks::Parser::Local.new(data)
- resolve_addrtype data
-
send_data "\x05\x00\x00\x01\x00\x00\x00\x00" + [config.server_port].pack('s>')
@stage = 4
- @connector = EventMachine.connect config.server, config.server_port, ServerConnector, self, crypto
+ if config.chnroutes
+ @behind_gfw = @ip_detector.behind_gfw?(@remote_addr[3..-1])
+ end
+
+ if config.chnroutes == true and behind_gfw
+ @connector = EventMachine.connect @remote_addr[3..-1], @remote_port, DirectConnector, self, crypto
+ else
+ @connector = EventMachine.connect config.server, config.server_port, ServerConnector, self, crypto
+ end
+
if data.size > header_length
cached_pieces.push data[header_length, data.size]
end
rescue Exception => e
warn e
connection_cleanup
end
- end
-
- def resolve_addrtype data
- @addrtype = data[3]
- super
- end
-
- def domain_address data
- @addr_len = data[4].unpack('c')[0]
- @addr_to_send += data[4..5 + @addr_len + 2]
- super
- end
-
- def ip_address data
- @addr_to_send += data[4..9]
- super
end
end
end
end