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