girl 0.67.0 → 0.71.1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of girl might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/girl.gemspec +0 -5
- data/lib/girl/head.rb +13 -16
- data/lib/girl/proxy.rb +24 -18
- data/lib/girl/proxy_worker.rb +52 -79
- data/lib/girl/proxyd.rb +2 -14
- data/lib/girl/proxyd_worker.rb +36 -65
- data/lib/girl/version.rb +1 -1
- metadata +2 -7
- data/lib/girl/hex.rb +0 -24
- data/lib/girl/resolv.rb +0 -200
- data/lib/girl/resolvd.rb +0 -169
- data/lib/girl/tun.rb +0 -997
- data/lib/girl/tund.rb +0 -897
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 82b6edf01d2b2157f11757d1a39b2f774507f114e0638aed6192ee19b29b03d5
|
4
|
+
data.tar.gz: 6253f10b1525763929b083e51a7693516e82ab34d2dfd374beae48e4305cf550
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c4d9edc69891b09e920bf27b6ad664f1243b41a182192fe26f1264ef83ebdd733c77e19d833d89f379cd63b98de62ec46a459b5be7a2238372ab0347298c3e6f
|
7
|
+
data.tar.gz: f3e6491a9267fb9eeef29457a6be5a74da026f1d7a37a89391eb8dec8b160e1a3d7d2eb5170acefd5aabcc792ac45e5c9bf0b8d49661654b158e5f3012d1d75a
|
data/girl.gemspec
CHANGED
@@ -19,17 +19,12 @@ girl.gemspec
|
|
19
19
|
lib/girl.rb
|
20
20
|
lib/girl/custom.rb
|
21
21
|
lib/girl/head.rb
|
22
|
-
lib/girl/hex.rb
|
23
22
|
lib/girl/proxy_custom.rb
|
24
23
|
lib/girl/proxy_worker.rb
|
25
24
|
lib/girl/proxy.rb
|
26
25
|
lib/girl/proxyd_custom.rb
|
27
26
|
lib/girl/proxyd_worker.rb
|
28
27
|
lib/girl/proxyd.rb
|
29
|
-
lib/girl/resolv.rb
|
30
|
-
lib/girl/resolvd.rb
|
31
|
-
lib/girl/tun.rb
|
32
|
-
lib/girl/tund.rb
|
33
28
|
lib/girl/udp.rb
|
34
29
|
lib/girl/udpd.rb
|
35
30
|
lib/girl/version.rb
|
data/lib/girl/head.rb
CHANGED
@@ -1,18 +1,17 @@
|
|
1
1
|
module Girl
|
2
|
-
PACK_SIZE = 1328
|
3
|
-
CHUNK_SIZE = PACK_SIZE * 1000
|
4
|
-
WBUFFS_LIMIT = 1000
|
5
|
-
WMEMS_LIMIT = 100_000
|
6
|
-
RESUME_BELOW = 50_000
|
7
|
-
EXPIRE_NEW = 10
|
8
|
-
EXPIRE_AFTER = 300
|
9
|
-
CHECK_EXPIRE_INTERVAL = 30
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
RESOLV_CACHE_EXPIRE = 300 # dns查询结果缓存多久过期
|
2
|
+
PACK_SIZE = 1328 # 包大小 1400(console MTU) - 8(PPPoE header) - 40(IPv6 header) - 8(UDP header) - 8(pack id) - 8(src id) = 1328
|
3
|
+
CHUNK_SIZE = PACK_SIZE * 1000 # 块大小
|
4
|
+
WBUFFS_LIMIT = 1000 # 写前上限,超过上限结一个块
|
5
|
+
WMEMS_LIMIT = 100_000 # 写后上限,达到上限暂停写
|
6
|
+
RESUME_BELOW = 50_000 # 降到多少以下恢复写
|
7
|
+
EXPIRE_NEW = 10 # 创建之后多久没有流量进来,过期
|
8
|
+
EXPIRE_AFTER = 300 # 多久没有新流量,过期
|
9
|
+
CHECK_EXPIRE_INTERVAL = 30 # 检查过期间隔
|
10
|
+
STATUS_INTERVAL = 0.5 # 发送状态间隔
|
11
|
+
SEND_STATUS_UNTIL = 10 # 持续的告之对面状态,直到没有流量往来,持续多少秒
|
12
|
+
BREAK_SEND_MISS = 10_000 # miss包个数上限,达到上限忽略要后面的段,可控碎片缓存
|
13
|
+
CONFUSE_UNTIL = 5 # 混淆前几个包
|
14
|
+
RESOLV_CACHE_EXPIRE = 300 # dns查询结果缓存多久过期
|
16
15
|
TUND_PORT = 1
|
17
16
|
HEARTBEAT = 2
|
18
17
|
A_NEW_SOURCE = 3
|
@@ -26,8 +25,6 @@ module Girl
|
|
26
25
|
GOT_FIN2 = 11
|
27
26
|
TUND_FIN = 12
|
28
27
|
TUN_FIN = 13
|
29
|
-
CTL_CLOSE = 1
|
30
|
-
CTL_RESUME = 2
|
31
28
|
HTTP_OK = "HTTP/1.1 200 OK\r\n\r\n"
|
32
29
|
# https://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml
|
33
30
|
RESERVED_ROUTE = <<EOF
|
data/lib/girl/proxy.rb
CHANGED
@@ -23,29 +23,37 @@ require 'socket'
|
|
23
23
|
#
|
24
24
|
# tun-tund:
|
25
25
|
#
|
26
|
-
# Q>: 0 ctlmsg -> C: 2 heartbeat
|
27
|
-
# 3 a new
|
28
|
-
# 4 paired
|
29
|
-
# 5
|
30
|
-
# 6
|
31
|
-
# 7 miss
|
32
|
-
# 8 fin1
|
26
|
+
# Q>: 0 ctlmsg -> C: 2 heartbeat -> C: random char
|
27
|
+
# 3 a new source -> Q>: src id -> encoded destination address
|
28
|
+
# 4 paired -> Q>: src id -> n: dst port
|
29
|
+
# 5 dest status -> n: dst port -> Q>: biggest relayed dst pack id -> Q>: continue src pack id
|
30
|
+
# 6 source status -> Q>: src id -> Q>: biggest relayed src pack id -> Q>: continue dst pack id
|
31
|
+
# 7 miss -> Q>/n: src id / dst port -> Q>: pack id begin -> Q>: pack id end
|
32
|
+
# 8 fin1 -> Q>/n: src id / dst port -> Q>: biggest src pack id / biggest dst pack id -> Q>: continue dst pack id / continue src pack id
|
33
33
|
# 9 not use
|
34
|
-
# 10 fin2
|
34
|
+
# 10 fin2 -> Q>/n: src id / dst port
|
35
35
|
# 11 not use
|
36
36
|
# 12 tund fin
|
37
37
|
# 13 tun fin
|
38
38
|
#
|
39
|
-
# Q>: 1+ pack_id -> Q
|
39
|
+
# Q>: 1+ pack_id -> Q>/n: src id / dst port -> traffic
|
40
40
|
#
|
41
41
|
# close logic
|
42
42
|
# ===========
|
43
43
|
#
|
44
44
|
# 1-1. after close src -> dst closed ? no -> send fin1
|
45
|
-
# 1-2. recv fin2 -> del src ext
|
45
|
+
# 1-2. tun recv fin2 -> del src ext
|
46
46
|
#
|
47
|
-
# 2-1. recv
|
48
|
-
# 2-2.
|
47
|
+
# 2-1. tun recv fin1 -> all traffic received ? -> close src after write
|
48
|
+
# 2-2. tun recv traffic -> dst closed and all traffic received ? -> close src after write
|
49
|
+
# 2-3. after close src -> dst closed ? yes -> del src ext -> send fin2
|
50
|
+
#
|
51
|
+
# 3-1. after close dst -> src closed ? no -> send fin1
|
52
|
+
# 3-2. tund recv fin2 -> del dst ext
|
53
|
+
#
|
54
|
+
# 4-1. tund recv fin1 -> all traffic received ? -> close dst after write
|
55
|
+
# 4-2. tund recv traffic -> src closed and all traffic received ? -> close dst after write
|
56
|
+
# 4-3. after close dst -> src closed ? yes -> del dst ext -> send fin2
|
49
57
|
#
|
50
58
|
module Girl
|
51
59
|
class Proxy
|
@@ -121,21 +129,19 @@ module Girl
|
|
121
129
|
end
|
122
130
|
|
123
131
|
src_chunk_dir = File.join( proxy_tmp_dir, 'src.chunk' )
|
124
|
-
dst_chunk_dir = File.join( proxy_tmp_dir, 'dst.chunk' )
|
125
|
-
tun_chunk_dir = File.join( proxy_tmp_dir, 'tun.chunk' )
|
126
|
-
|
127
|
-
unless Dir.exist?( proxy_tmp_dir )
|
128
|
-
Dir.mkdir( proxy_tmp_dir )
|
129
|
-
end
|
130
132
|
|
131
133
|
unless Dir.exist?( src_chunk_dir )
|
132
134
|
Dir.mkdir( src_chunk_dir )
|
133
135
|
end
|
134
136
|
|
137
|
+
dst_chunk_dir = File.join( proxy_tmp_dir, 'dst.chunk' )
|
138
|
+
|
135
139
|
unless Dir.exist?( dst_chunk_dir )
|
136
140
|
Dir.mkdir( dst_chunk_dir )
|
137
141
|
end
|
138
142
|
|
143
|
+
tun_chunk_dir = File.join( proxy_tmp_dir, 'tun.chunk' )
|
144
|
+
|
139
145
|
unless Dir.exist?( tun_chunk_dir )
|
140
146
|
Dir.mkdir( tun_chunk_dir )
|
141
147
|
end
|
data/lib/girl/proxy_worker.rb
CHANGED
@@ -168,8 +168,7 @@ module Girl
|
|
168
168
|
|
169
169
|
@tun_info[ :src_exts ].each do | src_id, src_ext |
|
170
170
|
if src_ext[ :dst_port ] && ( now - src_ext[ :last_continue_at ] < SEND_STATUS_UNTIL )
|
171
|
-
|
172
|
-
data = [ 0, SOURCE_STATUS, src_id, src_ext[ :biggest_pack_id ], src_ext[ :continue_dst_pack_id ] ].pack( 'Q>CQ>Q>Q>' )
|
171
|
+
data = [ 0, SOURCE_STATUS, src_id, src_ext[ :relay_pack_id ], src_ext[ :continue_dst_pack_id ] ].pack( 'Q>CQ>Q>Q>' )
|
173
172
|
add_tun_ctlmsg( data )
|
174
173
|
need_trigger = true
|
175
174
|
end
|
@@ -180,11 +179,6 @@ module Girl
|
|
180
179
|
puts "p#{ Process.pid } #{ Time.new } resume tun"
|
181
180
|
@tun_info[ :paused ] = false
|
182
181
|
add_write( @tun )
|
183
|
-
|
184
|
-
@tun_info[ :src_exts ].each do | _, src_ext |
|
185
|
-
add_write( src_ext[ :src ] )
|
186
|
-
end
|
187
|
-
|
188
182
|
need_trigger = true
|
189
183
|
end
|
190
184
|
|
@@ -322,8 +316,8 @@ module Girl
|
|
322
316
|
port: port, # 端口
|
323
317
|
ctlmsg_rbuffs: [], # 还没配上tund,暂存的ctlmsg
|
324
318
|
ctlmsgs: [], # [ to_addr, data ]
|
325
|
-
wbuffs: [], # 写前缓存 [ src_id, data ]
|
326
|
-
caches: [], # 块读出缓存 [ src_id, data ]
|
319
|
+
wbuffs: [], # 写前缓存 [ src_id, pack_id, data ]
|
320
|
+
caches: [], # 块读出缓存 [ src_id, pack_id, data ]
|
327
321
|
chunks: [], # 块队列 filename
|
328
322
|
spring: 0, # 块后缀,结块时,如果块队列不为空,则自增,为空,则置为0
|
329
323
|
tund_addr: nil, # tund地址
|
@@ -388,17 +382,13 @@ module Girl
|
|
388
382
|
src_info[ :dst ] = dst
|
389
383
|
|
390
384
|
if src_info[ :proxy_proto ] == :http
|
391
|
-
|
392
|
-
|
393
|
-
if datas.empty?
|
394
|
-
# CONNECT
|
385
|
+
if src_info[ :is_connect ]
|
395
386
|
# puts "debug1 add src wbuff http ok"
|
396
387
|
add_src_wbuff( src, HTTP_OK )
|
397
388
|
else
|
398
|
-
# not CONNECT
|
399
389
|
# puts "debug1 add src rbuffs to dst wbuff"
|
400
390
|
|
401
|
-
|
391
|
+
src_info[ :rbuffs ].each do | _, data |
|
402
392
|
add_dst_wbuff( dst, data )
|
403
393
|
end
|
404
394
|
end
|
@@ -420,11 +410,11 @@ module Girl
|
|
420
410
|
dst_port: nil, # 远端dst端口
|
421
411
|
wmems: {}, # 写后 pack_id => data
|
422
412
|
send_ats: {}, # 上一次发出时间 pack_id => send_at
|
423
|
-
|
413
|
+
relay_pack_id: 0, # 转发到几
|
424
414
|
continue_dst_pack_id: 0, # 收到几
|
425
415
|
pieces: {}, # 跳号包 dst_pack_id => data
|
426
|
-
is_dst_closed: false, #
|
427
|
-
biggest_dst_pack_id: 0, #
|
416
|
+
is_dst_closed: false, # dst是否已关闭
|
417
|
+
biggest_dst_pack_id: 0, # dst最大包号码
|
428
418
|
completed_pack_id: 0, # 完成到几(对面收到几)
|
429
419
|
last_continue_at: Time.new # 创建,或者上一次收到连续流量,或者发出新包的时间
|
430
420
|
}
|
@@ -496,17 +486,17 @@ module Girl
|
|
496
486
|
##
|
497
487
|
# add tun wbuff
|
498
488
|
#
|
499
|
-
def add_tun_wbuff( src_id, data )
|
500
|
-
@tun_info[ :wbuffs ] << [ src_id, data ]
|
489
|
+
def add_tun_wbuff( src_id, pack_id, data )
|
490
|
+
@tun_info[ :wbuffs ] << [ src_id, pack_id, data ]
|
501
491
|
|
502
492
|
if @tun_info[ :wbuffs ].size >= WBUFFS_LIMIT
|
503
493
|
spring = @tun_info[ :chunks ].size > 0 ? ( @tun_info[ :spring ] + 1 ) : 0
|
504
494
|
filename = "#{ Process.pid }-#{ @tun_info[ :port ] }.#{ spring }"
|
505
495
|
chunk_path = File.join( @tun_chunk_dir, filename )
|
506
|
-
|
496
|
+
datas = @tun_info[ :wbuffs ].map{ | _src_id, _pack_id, _data | [ [ _src_id, _pack_id, _data.bytesize ].pack( 'Q>Q>n' ), _data ].join }
|
507
497
|
|
508
498
|
begin
|
509
|
-
IO.binwrite( chunk_path,
|
499
|
+
IO.binwrite( chunk_path, datas.join )
|
510
500
|
rescue Errno::ENOSPC => e
|
511
501
|
puts "p#{ Process.pid } #{ Time.new } #{ e.class }, close tun"
|
512
502
|
set_is_closing( @tun )
|
@@ -592,7 +582,7 @@ module Girl
|
|
592
582
|
# add write
|
593
583
|
#
|
594
584
|
def add_write( sock )
|
595
|
-
|
585
|
+
if sock && !sock.closed? && !@writes.include?( sock )
|
596
586
|
@writes << sock
|
597
587
|
end
|
598
588
|
end
|
@@ -645,13 +635,13 @@ module Girl
|
|
645
635
|
return if src_ext.nil? || src_ext[ :dst_port ].nil?
|
646
636
|
|
647
637
|
if src_ext[ :is_dst_closed ]
|
648
|
-
# puts "debug1 2-
|
638
|
+
# puts "debug1 2-3. after close src -> dst closed ? yes -> del src ext -> send fin2"
|
649
639
|
del_src_ext( src_id )
|
650
640
|
data = [ 0, FIN2, src_id ].pack( 'Q>CQ>' )
|
651
641
|
add_tun_ctlmsg( data )
|
652
642
|
else
|
653
643
|
# puts "debug1 1-1. after close src -> dst closed ? no -> send fin1"
|
654
|
-
data = [ 0, FIN1, src_id,
|
644
|
+
data = [ 0, FIN1, src_id, src_info[ :biggest_pack_id ], src_ext[ :continue_dst_pack_id ] ].pack( 'Q>CQ>Q>Q>' )
|
655
645
|
add_tun_ctlmsg( data )
|
656
646
|
end
|
657
647
|
elsif src_info[ :proxy_type ] == :direct
|
@@ -768,15 +758,7 @@ module Girl
|
|
768
758
|
|
769
759
|
if data.empty?
|
770
760
|
if src_info[ :is_closing ]
|
771
|
-
|
772
|
-
close_src( src )
|
773
|
-
elsif @tun_info[ :paused ]
|
774
|
-
@writes.delete( src )
|
775
|
-
elsif !@writes.include?( @tun )
|
776
|
-
# 转发光了,正式关闭
|
777
|
-
# puts "debug2 close src after tun empty"
|
778
|
-
close_src( src )
|
779
|
-
end
|
761
|
+
close_src( src )
|
780
762
|
else
|
781
763
|
@writes.delete( src )
|
782
764
|
end
|
@@ -907,7 +889,7 @@ module Girl
|
|
907
889
|
|
908
890
|
# 取写前
|
909
891
|
if @tun_info[ :caches ].any?
|
910
|
-
src_id, data = @tun_info[ :caches ].first
|
892
|
+
src_id, pack_id, data = @tun_info[ :caches ].first
|
911
893
|
from = :caches
|
912
894
|
elsif @tun_info[ :chunks ].any?
|
913
895
|
path = File.join( @tun_chunk_dir, @tun_info[ :chunks ].shift )
|
@@ -924,16 +906,16 @@ module Girl
|
|
924
906
|
caches = []
|
925
907
|
|
926
908
|
until data.empty?
|
927
|
-
_src_id, pack_size = data[ 0,
|
928
|
-
caches << [ _src_id, data[
|
929
|
-
data = data[ (
|
909
|
+
_src_id, _pack_id, pack_size = data[ 0, 18 ].unpack( 'Q>Q>n' )
|
910
|
+
caches << [ _src_id, _pack_id, data[ 18, pack_size ] ]
|
911
|
+
data = data[ ( 18 + pack_size )..-1 ]
|
930
912
|
end
|
931
913
|
|
932
914
|
@tun_info[ :caches ] = caches
|
933
|
-
src_id, data = caches.first
|
915
|
+
src_id, pack_id, data = caches.first
|
934
916
|
from = :caches
|
935
917
|
elsif @tun_info[ :wbuffs ].any?
|
936
|
-
src_id, data = @tun_info[ :wbuffs ].first
|
918
|
+
src_id, pack_id, data = @tun_info[ :wbuffs ].first
|
937
919
|
from = :wbuffs
|
938
920
|
else
|
939
921
|
@writes.delete( tun )
|
@@ -943,8 +925,6 @@ module Girl
|
|
943
925
|
src_ext = @tun_info[ :src_exts ][ src_id ]
|
944
926
|
|
945
927
|
if src_ext
|
946
|
-
pack_id = src_ext[ :biggest_pack_id ] + 1
|
947
|
-
|
948
928
|
if pack_id <= CONFUSE_UNTIL
|
949
929
|
data = @custom.encode( data )
|
950
930
|
# puts "debug1 encoded pack #{ pack_id }"
|
@@ -959,7 +939,7 @@ module Girl
|
|
959
939
|
end
|
960
940
|
|
961
941
|
# puts "debug2 written pack #{ pack_id }"
|
962
|
-
src_ext[ :
|
942
|
+
src_ext[ :relay_pack_id ] = pack_id
|
963
943
|
src_ext[ :wmems ][ pack_id ] = data
|
964
944
|
src_ext[ :send_ats ][ pack_id ] = now
|
965
945
|
src_ext[ :last_continue_at ] = now
|
@@ -995,7 +975,9 @@ module Girl
|
|
995
975
|
dst: nil, # :direct的场合,对应的dst
|
996
976
|
destination_domain: nil, # 目的地域名
|
997
977
|
destination_port: nil, # 目的地端口
|
998
|
-
|
978
|
+
biggest_pack_id: 0, # 最大包号码
|
979
|
+
is_connect: true, # 代理协议是http的场合,是否是CONNECT
|
980
|
+
rbuffs: [], # 非CONNECT,dst或者远端dst未准备好,暂存流量 [ pack_id, data ]
|
999
981
|
wbuff: '', # 写前
|
1000
982
|
cache: '', # 块读出缓存
|
1001
983
|
chunks: [], # 块队列,写前达到块大小时结一个块 filename
|
@@ -1092,7 +1074,10 @@ module Girl
|
|
1092
1074
|
end
|
1093
1075
|
end
|
1094
1076
|
|
1095
|
-
src_info[ :
|
1077
|
+
src_info[ :is_connect ] = false
|
1078
|
+
pack_id = src_info[ :biggest_pack_id ] + 1
|
1079
|
+
src_info[ :biggest_pack_id ] = pack_id
|
1080
|
+
src_info[ :rbuffs ] << [ pack_id, data ]
|
1096
1081
|
end
|
1097
1082
|
|
1098
1083
|
domain, port = domain_and_port.split( ':' )
|
@@ -1105,7 +1090,9 @@ module Girl
|
|
1105
1090
|
resolve_domain( src, domain )
|
1106
1091
|
when :checking
|
1107
1092
|
# puts "debug1 add src rbuff while checking #{ data.inspect }"
|
1108
|
-
src_info[ :
|
1093
|
+
pack_id = src_info[ :biggest_pack_id ] + 1
|
1094
|
+
src_info[ :biggest_pack_id ] = pack_id
|
1095
|
+
src_info[ :rbuffs ] << [ pack_id, data ]
|
1109
1096
|
when :negotiation
|
1110
1097
|
# +----+-----+-------+------+----------+----------+
|
1111
1098
|
# |VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT |
|
@@ -1152,6 +1139,9 @@ module Girl
|
|
1152
1139
|
return
|
1153
1140
|
end
|
1154
1141
|
|
1142
|
+
pack_id = src_info[ :biggest_pack_id ] + 1
|
1143
|
+
src_info[ :biggest_pack_id ] = pack_id
|
1144
|
+
|
1155
1145
|
if src_ext[ :dst_port ]
|
1156
1146
|
if @tun.closed?
|
1157
1147
|
# puts "debug1 tun closed, close src"
|
@@ -1159,14 +1149,14 @@ module Girl
|
|
1159
1149
|
return
|
1160
1150
|
end
|
1161
1151
|
|
1162
|
-
|
1152
|
+
unless src_info[ :is_connect ]
|
1163
1153
|
data, _ = sub_http_request( data )
|
1164
1154
|
end
|
1165
1155
|
|
1166
|
-
add_tun_wbuff( src_id, data )
|
1156
|
+
add_tun_wbuff( src_id, pack_id, data )
|
1167
1157
|
else
|
1168
1158
|
# puts "debug1 remote dst not ready, save data to src rbuff"
|
1169
|
-
src_info[ :rbuffs ] << data
|
1159
|
+
src_info[ :rbuffs ] << [ pack_id, data ]
|
1170
1160
|
end
|
1171
1161
|
when :direct
|
1172
1162
|
dst = src_info[ :dst ]
|
@@ -1178,14 +1168,14 @@ module Girl
|
|
1178
1168
|
return
|
1179
1169
|
end
|
1180
1170
|
|
1181
|
-
|
1171
|
+
unless src_info[ :is_connect ]
|
1182
1172
|
data, _ = sub_http_request( data )
|
1183
1173
|
end
|
1184
1174
|
|
1185
1175
|
add_dst_wbuff( dst, data )
|
1186
1176
|
else
|
1187
1177
|
# puts "debug1 dst not ready, save data to src rbuff"
|
1188
|
-
src_info[ :rbuffs ] << data
|
1178
|
+
src_info[ :rbuffs ] << [ nil, data ]
|
1189
1179
|
end
|
1190
1180
|
end
|
1191
1181
|
end
|
@@ -1271,18 +1261,14 @@ module Girl
|
|
1271
1261
|
src_info = @src_infos[ src ]
|
1272
1262
|
|
1273
1263
|
if src_info[ :proxy_proto ] == :http
|
1274
|
-
|
1275
|
-
|
1276
|
-
if datas.empty?
|
1277
|
-
# CONNECT
|
1264
|
+
if src_info[ :is_connect ]
|
1278
1265
|
# puts "debug1 add src wbuff http ok"
|
1279
1266
|
add_src_wbuff( src, HTTP_OK )
|
1280
1267
|
else
|
1281
|
-
# not CONNECT
|
1282
1268
|
# puts "debug1 add src rbuffs to tun wbuffs"
|
1283
1269
|
|
1284
|
-
|
1285
|
-
add_tun_wbuff( src_id, _data )
|
1270
|
+
src_info[ :rbuffs ].each do | pack_id, _data |
|
1271
|
+
add_tun_wbuff( src_id, pack_id, _data )
|
1286
1272
|
end
|
1287
1273
|
end
|
1288
1274
|
elsif src_info[ :proxy_proto ] == :socks5
|
@@ -1291,7 +1277,7 @@ module Girl
|
|
1291
1277
|
when DEST_STATUS
|
1292
1278
|
return if from_addr != @tun_info[ :tund_addr ]
|
1293
1279
|
|
1294
|
-
dst_port,
|
1280
|
+
dst_port, relay_dst_pack_id, continue_src_pack_id = data[ 9, 18 ].unpack( 'nQ>Q>' )
|
1295
1281
|
|
1296
1282
|
src_id = @tun_info[ :src_ids ][ dst_port ]
|
1297
1283
|
return unless src_id
|
@@ -1301,22 +1287,10 @@ module Girl
|
|
1301
1287
|
|
1302
1288
|
# puts "debug2 got dest status"
|
1303
1289
|
|
1304
|
-
# 更新对面发到几
|
1305
|
-
if biggest_dst_pack_id > src_ext[ :biggest_dst_pack_id ]
|
1306
|
-
# puts "debug2 update biggest dst pack #{ biggest_dst_pack_id }"
|
1307
|
-
src_ext[ :biggest_dst_pack_id ] = biggest_dst_pack_id
|
1308
|
-
|
1309
|
-
# 接到对面状态,若对面已关闭,且最后一个包已经进写前,关闭src
|
1310
|
-
if src_ext[ :is_dst_closed ] && ( biggest_dst_pack_id == src_ext[ :continue_dst_pack_id ] )
|
1311
|
-
# puts "debug1 2-1. recv traffic/fin1/dst status -> dst closed and all traffic received ? -> close src after write"
|
1312
|
-
set_is_closing( src_ext[ :src ] )
|
1313
|
-
end
|
1314
|
-
end
|
1315
|
-
|
1316
1290
|
release_wmems( src_ext, continue_src_pack_id )
|
1317
1291
|
|
1318
1292
|
# 发miss
|
1319
|
-
if !src_ext[ :src ].closed? && ( src_ext[ :continue_dst_pack_id ] <
|
1293
|
+
if !src_ext[ :src ].closed? && ( src_ext[ :continue_dst_pack_id ] < relay_dst_pack_id )
|
1320
1294
|
ranges = []
|
1321
1295
|
curr_pack_id = src_ext[ :continue_dst_pack_id ] + 1
|
1322
1296
|
|
@@ -1328,12 +1302,12 @@ module Girl
|
|
1328
1302
|
curr_pack_id = pack_id + 1
|
1329
1303
|
end
|
1330
1304
|
|
1331
|
-
if curr_pack_id <=
|
1332
|
-
ranges << [ curr_pack_id,
|
1305
|
+
if curr_pack_id <= relay_dst_pack_id
|
1306
|
+
ranges << [ curr_pack_id, relay_dst_pack_id ]
|
1333
1307
|
end
|
1334
1308
|
|
1335
1309
|
pack_count = 0
|
1336
|
-
# puts "debug1 continue/
|
1310
|
+
# puts "debug1 continue/relay #{ src_ext[ :continue_dst_pack_id ] }/#{ relay_dst_pack_id } send MISS #{ ranges.size }"
|
1337
1311
|
|
1338
1312
|
ranges.each do | pack_id_begin, pack_id_end |
|
1339
1313
|
if pack_count >= BREAK_SEND_MISS
|
@@ -1380,9 +1354,8 @@ module Girl
|
|
1380
1354
|
src_ext[ :biggest_dst_pack_id ] = biggest_dst_pack_id
|
1381
1355
|
release_wmems( src_ext, continue_src_pack_id )
|
1382
1356
|
|
1383
|
-
# 接到对面已关闭,若最后一个包已经进写前,关闭src
|
1384
1357
|
if ( biggest_dst_pack_id == src_ext[ :continue_dst_pack_id ] )
|
1385
|
-
# puts "debug1 2-1. recv fin1 ->
|
1358
|
+
# puts "debug1 2-1. tun recv fin1 -> all traffic received ? -> close src after write"
|
1386
1359
|
set_is_closing( src_ext[ :src ] )
|
1387
1360
|
end
|
1388
1361
|
when FIN2
|
@@ -1393,7 +1366,7 @@ module Girl
|
|
1393
1366
|
src_id = @tun_info[ :src_ids ][ dst_port ]
|
1394
1367
|
return unless src_id
|
1395
1368
|
|
1396
|
-
# puts "debug1 1-2. recv fin2 -> del src ext"
|
1369
|
+
# puts "debug1 1-2. tun recv fin2 -> del src ext"
|
1397
1370
|
del_src_ext( src_id )
|
1398
1371
|
when TUND_FIN
|
1399
1372
|
return if from_addr != @tun_info[ :tund_addr ]
|
@@ -1439,7 +1412,7 @@ module Girl
|
|
1439
1412
|
|
1440
1413
|
# 接到流量,若对面已关闭,且流量正好收全,关闭src
|
1441
1414
|
if src_ext[ :is_dst_closed ] && ( pack_id == src_ext[ :biggest_dst_pack_id ] )
|
1442
|
-
# puts "debug1 2-
|
1415
|
+
# puts "debug1 2-2. tun recv traffic -> dst closed and all traffic received ? -> close src after write"
|
1443
1416
|
set_is_closing( src_ext[ :src ] )
|
1444
1417
|
end
|
1445
1418
|
else
|