girl 9.1.0 → 9.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ddce98f59f1102d50d58fd02775ed1305f3babb3a2b7998a4ed86f39438e2599
4
- data.tar.gz: b51d851640addd0acb8d5367b9d6295a67036e720436c6d0bea9ed352222f9bc
3
+ metadata.gz: 6178ab1062943992b8187decc04a6916c5aaee75aa23e259c3ba5edcdbde7c7d
4
+ data.tar.gz: ff195a6fb415da6f045adc4678655acdc367b2f1c8894319f19309085fb3ee9b
5
5
  SHA512:
6
- metadata.gz: 469527cb74ea0a0aab7af6358dcd345852c8c9c25b9adbcb69f70acaa582592b696a2549d92e3970d55b0a607fe400f107c8445e075fffb6c22bc4d82837289a
7
- data.tar.gz: 1ce78e2d003752fb847c11ec505960c82a241d4d0b8ebde1047e7ac788532bb35ad6d985cf76067e20c638a788736336a35a2381b146664d4c391a5e3441d39f
6
+ metadata.gz: 4c102ea1026056ce877c50e895b10e7d054475406e8ee4e62aa4082f07270f6b89fc110cf0762a61e10c0d48d18017674b8c7d23e6e7873b8f0443ded5589a91
7
+ data.tar.gz: 7201e5651a8443f7a2c115e9dfbb24d84ae13cd13263f2e754e3db2993e7478f2831d784e3ed098fae0bcb534e1f23e292a5123615aedb9a8a449080fcdf4acf
data/lib/girl/proxy.rb CHANGED
@@ -25,6 +25,7 @@ module Girl
25
25
  puts "load #{ config_path } #{ conf.inspect }"
26
26
  redir_port = conf[ :redir_port ]
27
27
  memd_port = conf[ :memd_port ]
28
+ relayd_port = conf[ :relayd_port ]
28
29
  tspd_port = conf[ :tspd_port ]
29
30
  proxyd_host = conf[ :proxyd_host ]
30
31
  proxyd_port = conf[ :proxyd_port ]
@@ -54,7 +55,7 @@ module Girl
54
55
  h_src_underhalf = conf[ :h_src_underhalf ] # V
55
56
  h_dst_overflow = conf[ :h_dst_overflow ] # W
56
57
  h_dst_underhalf = conf[ :h_dst_underhalf ] # X
57
-
58
+
58
59
  expire_connecting = conf[ :expire_connecting ] # 连接多久没有建成关闭(秒)
59
60
  expire_long_after = conf[ :expire_long_after ] # 长连接多久没有新流量关闭(秒)
60
61
  expire_proxy_after = conf[ :expire_proxy_after ] # proxy多久没有收到流量重建(秒)
@@ -64,6 +65,7 @@ module Girl
64
65
 
65
66
  redir_port = redir_port ? redir_port.to_i : 6666
66
67
  memd_port = memd_port ? memd_port.to_i : redir_port + 1
68
+ relayd_port = relayd_port ? relayd_port.to_i : redir_port + 2
67
69
  tspd_port = tspd_port ? tspd_port.to_i : 7777
68
70
  raise "missing proxyd host" unless proxyd_host
69
71
  proxyd_port = proxyd_port ? proxyd_port.to_i : 6060
@@ -128,8 +130,8 @@ module Girl
128
130
  end
129
131
  end
130
132
 
131
- puts "girl proxy #{ Girl::VERSION } #{ im }"
132
- puts "#{ redir_port } #{ tspd_port } #{ proxyd_host } #{ proxyd_port } #{ appd_host } #{ appd_port } #{ nameservers.inspect } #{ is_client_fastopen } #{ is_server_fastopen }"
133
+ puts "girl proxy #{ Girl::VERSION } #{ im } #{ redir_port } #{ relayd_port } #{ tspd_port }"
134
+ puts "#{ proxyd_host } #{ proxyd_port } #{ appd_host } #{ appd_port } #{ nameservers.inspect } #{ is_client_fastopen } #{ is_server_fastopen }"
133
135
  puts "#{ direct_path } #{ directs.size } directs"
134
136
  puts "#{ remote_path } #{ remotes.size } remotes"
135
137
 
@@ -141,6 +143,7 @@ module Girl
141
143
  worker = Girl::ProxyWorker.new(
142
144
  redir_port,
143
145
  memd_port,
146
+ relayd_port,
144
147
  tspd_port,
145
148
  proxyd_host,
146
149
  proxyd_port,
@@ -5,6 +5,7 @@ module Girl
5
5
  def initialize(
6
6
  redir_port,
7
7
  memd_port,
8
+ relayd_port,
8
9
  tspd_port,
9
10
  proxyd_host,
10
11
  proxyd_port,
@@ -51,14 +52,16 @@ module Girl
51
52
  @remotes = remotes
52
53
  @local_ips = Socket.ip_address_list.select{ | info | info.ipv4? }.map{ | info | info.ip_address }
53
54
  @update_roles = [ :dns, :dst, :mem, :p1, :src, :rsv ] # 参与淘汰的角色
54
- @updates_limit = 1008 # 淘汰池上限,1015(mac) - info, infod, memd, proxy, redir, rsvd, tspd
55
+ @updates_limit = 1007 # 淘汰池上限,1015(mac) - info, infod, memd, proxy, redir, relayd, rsvd, tspd
55
56
  @eliminate_count = 0 # 淘汰次数
56
57
  @reads = [] # 读池
57
58
  @writes = [] # 写池
58
- @roles = {} # sock => :dns / :dst / :infod / :mem / :memd / :p1 / :proxy / :redir / :rsv / :rsvd / :src / :tspd
59
+ @roles = {} # sock => :dns / :dst / :girl / :infod / :mem / :memd / :p1 / :proxy / :redir / :relay / :relayd / :rsv / :rsvd / :src / :tspd
59
60
  @updates = {} # sock => updated_at
60
61
  @proxy_infos = {} # proxy => { :is_syn :paused_p1s :paused_srcs :rbuff :recv_at :wbuff }
61
62
  @mem_infos = {} # mem => { :wbuff }
63
+ @relay_infos = {} # relay => { :addrinfo :closing :girl :overflowing :wbuff }
64
+ @girl_infos = {} # girl => { :closing :connected :is_syn :overflowing :relay :wbuff }
62
65
  @src_infos = {} # src => { :addrinfo :closing :destination_domain :destination_port :dst :is_connect :overflowing :proxy_proto :proxy_type :rbuff :src_id :wbuff }
63
66
  @dst_infos = {} # dst => { :closing :connected :domain :ip :overflowing :port :src :wbuff }
64
67
  @dns_infos = {} # dns => { :domain :src }
@@ -103,6 +106,7 @@ module Girl
103
106
  new_a_redir( redir_port )
104
107
  new_a_infod( redir_port )
105
108
  new_a_memd( memd_port )
109
+ new_a_relayd( relayd_port )
106
110
  new_a_rsvd( tspd_port )
107
111
  new_a_tspd( tspd_port )
108
112
  new_a_proxy
@@ -123,6 +127,8 @@ module Girl
123
127
  read_dns( sock )
124
128
  when :dst then
125
129
  read_dst( sock )
130
+ when :girl then
131
+ read_girl( sock )
126
132
  when :infod then
127
133
  read_infod( sock )
128
134
  when :mem then
@@ -135,6 +141,10 @@ module Girl
135
141
  read_proxy( sock )
136
142
  when :redir then
137
143
  read_redir( sock )
144
+ when :relay then
145
+ read_relay( sock )
146
+ when :relayd then
147
+ read_relayd( sock )
138
148
  when :rsv then
139
149
  read_rsv( sock )
140
150
  when :rsvd then
@@ -154,12 +164,16 @@ module Girl
154
164
  case role
155
165
  when :dst then
156
166
  write_dst( sock )
167
+ when :girl then
168
+ write_girl( sock )
157
169
  when :mem then
158
170
  write_mem( sock )
159
171
  when :p1 then
160
172
  write_p1( sock )
161
173
  when :proxy then
162
174
  write_proxy( sock )
175
+ when :relay then
176
+ write_relay( sock )
163
177
  when :src then
164
178
  write_src( sock )
165
179
  else
@@ -184,6 +198,12 @@ module Girl
184
198
  dst_info[ :wbuff ] << data
185
199
  bytesize = dst_info[ :wbuff ].bytesize
186
200
 
201
+ if bytesize >= CLOSE_ABOVE then
202
+ puts "close overflow dst #{ dst_info[ :domain ] }"
203
+ close_dst( dst )
204
+ return
205
+ end
206
+
187
207
  if !dst_info[ :overflowing ] && ( bytesize >= WBUFF_LIMIT ) then
188
208
  puts "dst overflow pause src #{ dst_info[ :domain ] }"
189
209
  @reads.delete( dst_info[ :src ] )
@@ -193,6 +213,27 @@ module Girl
193
213
  add_write( dst )
194
214
  end
195
215
 
216
+ def add_girl_wbuff( girl, data )
217
+ return if girl.nil? || girl.closed? || data.nil? || data.empty?
218
+ girl_info = @girl_infos[ girl ]
219
+ girl_info[ :wbuff ] << data
220
+ bytesize = girl_info[ :wbuff ].bytesize
221
+
222
+ if bytesize >= CLOSE_ABOVE then
223
+ puts "close overflow girl"
224
+ close_girl( girl )
225
+ return
226
+ end
227
+
228
+ if !girl_info[ :overflowing ] && ( bytesize >= WBUFF_LIMIT ) then
229
+ puts "girl overflow pause relay"
230
+ @reads.delete( girl_info[ :relay ] )
231
+ girl_info[ :overflowing ] = true
232
+ end
233
+
234
+ add_write( girl )
235
+ end
236
+
196
237
  def add_mem_wbuff( mem, data )
197
238
  return if mem.nil? || mem.closed? || data.nil? || data.empty?
198
239
  mem_info = @mem_infos[ mem ]
@@ -219,7 +260,7 @@ module Girl
219
260
  add_proxy_wbuff( pack_a_chunk( msg ) )
220
261
  p1_info[ :overflowing ] = true
221
262
  end
222
-
263
+
223
264
  add_write( p1 )
224
265
  end
225
266
 
@@ -253,6 +294,27 @@ module Girl
253
294
  end
254
295
  end
255
296
 
297
+ def add_relay_wbuff( relay, data )
298
+ return if relay.nil? || relay.closed? || data.nil? || data.empty?
299
+ relay_info = @relay_infos[ relay ]
300
+ relay_info[ :wbuff ] << data
301
+ bytesize = relay_info[ :wbuff ].bytesize
302
+
303
+ if bytesize >= CLOSE_ABOVE then
304
+ puts "close overflow relay #{ relay_info[ :addrinfo ].ip_unpack.inspect }"
305
+ close_relay( relay )
306
+ return
307
+ end
308
+
309
+ if !relay_info[ :overflowing ] && ( bytesize >= WBUFF_LIMIT ) then
310
+ puts "relay overflow pause girl #{ relay_info[ :addrinfo ].ip_unpack.inspect }"
311
+ @reads.delete( relay_info[ :girl ] )
312
+ relay_info[ :overflowing ] = true
313
+ end
314
+
315
+ add_write( relay )
316
+ end
317
+
256
318
  def add_socks5_conn_reply( src )
257
319
  # +----+-----+-------+------+----------+----------+
258
320
  # |VER | REP | RSV | ATYP | BND.ADDR | BND.PORT |
@@ -334,6 +396,15 @@ module Girl
334
396
  end
335
397
  end
336
398
 
399
+ def check_expire_girls
400
+ now = Time.new
401
+
402
+ @girl_infos.select{ | girl, info | info[ :connected ] ? ( now.to_i - @updates[ girl ].to_i >= @expire_long_after ) : ( now.to_i - @updates[ girl ].to_i >= @expire_connecting ) }.each do | girl, _ |
403
+ puts "expire girl" if @is_debug
404
+ close_girl( girl )
405
+ end
406
+ end
407
+
337
408
  def check_expire_mems
338
409
  now = Time.new
339
410
 
@@ -361,6 +432,15 @@ module Girl
361
432
  end
362
433
  end
363
434
 
435
+ def check_expire_relays
436
+ now = Time.new
437
+
438
+ @relay_infos.select{ | relay, _ | now.to_i - @updates[ relay ].to_i >= @expire_long_after }.each do | relay, info |
439
+ puts "expire relay #{ info[ :addrinfo ].ip_unpack.inspect }" if @is_debug
440
+ close_relay( relay )
441
+ end
442
+ end
443
+
364
444
  def check_expire_rsvs
365
445
  now = Time.new
366
446
 
@@ -396,6 +476,15 @@ module Girl
396
476
  dst_info
397
477
  end
398
478
 
479
+ def close_girl( girl )
480
+ return nil if girl.nil? || girl.closed?
481
+ close_sock( girl )
482
+ girl_info = @girl_infos.delete( girl )
483
+ puts "close girl" if @is_debug
484
+ set_relay_closing( girl_info[ :relay ] ) if girl_info
485
+ girl_info
486
+ end
487
+
399
488
  def close_mem( mem )
400
489
  return nil if mem.nil? || mem.closed?
401
490
  close_sock( mem )
@@ -406,7 +495,7 @@ module Girl
406
495
  return nil if p1.nil? || p1.closed?
407
496
  close_sock( p1 )
408
497
  p1_info = @p1_infos.delete( p1 )
409
-
498
+
410
499
  unless @proxy.closed? then
411
500
  proxy_info = @proxy_infos[ @proxy ]
412
501
  proxy_info[ :paused_p1s ].delete( p1 )
@@ -429,6 +518,15 @@ module Girl
429
518
  proxy_info
430
519
  end
431
520
 
521
+ def close_relay( relay )
522
+ return nil if relay.nil? || relay.closed?
523
+ close_sock( relay )
524
+ relay_info = @relay_infos.delete( relay )
525
+ puts "close relay" if @is_debug
526
+ set_girl_closing( relay_info[ :girl ] ) if relay_info
527
+ relay_info
528
+ end
529
+
432
530
  def close_rsv( rsv )
433
531
  return nil if rsv.nil? || rsv.closed?
434
532
  close_sock( rsv )
@@ -453,7 +551,7 @@ module Girl
453
551
  src_id = src_info[ :src_id ]
454
552
  domain = src_info[ :destination_domain ]
455
553
  puts "close src #{ domain }" if @is_debug
456
-
554
+
457
555
  if src_info[ :proxy_type ] == :direct then
458
556
  set_dst_closing( src_info[ :dst ] )
459
557
  elsif ( src_info[ :proxy_type ] == :remote ) && !@proxy.closed? then
@@ -709,6 +807,45 @@ module Girl
709
807
  end
710
808
  end
711
809
 
810
+ def new_a_girl( relay )
811
+ return if relay.nil? || relay.closed?
812
+ check_expire_girls
813
+
814
+ begin
815
+ girl = Socket.new( Socket::AF_INET, Socket::SOCK_STREAM, 0 )
816
+ rescue Exception => e
817
+ puts "new a girl #{ e.class }"
818
+ close_girl( girl )
819
+ return
820
+ end
821
+
822
+ girl.setsockopt( Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1 )
823
+
824
+ begin
825
+ girl.connect_nonblock( @proxyd_addr )
826
+ rescue IO::WaitWritable
827
+ rescue Exception => e
828
+ puts "girl connect proxyd #{ e.class }"
829
+ girl.close
830
+ close_girl( girl )
831
+ return
832
+ end
833
+
834
+ girl_info = {
835
+ closing: false,
836
+ connected: false,
837
+ is_syn: @is_client_fastopen,
838
+ overflowing: false,
839
+ relay: relay,
840
+ wbuff: ''
841
+ }
842
+
843
+ @girl_infos[ girl ] = girl_info
844
+ add_read( girl, :girl )
845
+ add_write( girl )
846
+ girl
847
+ end
848
+
712
849
  def new_a_infod( infod_port )
713
850
  infod_ip = '127.0.0.1'
714
851
  infod_addr = Socket.sockaddr_in( infod_port, infod_ip )
@@ -822,6 +959,19 @@ module Girl
822
959
  @redir_local_address = redir.local_address
823
960
  end
824
961
 
962
+ def new_a_relayd( relayd_port )
963
+ relayd_ip = '0.0.0.0'
964
+ relayd = Socket.new( Socket::AF_INET, Socket::SOCK_STREAM, 0 )
965
+ relayd.setsockopt( Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1 )
966
+ relayd.setsockopt( Socket::SOL_SOCKET, Socket::SO_REUSEADDR, 1 )
967
+ relayd.setsockopt( Socket::SOL_SOCKET, Socket::SO_REUSEPORT, 1 ) if RUBY_PLATFORM.include?( 'linux' )
968
+ relayd.setsockopt( Socket::IPPROTO_TCP, Socket::TCP_FASTOPEN, BACKLOG ) if @is_server_fastopen
969
+ relayd.bind( Socket.sockaddr_in( relayd_port, relayd_ip ) )
970
+ relayd.listen( BACKLOG )
971
+ puts "relayd listen on #{ relayd_ip } #{ relayd_port }"
972
+ add_read( relayd, :relayd )
973
+ end
974
+
825
975
  def new_a_rsv( data, addrinfo, domain, type )
826
976
  check_expire_rsvs
827
977
  rsv = Socket.new( Socket::AF_INET, Socket::SOCK_DGRAM, 0 )
@@ -955,6 +1105,22 @@ module Girl
955
1105
  add_src_wbuff( src, data )
956
1106
  end
957
1107
 
1108
+ def read_girl( girl )
1109
+ begin
1110
+ data = girl.read_nonblock( READ_SIZE )
1111
+ rescue Errno::ENOTCONN => e
1112
+ return
1113
+ rescue Exception => e
1114
+ close_girl( girl )
1115
+ return
1116
+ end
1117
+
1118
+ set_update( girl )
1119
+ girl_info = @girl_infos[ girl ]
1120
+ relay = girl_info[ :relay ]
1121
+ add_relay_wbuff( relay, data )
1122
+ end
1123
+
958
1124
  def read_infod( infod )
959
1125
  begin
960
1126
  data, addrinfo, rflags, *controls = infod.recvmsg
@@ -1026,6 +1192,8 @@ module Girl
1026
1192
  updates: @updates.size,
1027
1193
  proxy_infos: @proxy_infos.size,
1028
1194
  mem_infos: @mem_infos.size,
1195
+ relay_infos: @relay_infos.size,
1196
+ girl_infos: @girl_infos.size,
1029
1197
  src_infos: @src_infos.size,
1030
1198
  dst_infos: @dst_infos.size,
1031
1199
  dns_infos: @dns_infos.size,
@@ -1148,6 +1316,47 @@ module Girl
1148
1316
  add_read( src, :src )
1149
1317
  end
1150
1318
 
1319
+ def read_relay( relay )
1320
+ begin
1321
+ data = relay.read_nonblock( READ_SIZE )
1322
+ rescue Errno::ENOTCONN => e
1323
+ return
1324
+ rescue Exception => e
1325
+ close_relay( relay )
1326
+ return
1327
+ end
1328
+
1329
+ set_update( relay )
1330
+ relay_info = @relay_infos[ relay ]
1331
+ girl = relay_info[ :girl ]
1332
+ add_girl_wbuff( girl, data )
1333
+ end
1334
+
1335
+ def read_relayd( relayd )
1336
+ check_expire_relays
1337
+
1338
+ begin
1339
+ relay, addrinfo = relayd.accept_nonblock
1340
+ rescue IO::WaitReadable, Errno::EINTR => e
1341
+ puts "relayd accept #{ e.class }"
1342
+ return
1343
+ end
1344
+
1345
+ puts "relayd accept a relay #{ addrinfo.ip_unpack.inspect }"
1346
+
1347
+ relay_info = {
1348
+ addrinfo: addrinfo,
1349
+ closing: false,
1350
+ girl: nil,
1351
+ overflowing: false,
1352
+ wbuff: ''
1353
+ }
1354
+
1355
+ @relay_infos[ relay ] = relay_info
1356
+ add_read( relay, :relay )
1357
+ relay_info[ :girl ] = new_a_girl( relay )
1358
+ end
1359
+
1151
1360
  def read_rsv( rsv )
1152
1361
  begin
1153
1362
  data, addrinfo, rflags, *controls = rsv.recvmsg
@@ -1409,7 +1618,7 @@ module Girl
1409
1618
  unless @proxy.closed? then
1410
1619
  proxy_info = @proxy_infos[ @proxy ]
1411
1620
  bytesize = proxy_info[ :wbuff ].bytesize
1412
-
1621
+
1413
1622
  if ( bytesize >= WBUFF_LIMIT ) && !proxy_info[ :paused_srcs ].include?( src ) then
1414
1623
  puts "proxy overflow pause src #{ src_id } #{ src_info[ :destination_domain ] }"
1415
1624
  @reads.delete( src )
@@ -1559,6 +1768,14 @@ module Girl
1559
1768
  add_write( dst )
1560
1769
  end
1561
1770
 
1771
+ def set_girl_closing( girl )
1772
+ return if girl.nil? || girl.closed?
1773
+ girl_info = @girl_infos[ girl ]
1774
+ return if girl_info.nil? || girl_info[ :closing ]
1775
+ girl_info[ :closing ] = true
1776
+ add_write( girl )
1777
+ end
1778
+
1562
1779
  def set_p1_closing( p1 )
1563
1780
  return if p1.nil? || p1.closed?
1564
1781
  p1_info = @p1_infos[ p1 ]
@@ -1567,6 +1784,14 @@ module Girl
1567
1784
  add_write( p1 )
1568
1785
  end
1569
1786
 
1787
+ def set_relay_closing( relay )
1788
+ return if relay.nil? || relay.closed?
1789
+ relay_info = @relay_infos[ relay ]
1790
+ return if relay_info.nil? || relay_info[ :closing ]
1791
+ relay_info[ :closing ] = true
1792
+ add_write( relay )
1793
+ end
1794
+
1570
1795
  def set_remote( src )
1571
1796
  return if src.nil? || src.closed?
1572
1797
 
@@ -1574,7 +1799,7 @@ module Girl
1574
1799
  close_src( src )
1575
1800
  return
1576
1801
  end
1577
-
1802
+
1578
1803
  src_info = @src_infos[ src ]
1579
1804
  src_info[ :proxy_type ] = :remote
1580
1805
 
@@ -1627,10 +1852,14 @@ module Girl
1627
1852
  close_dns( _sock )
1628
1853
  when :dst
1629
1854
  close_dst( _sock )
1855
+ when :girl
1856
+ close_girl( _sock )
1630
1857
  when :mem
1631
1858
  close_mem( _sock )
1632
1859
  when :p1
1633
1860
  close_p1( _sock )
1861
+ when :relay
1862
+ close_relay( _sock )
1634
1863
  when :rsv
1635
1864
  close_rsv( _sock )
1636
1865
  when :src
@@ -1685,6 +1914,52 @@ module Girl
1685
1914
  end
1686
1915
  end
1687
1916
 
1917
+ def write_girl( girl )
1918
+ if girl.closed? then
1919
+ puts "write closed girl?"
1920
+ return
1921
+ end
1922
+
1923
+ girl_info = @girl_infos[ girl ]
1924
+ girl_info[ :connected ] = true
1925
+ data = girl_info[ :wbuff ]
1926
+
1927
+ if data.empty? then
1928
+ if girl_info[ :closing ] then
1929
+ close_girl( girl )
1930
+ else
1931
+ @writes.delete( girl )
1932
+ end
1933
+
1934
+ return
1935
+ end
1936
+
1937
+ begin
1938
+ if girl_info[ :is_syn ] then
1939
+ written = girl.sendmsg_nonblock( data, 536870912, @proxyd_addr )
1940
+ girl_info[ :is_syn ] = false
1941
+ else
1942
+ written = girl.write_nonblock( data )
1943
+ end
1944
+ rescue Errno::EINPROGRESS
1945
+ return
1946
+ rescue Exception => e
1947
+ close_girl( girl )
1948
+ return
1949
+ end
1950
+
1951
+ set_update( girl )
1952
+ data = data[ written..-1 ]
1953
+ girl_info[ :wbuff ] = data
1954
+ bytesize = girl_info[ :wbuff ].bytesize
1955
+
1956
+ if girl_info[ :overflowing ] && ( bytesize < RESUME_BELOW ) then
1957
+ puts "girl underhalf"
1958
+ add_read( girl_info[ :relay ] )
1959
+ girl_info[ :overflowing ] = false
1960
+ end
1961
+ end
1962
+
1688
1963
  def write_mem( mem )
1689
1964
  if mem.closed? then
1690
1965
  puts "write closed mem?"
@@ -1797,7 +2072,7 @@ module Girl
1797
2072
  proxy_info[ :paused_srcs ].each{ | src | add_read( src ) }
1798
2073
  proxy_info[ :paused_srcs ].clear
1799
2074
  end
1800
-
2075
+
1801
2076
  if proxy_info[ :paused_p1s ].any? then
1802
2077
  puts "proxy underhalf resume p1s #{ proxy_info[ :paused_p1s ].size }"
1803
2078
  proxy_info[ :paused_p1s ].each{ | p1 | add_read( p1 ) }
@@ -1838,7 +2113,7 @@ module Girl
1838
2113
  data = data[ written..-1 ]
1839
2114
  src_info[ :wbuff ] = data
1840
2115
  bytesize = src_info[ :wbuff ].bytesize
1841
-
2116
+
1842
2117
  if src_info[ :overflowing ] && ( bytesize < RESUME_BELOW ) then
1843
2118
  src_id = src_info[ :src_id ]
1844
2119
  domain = src_info[ :destination_domain ]
@@ -1856,5 +2131,45 @@ module Girl
1856
2131
  end
1857
2132
  end
1858
2133
 
2134
+ def write_relay( relay )
2135
+ if relay.closed? then
2136
+ puts "write closed relay?"
2137
+ return
2138
+ end
2139
+
2140
+ relay_info = @relay_infos[ relay ]
2141
+ data = relay_info[ :wbuff ]
2142
+
2143
+ if data.empty? then
2144
+ if relay_info[ :closing ] then
2145
+ close_relay( relay )
2146
+ else
2147
+ @writes.delete( relay )
2148
+ end
2149
+
2150
+ return
2151
+ end
2152
+
2153
+ begin
2154
+ written = relay.write_nonblock( data )
2155
+ rescue Errno::EINPROGRESS
2156
+ return
2157
+ rescue Exception => e
2158
+ close_relay( relay )
2159
+ return
2160
+ end
2161
+
2162
+ set_update( relay )
2163
+ data = data[ written..-1 ]
2164
+ relay_info[ :wbuff ] = data
2165
+ bytesize = relay_info[ :wbuff ].bytesize
2166
+
2167
+ if relay_info[ :overflowing ] && ( bytesize < RESUME_BELOW ) then
2168
+ puts "relay underhalf"
2169
+ add_read( relay_info[ :girl ] )
2170
+ relay_info[ :overflowing ] = false
2171
+ end
2172
+ end
2173
+
1859
2174
  end
1860
2175
  end
data/lib/girl/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Girl
2
- VERSION = '9.1.0'.freeze
2
+ VERSION = '9.1.1'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: girl
3
3
  version: !ruby/object:Gem::Version
4
- version: 9.1.0
4
+ version: 9.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - takafan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-02-18 00:00:00.000000000 Z
11
+ date: 2024-03-07 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: escape evil.
14
14
  email: