girl 9.1.0 → 9.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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: