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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5a585763570f9faabfddd8f1b0f4192236cd351da32504f3f473aacf5158eab9
4
- data.tar.gz: 964f0e072d3f9d099e71cdeb252e65712ff047b5439652030e78a17d1038894f
3
+ metadata.gz: 9770be339624c9742372d65ead4bc2c59a6f7559984bc9d95212b8beddf05787
4
+ data.tar.gz: f7ee6b87f034c447a169f1f41c606bd5a02c676525a40e82e74ff259b5090840
5
5
  SHA512:
6
- metadata.gz: b1dbeafa033dfc4571f7dbe43984bc2fc217408d40a3d01c1c75f33aa6c3b7c9eb59a7e9aa225f4fd80df62747e6110d260d0689ad4f26b2b6d9c364f754f5f6
7
- data.tar.gz: d948d027a2e53a34e94708aa9be7220a0c9777bca9c8574130010f860c0ebc744f2a7c9f500871e3f373393dd884b6c3829fdc798ce6771b967527466438e097
6
+ metadata.gz: f7798af85a3cfacf28179420f562dd1b65f10d839248c5075969005af42f44cd735f0181f558a7c76c89c70807200eb68e77a12193d49d8a86763b39bcce8962
7
+ data.tar.gz: 4b7841420ac86f88af4920eaae61d0f606de9f726ee2a458c51d6d2bd05bf7988fe97f574c0193cf81228b48ac0c89a1f81995d67593e6954125187b6236ad20
@@ -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
@@ -1,18 +1,17 @@
1
1
  module Girl
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
- HEARTBEAT_INTERVAL = 30 # 心跳间隔
11
- STATUS_INTERVAL = 0.5 # 发送状态间隔
12
- SEND_STATUS_UNTIL = 10 # 持续的告之对面状态,直到没有流量往来,持续多少秒
13
- BREAK_SEND_MISS = 10_000 # miss包个数上限,达到上限忽略要后面的段,可控碎片缓存
14
- CONFUSE_UNTIL = 5 # 混淆前几个包
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
@@ -23,29 +23,37 @@ require 'socket'
23
23
  #
24
24
  # tun-tund:
25
25
  #
26
- # Q>: 0 ctlmsg -> C: 2 heartbeat -> C: random char
27
- # 3 a new src -> Q>: src_id -> encoded destination address
28
- # 4 paired -> Q>: src_id -> n: dst_port
29
- # 5 dst status -> n: dst_port -> Q>Q>: biggest_dst_pack_id continue_src_pack_id
30
- # 6 src status -> Q>: src_id -> Q>Q>: biggest_src_pack_id continue_dst_pack_id
31
- # 7 miss -> Q>: src_id/n: dst_port -> Q>Q>: pack_id_begin pack_id_end
32
- # 8 fin1 -> Q>: src_id/n: dst_port -> Q>Q>: biggest_src_pack_id continue_dst_pack_id / biggest_dst_pack_id continue_src_pack_id
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 -> Q>: src_id/n: dst_port
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>: src_id/n: dst_port -> traffic
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 traffic/fin1/dst status -> dst closed and all traffic received ? -> close src after write
48
- # 2-2. after close src -> dst closed ? yes -> del src ext -> send fin2
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
@@ -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
- # puts "debug2 ctl send status biggest #{ src_ext[ :biggest_pack_id ] } continue dst #{ src_ext[ :continue_dst_pack_id ] }"
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
- datas = src_info[ :rbuffs ]
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
- datas.each do | data |
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
- biggest_pack_id: 0, # 发到几
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
- wbuffs = @tun_info[ :wbuffs ].map{ | _src_id, _data | [ [ _src_id, _data.bytesize ].pack( 'Q>n' ), _data ].join }
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, wbuffs.join )
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-2. after close src -> dst closed ? yes -> del src ext -> send fin2"
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, src_ext[ :biggest_pack_id ], src_ext[ :continue_dst_pack_id ] ].pack( 'Q>CQ>Q>Q>' )
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
- if @tun.closed?
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, 10 ].unpack( 'Q>n' )
928
- caches << [ _src_id, data[ 10, pack_size ] ]
929
- data = data[ ( 10 + pack_size )..-1 ]
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[ :biggest_pack_id ] = pack_id
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
- rbuffs: [], # 非CONNECT,dst或者远端dst未准备好,暂存流量
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[ :rbuffs ] << data
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[ :rbuffs ] << data
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
- if src_info[ :rbuffs ].any?
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
- if src_info[ :rbuffs ].any?
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
- datas = src_info[ :rbuffs ]
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
- datas.each do | _data |
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, biggest_dst_pack_id, continue_src_pack_id = data[ 9, 18 ].unpack( 'nQ>Q>' )
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 ] < src_ext[ :biggest_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 <= src_ext[ :biggest_dst_pack_id ]
1332
- ranges << [ curr_pack_id, src_ext[ :biggest_dst_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/biggest #{ src_ext[ :continue_dst_pack_id ] }/#{ src_ext[ :biggest_dst_pack_id ] } send MISS #{ ranges.size }"
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 -> set dst closed -> all traffic received ? -> close src after write"
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-1. recv traffic/fin1/dst status -> dst closed and all traffic received ? -> close src after write"
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