girl 0.68.0 → 0.71.2
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 +51 -81
- data/lib/girl/proxyd.rb +2 -14
- data/lib/girl/proxyd_worker.rb +35 -64
- 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: 9770be339624c9742372d65ead4bc2c59a6f7559984bc9d95212b8beddf05787
|
4
|
+
data.tar.gz: f7ee6b87f034c447a169f1f41c606bd5a02c676525a40e82e74ff259b5090840
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f7798af85a3cfacf28179420f562dd1b65f10d839248c5075969005af42f44cd735f0181f558a7c76c89c70807200eb68e77a12193d49d8a86763b39bcce8962
|
7
|
+
data.tar.gz: 4b7841420ac86f88af4920eaae61d0f606de9f726ee2a458c51d6d2bd05bf7988fe97f574c0193cf81228b48ac0c89a1f81995d67593e6954125187b6236ad20
|
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
@@ -18,7 +18,6 @@ module Girl
|
|
18
18
|
@writes = []
|
19
19
|
@roles = {} # sock => :dotr / :proxy / :src / :dst / :tun
|
20
20
|
@src_infos = {} # src => {}
|
21
|
-
@dsts = {} # local_port => dst
|
22
21
|
@dst_infos = {} # dst => {}
|
23
22
|
@resolv_caches = {} # domain => [ ip, created_at ]
|
24
23
|
|
@@ -168,8 +167,7 @@ module Girl
|
|
168
167
|
|
169
168
|
@tun_info[ :src_exts ].each do | src_id, src_ext |
|
170
169
|
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>' )
|
170
|
+
data = [ 0, SOURCE_STATUS, src_id, src_ext[ :relay_pack_id ], src_ext[ :continue_dst_pack_id ] ].pack( 'Q>CQ>Q>Q>' )
|
173
171
|
add_tun_ctlmsg( data )
|
174
172
|
need_trigger = true
|
175
173
|
end
|
@@ -180,11 +178,6 @@ module Girl
|
|
180
178
|
puts "p#{ Process.pid } #{ Time.new } resume tun"
|
181
179
|
@tun_info[ :paused ] = false
|
182
180
|
add_write( @tun )
|
183
|
-
|
184
|
-
@tun_info[ :src_exts ].each do | _, src_ext |
|
185
|
-
add_write( src_ext[ :src ] )
|
186
|
-
end
|
187
|
-
|
188
181
|
need_trigger = true
|
189
182
|
end
|
190
183
|
|
@@ -322,8 +315,8 @@ module Girl
|
|
322
315
|
port: port, # 端口
|
323
316
|
ctlmsg_rbuffs: [], # 还没配上tund,暂存的ctlmsg
|
324
317
|
ctlmsgs: [], # [ to_addr, data ]
|
325
|
-
wbuffs: [], # 写前缓存 [ src_id, data ]
|
326
|
-
caches: [], # 块读出缓存 [ src_id, data ]
|
318
|
+
wbuffs: [], # 写前缓存 [ src_id, pack_id, data ]
|
319
|
+
caches: [], # 块读出缓存 [ src_id, pack_id, data ]
|
327
320
|
chunks: [], # 块队列 filename
|
328
321
|
spring: 0, # 块后缀,结块时,如果块队列不为空,则自增,为空,则置为0
|
329
322
|
tund_addr: nil, # tund地址
|
@@ -370,7 +363,6 @@ module Girl
|
|
370
363
|
|
371
364
|
# puts "debug1 a new dst #{ dst.local_address.inspect }"
|
372
365
|
local_port = dst.local_address.ip_port
|
373
|
-
@dsts[ local_port ] = dst
|
374
366
|
@dst_infos[ dst ] = {
|
375
367
|
local_port: local_port, # 本地端口
|
376
368
|
src: src, # 对应src
|
@@ -388,17 +380,13 @@ module Girl
|
|
388
380
|
src_info[ :dst ] = dst
|
389
381
|
|
390
382
|
if src_info[ :proxy_proto ] == :http
|
391
|
-
|
392
|
-
|
393
|
-
if datas.empty?
|
394
|
-
# CONNECT
|
383
|
+
if src_info[ :is_connect ]
|
395
384
|
# puts "debug1 add src wbuff http ok"
|
396
385
|
add_src_wbuff( src, HTTP_OK )
|
397
386
|
else
|
398
|
-
# not CONNECT
|
399
387
|
# puts "debug1 add src rbuffs to dst wbuff"
|
400
388
|
|
401
|
-
|
389
|
+
src_info[ :rbuffs ].each do | _, data |
|
402
390
|
add_dst_wbuff( dst, data )
|
403
391
|
end
|
404
392
|
end
|
@@ -420,11 +408,11 @@ module Girl
|
|
420
408
|
dst_port: nil, # 远端dst端口
|
421
409
|
wmems: {}, # 写后 pack_id => data
|
422
410
|
send_ats: {}, # 上一次发出时间 pack_id => send_at
|
423
|
-
|
411
|
+
relay_pack_id: 0, # 转发到几
|
424
412
|
continue_dst_pack_id: 0, # 收到几
|
425
413
|
pieces: {}, # 跳号包 dst_pack_id => data
|
426
|
-
is_dst_closed: false, #
|
427
|
-
biggest_dst_pack_id: 0, #
|
414
|
+
is_dst_closed: false, # dst是否已关闭
|
415
|
+
biggest_dst_pack_id: 0, # dst最大包号码
|
428
416
|
completed_pack_id: 0, # 完成到几(对面收到几)
|
429
417
|
last_continue_at: Time.new # 创建,或者上一次收到连续流量,或者发出新包的时间
|
430
418
|
}
|
@@ -496,17 +484,17 @@ module Girl
|
|
496
484
|
##
|
497
485
|
# add tun wbuff
|
498
486
|
#
|
499
|
-
def add_tun_wbuff( src_id, data )
|
500
|
-
@tun_info[ :wbuffs ] << [ src_id, data ]
|
487
|
+
def add_tun_wbuff( src_id, pack_id, data )
|
488
|
+
@tun_info[ :wbuffs ] << [ src_id, pack_id, data ]
|
501
489
|
|
502
490
|
if @tun_info[ :wbuffs ].size >= WBUFFS_LIMIT
|
503
491
|
spring = @tun_info[ :chunks ].size > 0 ? ( @tun_info[ :spring ] + 1 ) : 0
|
504
492
|
filename = "#{ Process.pid }-#{ @tun_info[ :port ] }.#{ spring }"
|
505
493
|
chunk_path = File.join( @tun_chunk_dir, filename )
|
506
|
-
|
494
|
+
datas = @tun_info[ :wbuffs ].map{ | _src_id, _pack_id, _data | [ [ _src_id, _pack_id, _data.bytesize ].pack( 'Q>Q>n' ), _data ].join }
|
507
495
|
|
508
496
|
begin
|
509
|
-
IO.binwrite( chunk_path,
|
497
|
+
IO.binwrite( chunk_path, datas.join )
|
510
498
|
rescue Errno::ENOSPC => e
|
511
499
|
puts "p#{ Process.pid } #{ Time.new } #{ e.class }, close tun"
|
512
500
|
set_is_closing( @tun )
|
@@ -645,13 +633,13 @@ module Girl
|
|
645
633
|
return if src_ext.nil? || src_ext[ :dst_port ].nil?
|
646
634
|
|
647
635
|
if src_ext[ :is_dst_closed ]
|
648
|
-
# puts "debug1 2-
|
636
|
+
# puts "debug1 2-3. after close src -> dst closed ? yes -> del src ext -> send fin2"
|
649
637
|
del_src_ext( src_id )
|
650
638
|
data = [ 0, FIN2, src_id ].pack( 'Q>CQ>' )
|
651
639
|
add_tun_ctlmsg( data )
|
652
640
|
else
|
653
641
|
# puts "debug1 1-1. after close src -> dst closed ? no -> send fin1"
|
654
|
-
data = [ 0, FIN1, src_id,
|
642
|
+
data = [ 0, FIN1, src_id, src_info[ :biggest_pack_id ], src_ext[ :continue_dst_pack_id ] ].pack( 'Q>CQ>Q>Q>' )
|
655
643
|
add_tun_ctlmsg( data )
|
656
644
|
end
|
657
645
|
elsif src_info[ :proxy_type ] == :direct
|
@@ -674,7 +662,6 @@ module Girl
|
|
674
662
|
end
|
675
663
|
end
|
676
664
|
|
677
|
-
@dsts.delete( dst_info[ :local_port ] )
|
678
665
|
set_is_closing( dst_info[ :src ] )
|
679
666
|
end
|
680
667
|
|
@@ -768,15 +755,7 @@ module Girl
|
|
768
755
|
|
769
756
|
if data.empty?
|
770
757
|
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
|
758
|
+
close_src( src )
|
780
759
|
else
|
781
760
|
@writes.delete( src )
|
782
761
|
end
|
@@ -907,7 +886,7 @@ module Girl
|
|
907
886
|
|
908
887
|
# 取写前
|
909
888
|
if @tun_info[ :caches ].any?
|
910
|
-
src_id, data = @tun_info[ :caches ].first
|
889
|
+
src_id, pack_id, data = @tun_info[ :caches ].first
|
911
890
|
from = :caches
|
912
891
|
elsif @tun_info[ :chunks ].any?
|
913
892
|
path = File.join( @tun_chunk_dir, @tun_info[ :chunks ].shift )
|
@@ -924,16 +903,16 @@ module Girl
|
|
924
903
|
caches = []
|
925
904
|
|
926
905
|
until data.empty?
|
927
|
-
_src_id, pack_size = data[ 0,
|
928
|
-
caches << [ _src_id, data[
|
929
|
-
data = data[ (
|
906
|
+
_src_id, _pack_id, pack_size = data[ 0, 18 ].unpack( 'Q>Q>n' )
|
907
|
+
caches << [ _src_id, _pack_id, data[ 18, pack_size ] ]
|
908
|
+
data = data[ ( 18 + pack_size )..-1 ]
|
930
909
|
end
|
931
910
|
|
932
911
|
@tun_info[ :caches ] = caches
|
933
|
-
src_id, data = caches.first
|
912
|
+
src_id, pack_id, data = caches.first
|
934
913
|
from = :caches
|
935
914
|
elsif @tun_info[ :wbuffs ].any?
|
936
|
-
src_id, data = @tun_info[ :wbuffs ].first
|
915
|
+
src_id, pack_id, data = @tun_info[ :wbuffs ].first
|
937
916
|
from = :wbuffs
|
938
917
|
else
|
939
918
|
@writes.delete( tun )
|
@@ -943,8 +922,6 @@ module Girl
|
|
943
922
|
src_ext = @tun_info[ :src_exts ][ src_id ]
|
944
923
|
|
945
924
|
if src_ext
|
946
|
-
pack_id = src_ext[ :biggest_pack_id ] + 1
|
947
|
-
|
948
925
|
if pack_id <= CONFUSE_UNTIL
|
949
926
|
data = @custom.encode( data )
|
950
927
|
# puts "debug1 encoded pack #{ pack_id }"
|
@@ -959,7 +936,7 @@ module Girl
|
|
959
936
|
end
|
960
937
|
|
961
938
|
# puts "debug2 written pack #{ pack_id }"
|
962
|
-
src_ext[ :
|
939
|
+
src_ext[ :relay_pack_id ] = pack_id
|
963
940
|
src_ext[ :wmems ][ pack_id ] = data
|
964
941
|
src_ext[ :send_ats ][ pack_id ] = now
|
965
942
|
src_ext[ :last_continue_at ] = now
|
@@ -995,7 +972,9 @@ module Girl
|
|
995
972
|
dst: nil, # :direct的场合,对应的dst
|
996
973
|
destination_domain: nil, # 目的地域名
|
997
974
|
destination_port: nil, # 目的地端口
|
998
|
-
|
975
|
+
biggest_pack_id: 0, # 最大包号码
|
976
|
+
is_connect: true, # 代理协议是http的场合,是否是CONNECT
|
977
|
+
rbuffs: [], # 非CONNECT,dst或者远端dst未准备好,暂存流量 [ pack_id, data ]
|
999
978
|
wbuff: '', # 写前
|
1000
979
|
cache: '', # 块读出缓存
|
1001
980
|
chunks: [], # 块队列,写前达到块大小时结一个块 filename
|
@@ -1092,7 +1071,10 @@ module Girl
|
|
1092
1071
|
end
|
1093
1072
|
end
|
1094
1073
|
|
1095
|
-
src_info[ :
|
1074
|
+
src_info[ :is_connect ] = false
|
1075
|
+
pack_id = src_info[ :biggest_pack_id ] + 1
|
1076
|
+
src_info[ :biggest_pack_id ] = pack_id
|
1077
|
+
src_info[ :rbuffs ] << [ pack_id, data ]
|
1096
1078
|
end
|
1097
1079
|
|
1098
1080
|
domain, port = domain_and_port.split( ':' )
|
@@ -1105,7 +1087,9 @@ module Girl
|
|
1105
1087
|
resolve_domain( src, domain )
|
1106
1088
|
when :checking
|
1107
1089
|
# puts "debug1 add src rbuff while checking #{ data.inspect }"
|
1108
|
-
src_info[ :
|
1090
|
+
pack_id = src_info[ :biggest_pack_id ] + 1
|
1091
|
+
src_info[ :biggest_pack_id ] = pack_id
|
1092
|
+
src_info[ :rbuffs ] << [ pack_id, data ]
|
1109
1093
|
when :negotiation
|
1110
1094
|
# +----+-----+-------+------+----------+----------+
|
1111
1095
|
# |VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT |
|
@@ -1152,6 +1136,9 @@ module Girl
|
|
1152
1136
|
return
|
1153
1137
|
end
|
1154
1138
|
|
1139
|
+
pack_id = src_info[ :biggest_pack_id ] + 1
|
1140
|
+
src_info[ :biggest_pack_id ] = pack_id
|
1141
|
+
|
1155
1142
|
if src_ext[ :dst_port ]
|
1156
1143
|
if @tun.closed?
|
1157
1144
|
# puts "debug1 tun closed, close src"
|
@@ -1159,14 +1146,14 @@ module Girl
|
|
1159
1146
|
return
|
1160
1147
|
end
|
1161
1148
|
|
1162
|
-
|
1149
|
+
unless src_info[ :is_connect ]
|
1163
1150
|
data, _ = sub_http_request( data )
|
1164
1151
|
end
|
1165
1152
|
|
1166
|
-
add_tun_wbuff( src_id, data )
|
1153
|
+
add_tun_wbuff( src_id, pack_id, data )
|
1167
1154
|
else
|
1168
1155
|
# puts "debug1 remote dst not ready, save data to src rbuff"
|
1169
|
-
src_info[ :rbuffs ] << data
|
1156
|
+
src_info[ :rbuffs ] << [ pack_id, data ]
|
1170
1157
|
end
|
1171
1158
|
when :direct
|
1172
1159
|
dst = src_info[ :dst ]
|
@@ -1178,14 +1165,14 @@ module Girl
|
|
1178
1165
|
return
|
1179
1166
|
end
|
1180
1167
|
|
1181
|
-
|
1168
|
+
unless src_info[ :is_connect ]
|
1182
1169
|
data, _ = sub_http_request( data )
|
1183
1170
|
end
|
1184
1171
|
|
1185
1172
|
add_dst_wbuff( dst, data )
|
1186
1173
|
else
|
1187
1174
|
# puts "debug1 dst not ready, save data to src rbuff"
|
1188
|
-
src_info[ :rbuffs ] << data
|
1175
|
+
src_info[ :rbuffs ] << [ nil, data ]
|
1189
1176
|
end
|
1190
1177
|
end
|
1191
1178
|
end
|
@@ -1271,18 +1258,14 @@ module Girl
|
|
1271
1258
|
src_info = @src_infos[ src ]
|
1272
1259
|
|
1273
1260
|
if src_info[ :proxy_proto ] == :http
|
1274
|
-
|
1275
|
-
|
1276
|
-
if datas.empty?
|
1277
|
-
# CONNECT
|
1261
|
+
if src_info[ :is_connect ]
|
1278
1262
|
# puts "debug1 add src wbuff http ok"
|
1279
1263
|
add_src_wbuff( src, HTTP_OK )
|
1280
1264
|
else
|
1281
|
-
# not CONNECT
|
1282
1265
|
# puts "debug1 add src rbuffs to tun wbuffs"
|
1283
1266
|
|
1284
|
-
|
1285
|
-
add_tun_wbuff( src_id, _data )
|
1267
|
+
src_info[ :rbuffs ].each do | pack_id, _data |
|
1268
|
+
add_tun_wbuff( src_id, pack_id, _data )
|
1286
1269
|
end
|
1287
1270
|
end
|
1288
1271
|
elsif src_info[ :proxy_proto ] == :socks5
|
@@ -1291,7 +1274,7 @@ module Girl
|
|
1291
1274
|
when DEST_STATUS
|
1292
1275
|
return if from_addr != @tun_info[ :tund_addr ]
|
1293
1276
|
|
1294
|
-
dst_port,
|
1277
|
+
dst_port, relay_dst_pack_id, continue_src_pack_id = data[ 9, 18 ].unpack( 'nQ>Q>' )
|
1295
1278
|
|
1296
1279
|
src_id = @tun_info[ :src_ids ][ dst_port ]
|
1297
1280
|
return unless src_id
|
@@ -1301,22 +1284,10 @@ module Girl
|
|
1301
1284
|
|
1302
1285
|
# puts "debug2 got dest status"
|
1303
1286
|
|
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
1287
|
release_wmems( src_ext, continue_src_pack_id )
|
1317
1288
|
|
1318
1289
|
# 发miss
|
1319
|
-
if !src_ext[ :src ].closed? && ( src_ext[ :continue_dst_pack_id ] <
|
1290
|
+
if !src_ext[ :src ].closed? && ( src_ext[ :continue_dst_pack_id ] < relay_dst_pack_id )
|
1320
1291
|
ranges = []
|
1321
1292
|
curr_pack_id = src_ext[ :continue_dst_pack_id ] + 1
|
1322
1293
|
|
@@ -1328,12 +1299,12 @@ module Girl
|
|
1328
1299
|
curr_pack_id = pack_id + 1
|
1329
1300
|
end
|
1330
1301
|
|
1331
|
-
if curr_pack_id <=
|
1332
|
-
ranges << [ curr_pack_id,
|
1302
|
+
if curr_pack_id <= relay_dst_pack_id
|
1303
|
+
ranges << [ curr_pack_id, relay_dst_pack_id ]
|
1333
1304
|
end
|
1334
1305
|
|
1335
1306
|
pack_count = 0
|
1336
|
-
# puts "debug1 continue/
|
1307
|
+
# puts "debug1 continue/relay #{ src_ext[ :continue_dst_pack_id ] }/#{ relay_dst_pack_id } send MISS #{ ranges.size }"
|
1337
1308
|
|
1338
1309
|
ranges.each do | pack_id_begin, pack_id_end |
|
1339
1310
|
if pack_count >= BREAK_SEND_MISS
|
@@ -1380,9 +1351,8 @@ module Girl
|
|
1380
1351
|
src_ext[ :biggest_dst_pack_id ] = biggest_dst_pack_id
|
1381
1352
|
release_wmems( src_ext, continue_src_pack_id )
|
1382
1353
|
|
1383
|
-
# 接到对面已关闭,若最后一个包已经进写前,关闭src
|
1384
1354
|
if ( biggest_dst_pack_id == src_ext[ :continue_dst_pack_id ] )
|
1385
|
-
# puts "debug1 2-1. recv fin1 ->
|
1355
|
+
# puts "debug1 2-1. tun recv fin1 -> all traffic received ? -> close src after write"
|
1386
1356
|
set_is_closing( src_ext[ :src ] )
|
1387
1357
|
end
|
1388
1358
|
when FIN2
|
@@ -1393,7 +1363,7 @@ module Girl
|
|
1393
1363
|
src_id = @tun_info[ :src_ids ][ dst_port ]
|
1394
1364
|
return unless src_id
|
1395
1365
|
|
1396
|
-
# puts "debug1 1-2. recv fin2 -> del src ext"
|
1366
|
+
# puts "debug1 1-2. tun recv fin2 -> del src ext"
|
1397
1367
|
del_src_ext( src_id )
|
1398
1368
|
when TUND_FIN
|
1399
1369
|
return if from_addr != @tun_info[ :tund_addr ]
|
@@ -1439,7 +1409,7 @@ module Girl
|
|
1439
1409
|
|
1440
1410
|
# 接到流量,若对面已关闭,且流量正好收全,关闭src
|
1441
1411
|
if src_ext[ :is_dst_closed ] && ( pack_id == src_ext[ :biggest_dst_pack_id ] )
|
1442
|
-
# puts "debug1 2-
|
1412
|
+
# puts "debug1 2-2. tun recv traffic -> dst closed and all traffic received ? -> close src after write"
|
1443
1413
|
set_is_closing( src_ext[ :src ] )
|
1444
1414
|
end
|
1445
1415
|
else
|