girl 0.94.0 → 0.99.0
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/lib/girl/proxy_worker.rb +241 -231
- data/lib/girl/proxyd_worker.rb +224 -163
- data/lib/girl/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a9256dd41425122dd6c8f579d7821c70213b042090c2ce3320b20931c6aa9f8e
|
4
|
+
data.tar.gz: 7af6d01468ee207a768d52ecaf96b3baadb89bb81130f37850776b4ed6bf0393
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ff1e09096efc25f66473d85e34652b76841ffa533a538c75f63562c3593afd48089d40398f74abebd40338f4af12bfc2277669ec9550f0b599b30437b681ed51
|
7
|
+
data.tar.gz: 95c954a9651bc636c20298a94a39a1ec334867283bd24d0b53423528d0047a82e0a89ea6764015d6d0cfc1598210aba586ef9fdf7e75ceea4a50e3797f85f356
|
data/lib/girl/proxy_worker.rb
CHANGED
@@ -13,6 +13,13 @@ module Girl
|
|
13
13
|
@mutex = Mutex.new
|
14
14
|
@reads = []
|
15
15
|
@writes = []
|
16
|
+
@closing_srcs = []
|
17
|
+
@paused_srcs = []
|
18
|
+
@paused_dsts = []
|
19
|
+
@paused_streams = []
|
20
|
+
@resume_srcs = []
|
21
|
+
@resume_dsts = []
|
22
|
+
@resume_streams = []
|
16
23
|
@roles = {} # sock => :dotr / :proxy / :src / :dst / :tun / :stream
|
17
24
|
@src_infos = {} # src => {}
|
18
25
|
@dst_infos = {} # dst => {}
|
@@ -37,7 +44,6 @@ module Girl
|
|
37
44
|
rs, ws = IO.select( @reads, @writes )
|
38
45
|
|
39
46
|
@mutex.synchronize do
|
40
|
-
# 先读,再写,避免打上关闭标记后读到
|
41
47
|
rs.each do | sock |
|
42
48
|
case @roles[ sock ]
|
43
49
|
when :dotr then
|
@@ -90,6 +96,15 @@ module Girl
|
|
90
96
|
|
91
97
|
private
|
92
98
|
|
99
|
+
##
|
100
|
+
# add closing src
|
101
|
+
#
|
102
|
+
def add_closing_src( src )
|
103
|
+
return if src.closed? || @closing_srcs.include?( src )
|
104
|
+
@closing_srcs << src
|
105
|
+
next_tick
|
106
|
+
end
|
107
|
+
|
93
108
|
##
|
94
109
|
# add ctlmsg
|
95
110
|
#
|
@@ -101,14 +116,42 @@ module Girl
|
|
101
116
|
if to_addr then
|
102
117
|
@tun_info[ :ctlmsgs ] << [ data, to_addr ]
|
103
118
|
add_write( @tun )
|
119
|
+
next_tick
|
104
120
|
end
|
105
121
|
end
|
106
122
|
|
123
|
+
##
|
124
|
+
# add paused src
|
125
|
+
#
|
126
|
+
def add_paused_src( src )
|
127
|
+
return if src.closed? || @paused_srcs.include?( src )
|
128
|
+
@reads.delete( src )
|
129
|
+
@paused_srcs << src
|
130
|
+
end
|
131
|
+
|
132
|
+
##
|
133
|
+
# add paused dst
|
134
|
+
#
|
135
|
+
def add_paused_dst( dst )
|
136
|
+
return if dst.closed? || @paused_dsts.include?( dst )
|
137
|
+
@reads.delete( dst )
|
138
|
+
@paused_dsts << dst
|
139
|
+
end
|
140
|
+
|
141
|
+
##
|
142
|
+
# add paused stream
|
143
|
+
#
|
144
|
+
def add_paused_stream( stream )
|
145
|
+
return if stream.closed? || @paused_streams.include?( stream )
|
146
|
+
@reads.delete( stream )
|
147
|
+
@paused_streams << stream
|
148
|
+
end
|
149
|
+
|
107
150
|
##
|
108
151
|
# add read
|
109
152
|
#
|
110
153
|
def add_read( sock, role = nil )
|
111
|
-
|
154
|
+
if !sock.closed? && !@reads.include?( sock ) then
|
112
155
|
@reads << sock
|
113
156
|
|
114
157
|
if role then
|
@@ -117,11 +160,65 @@ module Girl
|
|
117
160
|
end
|
118
161
|
end
|
119
162
|
|
163
|
+
##
|
164
|
+
# add resume src
|
165
|
+
#
|
166
|
+
def add_resume_src( src )
|
167
|
+
return if @resume_srcs.include?( src )
|
168
|
+
@resume_srcs << src
|
169
|
+
next_tick
|
170
|
+
end
|
171
|
+
|
172
|
+
##
|
173
|
+
# add resume dst
|
174
|
+
#
|
175
|
+
def add_resume_dst( dst )
|
176
|
+
return if @resume_dsts.include?( dst )
|
177
|
+
@resume_dsts << dst
|
178
|
+
next_tick
|
179
|
+
end
|
180
|
+
|
181
|
+
##
|
182
|
+
# add resume stream
|
183
|
+
#
|
184
|
+
def add_resume_stream( stream )
|
185
|
+
return if @resume_streams.include?( stream )
|
186
|
+
@resume_streams << stream
|
187
|
+
next_tick
|
188
|
+
end
|
189
|
+
|
190
|
+
##
|
191
|
+
# add dst wbuff
|
192
|
+
#
|
193
|
+
def add_dst_wbuff( dst, data )
|
194
|
+
dst_info = @dst_infos[ dst ]
|
195
|
+
dst_info[ :wbuff ] << data
|
196
|
+
add_write( dst )
|
197
|
+
|
198
|
+
if dst_info[ :wbuff ].bytesize >= WBUFF_LIMIT then
|
199
|
+
puts "p#{ Process.pid } #{ Time.new } pause direct src #{ dst_info[ :domain ] }"
|
200
|
+
add_paused_src( dst_info[ :src ] )
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
##
|
205
|
+
# add src rbuff
|
206
|
+
#
|
207
|
+
def add_src_rbuff( src, data )
|
208
|
+
src_info = @src_infos[ src ]
|
209
|
+
src_info[ :rbuff ] << data
|
210
|
+
|
211
|
+
if src_info[ :rbuff ].bytesize >= WBUFF_LIMIT then
|
212
|
+
# puts "debug1 src.rbuff full"
|
213
|
+
add_closing_src( src )
|
214
|
+
end
|
215
|
+
end
|
216
|
+
|
120
217
|
##
|
121
218
|
# add src wbuff
|
122
219
|
#
|
123
220
|
def add_src_wbuff( src, data )
|
124
|
-
return if src.closed?
|
221
|
+
return if src.closed? || @closing_srcs.include?( src )
|
125
222
|
src_info = @src_infos[ src ]
|
126
223
|
src_info[ :wbuff ] << data
|
127
224
|
src_info[ :last_recv_at ] = Time.new
|
@@ -131,23 +228,33 @@ module Girl
|
|
131
228
|
dst = src_info[ :dst ]
|
132
229
|
|
133
230
|
if dst then
|
134
|
-
|
135
|
-
|
136
|
-
dst_info[ :paused ] = true
|
137
|
-
@reads.delete( dst )
|
231
|
+
puts "p#{ Process.pid } #{ Time.new } pause dst #{ src_info[ :destination_domain ] }"
|
232
|
+
add_paused_dst( dst )
|
138
233
|
else
|
139
234
|
stream = src_info[ :stream ]
|
140
235
|
|
141
236
|
if stream then
|
142
|
-
|
143
|
-
|
144
|
-
stream_info[ :paused ] = true
|
145
|
-
@reads.delete( stream )
|
237
|
+
puts "p#{ Process.pid } #{ Time.new } pause stream #{ src_info[ :destination_domain ] }"
|
238
|
+
add_paused_stream( stream )
|
146
239
|
end
|
147
240
|
end
|
148
241
|
end
|
149
242
|
end
|
150
243
|
|
244
|
+
##
|
245
|
+
# add stream wbuff
|
246
|
+
#
|
247
|
+
def add_stream_wbuff( stream, data )
|
248
|
+
stream_info = @stream_infos[ stream ]
|
249
|
+
stream_info[ :wbuff ] << data
|
250
|
+
add_write( stream )
|
251
|
+
|
252
|
+
if stream_info[ :wbuff ].bytesize >= WBUFF_LIMIT then
|
253
|
+
puts "p#{ Process.pid } #{ Time.new } pause tunnel src #{ stream_info[ :domain ] }"
|
254
|
+
add_paused_src( stream_info[ :src ] )
|
255
|
+
end
|
256
|
+
end
|
257
|
+
|
151
258
|
##
|
152
259
|
# add src wbuff socks5 conn reply
|
153
260
|
#
|
@@ -167,7 +274,7 @@ module Girl
|
|
167
274
|
# add write
|
168
275
|
#
|
169
276
|
def add_write( sock )
|
170
|
-
|
277
|
+
if !sock.closed? && !@writes.include?( sock ) then
|
171
278
|
@writes << sock
|
172
279
|
end
|
173
280
|
end
|
@@ -182,18 +289,6 @@ module Girl
|
|
182
289
|
@roles.delete( sock )
|
183
290
|
end
|
184
291
|
|
185
|
-
##
|
186
|
-
# close dst
|
187
|
-
#
|
188
|
-
def close_dst( dst )
|
189
|
-
# puts "debug1 close dst"
|
190
|
-
close_sock( dst )
|
191
|
-
dst_info = @dst_infos.delete( dst )
|
192
|
-
src = dst_info[ :src ]
|
193
|
-
close_read_src( src )
|
194
|
-
set_src_closing_write( src )
|
195
|
-
end
|
196
|
-
|
197
292
|
##
|
198
293
|
# close read src
|
199
294
|
#
|
@@ -211,7 +306,6 @@ module Girl
|
|
211
306
|
src_info = @src_infos[ src ]
|
212
307
|
end
|
213
308
|
|
214
|
-
src_info[ :paused ] = false
|
215
309
|
src_info
|
216
310
|
end
|
217
311
|
|
@@ -259,6 +353,7 @@ module Girl
|
|
259
353
|
# close src
|
260
354
|
#
|
261
355
|
def close_src( src )
|
356
|
+
return if src.closed?
|
262
357
|
# puts "debug1 close src"
|
263
358
|
close_sock( src )
|
264
359
|
src_info = del_src_info( src )
|
@@ -277,25 +372,14 @@ module Girl
|
|
277
372
|
end
|
278
373
|
end
|
279
374
|
|
280
|
-
##
|
281
|
-
# close stream
|
282
|
-
#
|
283
|
-
def close_stream( stream )
|
284
|
-
# puts "debug1 close stream"
|
285
|
-
close_sock( stream )
|
286
|
-
stream_info = @stream_infos.delete( stream )
|
287
|
-
src = stream_info[ :src ]
|
288
|
-
close_read_src( src )
|
289
|
-
set_src_closing_write( src )
|
290
|
-
end
|
291
|
-
|
292
375
|
##
|
293
376
|
# close tun
|
294
377
|
#
|
295
378
|
def close_tun( tun )
|
296
379
|
# puts "debug1 close tun"
|
297
380
|
close_sock( tun )
|
298
|
-
@tun_info[ :
|
381
|
+
@tun_info[ :ctlmsgs ].clear
|
382
|
+
@tun_info[ :srcs ].each{ | _, src | close_src( src ) }
|
299
383
|
end
|
300
384
|
|
301
385
|
##
|
@@ -315,7 +399,6 @@ module Girl
|
|
315
399
|
src_info = @src_infos[ src ]
|
316
400
|
end
|
317
401
|
|
318
|
-
src_info[ :closed_write ] = true
|
319
402
|
src_info
|
320
403
|
end
|
321
404
|
|
@@ -336,7 +419,6 @@ module Girl
|
|
336
419
|
dst_info = @dst_infos[ dst ]
|
337
420
|
end
|
338
421
|
|
339
|
-
dst_info[ :closed_write ] = true
|
340
422
|
dst_info
|
341
423
|
end
|
342
424
|
|
@@ -357,7 +439,6 @@ module Girl
|
|
357
439
|
stream_info = @stream_infos[ stream ]
|
358
440
|
end
|
359
441
|
|
360
|
-
stream_info[ :closed_write ] = true
|
361
442
|
stream_info
|
362
443
|
end
|
363
444
|
|
@@ -384,7 +465,7 @@ module Girl
|
|
384
465
|
def del_src_info( src )
|
385
466
|
src_info = @src_infos.delete( src )
|
386
467
|
|
387
|
-
if ( src_info[ :proxy_type ] == :tunnel ) && @tun
|
468
|
+
if ( src_info[ :proxy_type ] == :tunnel ) && @tun then
|
388
469
|
@tun_info[ :srcs ].delete( src_info[ :id ] )
|
389
470
|
end
|
390
471
|
|
@@ -400,7 +481,6 @@ module Girl
|
|
400
481
|
sleep CHECK_EXPIRE_INTERVAL
|
401
482
|
|
402
483
|
@mutex.synchronize do
|
403
|
-
trigger = false
|
404
484
|
now = Time.new
|
405
485
|
|
406
486
|
if @tun && !@tun.closed? then
|
@@ -414,8 +494,6 @@ module Girl
|
|
414
494
|
data = [ 0, HEARTBEAT ].pack( 'Q>C' )
|
415
495
|
add_ctlmsg( data )
|
416
496
|
end
|
417
|
-
|
418
|
-
trigger = true
|
419
497
|
end
|
420
498
|
|
421
499
|
@src_infos.each do | src, src_info |
|
@@ -424,12 +502,9 @@ module Girl
|
|
424
502
|
|
425
503
|
if ( now - last_recv_at >= EXPIRE_AFTER ) && ( now - last_sent_at >= EXPIRE_AFTER ) then
|
426
504
|
puts "p#{ Process.pid } #{ Time.new } expire src #{ src_info[ :destination_domain ] }"
|
427
|
-
|
428
|
-
trigger = true
|
505
|
+
add_closing_src( src )
|
429
506
|
end
|
430
507
|
end
|
431
|
-
|
432
|
-
next_tick if trigger
|
433
508
|
end
|
434
509
|
end
|
435
510
|
end
|
@@ -444,56 +519,61 @@ module Girl
|
|
444
519
|
sleep CHECK_RESUME_INTERVAL
|
445
520
|
|
446
521
|
@mutex.synchronize do
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
dst = src_info[ :dst ]
|
451
|
-
|
452
|
-
if dst then
|
453
|
-
dst_info = @dst_infos[ dst ]
|
454
|
-
|
455
|
-
if dst_info[ :wbuff ].size < RESUME_BELOW then
|
456
|
-
puts "p#{ Process.pid } #{ Time.new } dst.wbuff below #{ RESUME_BELOW }, resume src #{ src_info[ :destination_domain ] }"
|
457
|
-
resume_src( src )
|
458
|
-
trigger = true
|
459
|
-
end
|
522
|
+
@paused_srcs.each do | src |
|
523
|
+
if src.closed? then
|
524
|
+
add_resume_src( src )
|
460
525
|
else
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
if
|
465
|
-
|
466
|
-
|
467
|
-
|
526
|
+
src_info = @src_infos[ src ]
|
527
|
+
dst = src_info[ :dst ]
|
528
|
+
|
529
|
+
if dst then
|
530
|
+
dst_info = @dst_infos[ dst ]
|
531
|
+
|
532
|
+
if dst_info[ :wbuff ].size < RESUME_BELOW then
|
533
|
+
puts "p#{ Process.pid } #{ Time.new } resume direct src #{ src_info[ :destination_domain ] }"
|
534
|
+
add_resume_src( src )
|
535
|
+
end
|
536
|
+
else
|
537
|
+
stream = src_info[ :stream ]
|
538
|
+
stream_info = @stream_infos[ stream ]
|
539
|
+
|
540
|
+
if stream_info[ :wbuff ].size < RESUME_BELOW then
|
541
|
+
puts "p#{ Process.pid } #{ Time.new } resume tunnel src #{ src_info[ :destination_domain ] }"
|
542
|
+
add_resume_src( src )
|
543
|
+
end
|
468
544
|
end
|
469
545
|
end
|
470
546
|
end
|
471
547
|
|
472
|
-
@
|
473
|
-
|
474
|
-
|
548
|
+
@paused_dsts.each do | dst |
|
549
|
+
if dst.closed? then
|
550
|
+
add_resume_dst( dst )
|
551
|
+
else
|
552
|
+
dst_info = @dst_infos[ dst ]
|
553
|
+
src = dst_info[ :src ]
|
554
|
+
src_info = @src_infos[ src ]
|
475
555
|
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
trigger = true
|
556
|
+
if src_info[ :wbuff ].size < RESUME_BELOW then
|
557
|
+
puts "p#{ Process.pid } #{ Time.new } resume dst #{ dst_info[ :domain ] }"
|
558
|
+
add_resume_dst( dst )
|
559
|
+
end
|
481
560
|
end
|
482
561
|
end
|
483
562
|
|
484
|
-
@
|
485
|
-
|
486
|
-
|
563
|
+
@paused_streams.each do | stream |
|
564
|
+
if stream.closed? then
|
565
|
+
add_resume_stream( stream )
|
566
|
+
else
|
567
|
+
stream_info = @stream_infos[ stream ]
|
568
|
+
src = stream_info[ :src ]
|
569
|
+
src_info = @src_infos[ src ]
|
487
570
|
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
trigger = true
|
571
|
+
if src_info[ :wbuff ].size < RESUME_BELOW then
|
572
|
+
puts "p#{ Process.pid } #{ Time.new } resume stream #{ stream_info[ :domain ] }"
|
573
|
+
add_resume_stream( stream )
|
574
|
+
end
|
493
575
|
end
|
494
576
|
end
|
495
|
-
|
496
|
-
next_tick if trigger
|
497
577
|
end
|
498
578
|
end
|
499
579
|
end
|
@@ -513,7 +593,7 @@ module Girl
|
|
513
593
|
|
514
594
|
Thread.new do
|
515
595
|
SEND_HELLO_COUNT.times do | i |
|
516
|
-
if @tun.nil? || @tun.closed? || src.closed? || src_info[ :stream ] then
|
596
|
+
if @tun.nil? || @tun.closed? || @tun_info[ :closing ] || src.closed? || src_info[ :stream ] then
|
517
597
|
# puts "debug1 break loop send a new source #{ src_info[ :dst_port ] }"
|
518
598
|
break
|
519
599
|
end
|
@@ -524,7 +604,6 @@ module Girl
|
|
524
604
|
end
|
525
605
|
|
526
606
|
add_ctlmsg( data )
|
527
|
-
next_tick
|
528
607
|
end
|
529
608
|
|
530
609
|
sleep SEND_HELLO_INTERVAL
|
@@ -549,21 +628,16 @@ module Girl
|
|
549
628
|
# connect nonblock 必抛 wait writable
|
550
629
|
rescue Exception => e
|
551
630
|
puts "p#{ Process.pid } #{ Time.new } dst connect destination #{ domain } #{ src_info[ :destination_port ] } #{ ip_info.ip_address } #{ e.class }, close src"
|
552
|
-
|
631
|
+
add_closing_src( src )
|
553
632
|
return
|
554
633
|
end
|
555
634
|
|
556
635
|
# puts "debug1 a new dst #{ dst.local_address.inspect }"
|
557
|
-
local_port = dst.local_address.ip_port
|
558
636
|
dst_info = {
|
559
|
-
|
560
|
-
|
561
|
-
|
562
|
-
|
563
|
-
paused: false, # 是否已暂停读
|
564
|
-
closing: false, # 准备关闭
|
565
|
-
closing_write: false, # 准备关闭写
|
566
|
-
closed_write: false # 已关闭写
|
637
|
+
src: src, # 对应src
|
638
|
+
domain: domain, # 目的地
|
639
|
+
wbuff: '', # 写前,从src读到的流量
|
640
|
+
closing_write: false # 准备关闭写
|
567
641
|
}
|
568
642
|
|
569
643
|
@dst_infos[ dst ] = dst_info
|
@@ -597,7 +671,7 @@ module Girl
|
|
597
671
|
|
598
672
|
if dst_id == 0 then
|
599
673
|
puts "p#{ Process.pid } #{ Time.new } remote dst already closed"
|
600
|
-
|
674
|
+
add_closing_src( src )
|
601
675
|
return
|
602
676
|
end
|
603
677
|
|
@@ -625,10 +699,7 @@ module Girl
|
|
625
699
|
src: src, # 对应src
|
626
700
|
domain: domain, # 目的地
|
627
701
|
wbuff: data, # 写前,写往远端streamd
|
628
|
-
|
629
|
-
closing: false, # 准备关闭
|
630
|
-
closing_write: false, # 准备关闭写
|
631
|
-
closed_write: false # 已关闭写
|
702
|
+
closing_write: false # 准备关闭写
|
632
703
|
}
|
633
704
|
|
634
705
|
src_info[ :dst_id ] = dst_id
|
@@ -692,7 +763,7 @@ module Girl
|
|
692
763
|
|
693
764
|
Thread.new do
|
694
765
|
SEND_HELLO_COUNT.times do | i |
|
695
|
-
if @tun.nil? || @tun.closed? || @tun_info[ :tund_addr ] then
|
766
|
+
if @tun.nil? || @tun.closed? || @tun_info[ :closing ] || @tun_info[ :tund_addr ] then
|
696
767
|
# puts "debug1 break loop send hello"
|
697
768
|
break
|
698
769
|
end
|
@@ -703,7 +774,6 @@ module Girl
|
|
703
774
|
# puts "debug1 #{ data.inspect }"
|
704
775
|
|
705
776
|
add_ctlmsg( data, @proxyd_addr )
|
706
|
-
next_tick
|
707
777
|
end
|
708
778
|
|
709
779
|
sleep SEND_HELLO_INTERVAL
|
@@ -760,41 +830,15 @@ module Girl
|
|
760
830
|
unless src.closed? then
|
761
831
|
puts "p#{ Process.pid } #{ Time.new } resolved #{ domain } #{ ip_info.ip_address }"
|
762
832
|
deal_with_destination_ip( src, ip_info )
|
833
|
+
next_tick
|
763
834
|
end
|
764
835
|
else
|
765
|
-
|
836
|
+
add_closing_src( src )
|
766
837
|
end
|
767
|
-
|
768
|
-
next_tick
|
769
838
|
end
|
770
839
|
end
|
771
840
|
end
|
772
841
|
|
773
|
-
##
|
774
|
-
# resume src
|
775
|
-
#
|
776
|
-
def resume_src( src )
|
777
|
-
src_info = @src_infos[ src ]
|
778
|
-
src_info[ :paused ] = false
|
779
|
-
add_read( src )
|
780
|
-
end
|
781
|
-
|
782
|
-
##
|
783
|
-
# set dst closing
|
784
|
-
#
|
785
|
-
def set_dst_closing( dst )
|
786
|
-
return if dst.closed?
|
787
|
-
dst_info = @dst_infos[ dst ]
|
788
|
-
|
789
|
-
if dst_info[ :closed_write ] then
|
790
|
-
close_read_dst( dst )
|
791
|
-
else
|
792
|
-
dst_info[ :closing ] = true
|
793
|
-
@reads.delete( dst )
|
794
|
-
add_write( dst )
|
795
|
-
end
|
796
|
-
end
|
797
|
-
|
798
842
|
##
|
799
843
|
# set dst closing write
|
800
844
|
#
|
@@ -802,37 +846,20 @@ module Girl
|
|
802
846
|
return if dst.closed?
|
803
847
|
|
804
848
|
dst_info = @dst_infos[ dst ]
|
805
|
-
return if dst_info[ :
|
849
|
+
return if dst_info[ :closing_write ]
|
806
850
|
|
807
851
|
dst_info[ :closing_write ] = true
|
808
852
|
add_write( dst )
|
809
853
|
end
|
810
854
|
|
811
|
-
##
|
812
|
-
# set src is closing
|
813
|
-
#
|
814
|
-
def set_src_closing( src )
|
815
|
-
return if src.closed?
|
816
|
-
|
817
|
-
src_info = @src_infos[ src ]
|
818
|
-
|
819
|
-
if src_info[ :closed_write ] then
|
820
|
-
close_read_src( src )
|
821
|
-
else
|
822
|
-
@reads.delete( src )
|
823
|
-
src_info[ :closing ] = true
|
824
|
-
add_write( src )
|
825
|
-
end
|
826
|
-
end
|
827
|
-
|
828
855
|
##
|
829
856
|
# set src closing write
|
830
857
|
#
|
831
858
|
def set_src_closing_write( src )
|
832
|
-
return if src.closed?
|
859
|
+
return if src.closed? || @closing_srcs.include?( src )
|
833
860
|
|
834
861
|
src_info = @src_infos[ src ]
|
835
|
-
return if src_info[ :
|
862
|
+
return if src_info[ :closing_write ]
|
836
863
|
|
837
864
|
src_info[ :closing_write ] = true
|
838
865
|
add_write( src )
|
@@ -842,10 +869,6 @@ module Girl
|
|
842
869
|
# set src proxy type tunnel
|
843
870
|
#
|
844
871
|
def set_src_proxy_type_tunnel( src )
|
845
|
-
if @tun.nil? || @tun.closed? then
|
846
|
-
new_a_tun
|
847
|
-
end
|
848
|
-
|
849
872
|
src_info = @src_infos[ src ]
|
850
873
|
src_info[ :proxy_type ] = :tunnel
|
851
874
|
src_id = src_info[ :id ]
|
@@ -865,7 +888,7 @@ module Girl
|
|
865
888
|
return if stream.closed?
|
866
889
|
|
867
890
|
stream_info = @stream_infos[ stream ]
|
868
|
-
return if stream_info[ :
|
891
|
+
return if stream_info[ :closing_write ]
|
869
892
|
|
870
893
|
stream_info[ :closing_write ] = true
|
871
894
|
add_write( stream )
|
@@ -875,10 +898,11 @@ module Girl
|
|
875
898
|
# set tun is closing
|
876
899
|
#
|
877
900
|
def set_tun_closing
|
878
|
-
return if @tun.closed?
|
901
|
+
return if @tun.closed? || @tun_info[ :closing ]
|
879
902
|
@tun_info[ :closing ] = true
|
880
903
|
@reads.delete( @tun )
|
881
|
-
|
904
|
+
@writes.delete( @tun )
|
905
|
+
next_tick
|
882
906
|
end
|
883
907
|
|
884
908
|
##
|
@@ -904,7 +928,43 @@ module Girl
|
|
904
928
|
# read dotr
|
905
929
|
#
|
906
930
|
def read_dotr( dotr )
|
907
|
-
dotr.
|
931
|
+
dotr.read_nonblock( READ_SIZE )
|
932
|
+
|
933
|
+
if @tun && !@tun.closed? && @tun_info[ :closing ] then
|
934
|
+
close_tun( @tun )
|
935
|
+
end
|
936
|
+
|
937
|
+
if @closing_srcs.any? then
|
938
|
+
@closing_srcs.each{ | src | close_src( src ) }
|
939
|
+
@closing_srcs.clear
|
940
|
+
end
|
941
|
+
|
942
|
+
if @resume_srcs.any? then
|
943
|
+
@resume_srcs.each do | src |
|
944
|
+
add_read( src )
|
945
|
+
@paused_srcs.delete( src )
|
946
|
+
end
|
947
|
+
|
948
|
+
@resume_srcs.clear
|
949
|
+
end
|
950
|
+
|
951
|
+
if @resume_dsts.any? then
|
952
|
+
@resume_dsts.each do | dst |
|
953
|
+
add_read( dst )
|
954
|
+
@paused_dsts.delete( dst )
|
955
|
+
end
|
956
|
+
|
957
|
+
@resume_dsts.clear
|
958
|
+
end
|
959
|
+
|
960
|
+
if @resume_streams.any? then
|
961
|
+
@resume_streams.each do | stream |
|
962
|
+
add_read( stream )
|
963
|
+
@paused_streams.delete( stream )
|
964
|
+
end
|
965
|
+
|
966
|
+
@resume_streams.clear
|
967
|
+
end
|
908
968
|
end
|
909
969
|
|
910
970
|
##
|
@@ -936,19 +996,23 @@ module Girl
|
|
936
996
|
created_at: Time.new, # 创建时间
|
937
997
|
last_recv_at: nil, # 上一次收到新流量(由dst收到,或者由stream收到)的时间
|
938
998
|
last_sent_at: nil, # 上一次发出流量(由dst发出,或者由stream发出)的时间
|
939
|
-
|
940
|
-
closing: false, # 准备关闭
|
941
|
-
closing_write: false, # 准备关闭写
|
942
|
-
closed_write: false # 已关闭写
|
999
|
+
closing_write: false # 准备关闭写
|
943
1000
|
}
|
944
1001
|
|
945
1002
|
add_read( src, :src )
|
1003
|
+
|
1004
|
+
# 用到tun,是在解析目的地域名得出是国外ip之后。但解析域名是额外的线程,为避免多线程重复建tun,在accept到src时就建。
|
1005
|
+
if @tun.nil? || @tun.closed? then
|
1006
|
+
new_a_tun
|
1007
|
+
end
|
946
1008
|
end
|
947
1009
|
|
948
1010
|
##
|
949
1011
|
# read tun
|
950
1012
|
#
|
951
1013
|
def read_tun( tun )
|
1014
|
+
return if tun.closed?
|
1015
|
+
|
952
1016
|
begin
|
953
1017
|
data, addrinfo, rflags, *controls = tun.recvmsg_nonblock
|
954
1018
|
rescue IO::WaitReadable, Errno::EINTR
|
@@ -1039,7 +1103,7 @@ module Girl
|
|
1039
1103
|
|
1040
1104
|
unless domain_port then
|
1041
1105
|
puts "p#{ Process.pid } #{ Time.new } CONNECT miss domain"
|
1042
|
-
|
1106
|
+
add_closing_src( src )
|
1043
1107
|
return
|
1044
1108
|
end
|
1045
1109
|
elsif data[ 0 ].unpack( 'C' ).first == 5 then
|
@@ -1057,7 +1121,7 @@ module Girl
|
|
1057
1121
|
|
1058
1122
|
unless methods.include?( 0 ) then
|
1059
1123
|
puts "p#{ Process.pid } #{ Time.new } miss method 00"
|
1060
|
-
|
1124
|
+
add_closing_src( src )
|
1061
1125
|
return
|
1062
1126
|
end
|
1063
1127
|
|
@@ -1077,7 +1141,7 @@ module Girl
|
|
1077
1141
|
|
1078
1142
|
unless host_line then
|
1079
1143
|
# puts "debug1 not found host line"
|
1080
|
-
|
1144
|
+
add_closing_src( src )
|
1081
1145
|
return
|
1082
1146
|
end
|
1083
1147
|
|
@@ -1089,7 +1153,7 @@ module Girl
|
|
1089
1153
|
|
1090
1154
|
unless domain_port then
|
1091
1155
|
puts "p#{ Process.pid } #{ Time.new } Host line miss domain"
|
1092
|
-
|
1156
|
+
add_closing_src( src )
|
1093
1157
|
return
|
1094
1158
|
end
|
1095
1159
|
end
|
@@ -1154,26 +1218,13 @@ module Girl
|
|
1154
1218
|
data, _ = sub_http_request( data )
|
1155
1219
|
end
|
1156
1220
|
|
1157
|
-
stream_info = @stream_infos[ stream ]
|
1158
1221
|
data = @custom.encode( data )
|
1159
1222
|
# puts "debug2 add stream.wbuff encoded #{ data.bytesize }"
|
1160
|
-
|
1161
|
-
add_write( stream )
|
1162
|
-
|
1163
|
-
if stream_info[ :wbuff ].bytesize >= WBUFF_LIMIT then
|
1164
|
-
puts "p#{ Process.pid } #{ Time.new } pause tunnel src #{ src_info[ :destination_domain ] }"
|
1165
|
-
src_info[ :paused ] = true
|
1166
|
-
@reads.delete( src )
|
1167
|
-
end
|
1223
|
+
add_stream_wbuff( stream, data )
|
1168
1224
|
end
|
1169
1225
|
else
|
1170
1226
|
# puts "debug1 stream not ready, save data to src.rbuff"
|
1171
|
-
|
1172
|
-
|
1173
|
-
if src_info[ :rbuff ].bytesize >= WBUFF_LIMIT then
|
1174
|
-
# puts "debug1 tunnel src.rbuff full"
|
1175
|
-
set_src_closing( src )
|
1176
|
-
end
|
1227
|
+
add_src_rbuff( src, data )
|
1177
1228
|
end
|
1178
1229
|
when :direct then
|
1179
1230
|
dst = src_info[ :dst ]
|
@@ -1184,25 +1235,12 @@ module Girl
|
|
1184
1235
|
data, _ = sub_http_request( data )
|
1185
1236
|
end
|
1186
1237
|
|
1187
|
-
dst_info = @dst_infos[ dst ]
|
1188
1238
|
# puts "debug2 add dst.wbuff #{ data.bytesize }"
|
1189
|
-
|
1190
|
-
add_write( dst )
|
1191
|
-
|
1192
|
-
if dst_info[ :wbuff ].bytesize >= WBUFF_LIMIT then
|
1193
|
-
puts "p#{ Process.pid } #{ Time.new } pause direct src #{ src_info[ :destination_domain ] }"
|
1194
|
-
src_info[ :paused ] = true
|
1195
|
-
@reads.delete( src )
|
1196
|
-
end
|
1239
|
+
add_dst_wbuff( dst, data )
|
1197
1240
|
end
|
1198
1241
|
else
|
1199
1242
|
# puts "debug1 dst not ready, save data to src.rbuff"
|
1200
|
-
|
1201
|
-
|
1202
|
-
if src_info[ :rbuff ].bytesize >= WBUFF_LIMIT then
|
1203
|
-
# puts "debug1 direct src.rbuff full"
|
1204
|
-
set_src_closing( src )
|
1205
|
-
end
|
1243
|
+
add_src_rbuff( src, data )
|
1206
1244
|
end
|
1207
1245
|
end
|
1208
1246
|
end
|
@@ -1261,13 +1299,7 @@ module Girl
|
|
1261
1299
|
# write tun
|
1262
1300
|
#
|
1263
1301
|
def write_tun( tun )
|
1264
|
-
|
1265
|
-
if @tun_info[ :closing ] then
|
1266
|
-
close_tun( tun )
|
1267
|
-
return
|
1268
|
-
end
|
1269
|
-
|
1270
|
-
now = Time.new
|
1302
|
+
return if tun.closed?
|
1271
1303
|
|
1272
1304
|
# 发ctlmsg
|
1273
1305
|
while @tun_info[ :ctlmsgs ].any? do
|
@@ -1279,8 +1311,8 @@ module Girl
|
|
1279
1311
|
puts "p#{ Process.pid } #{ Time.new } wait send ctlmsg, left #{ @tun_info[ :ctlmsgs ].size }"
|
1280
1312
|
return
|
1281
1313
|
rescue Errno::EHOSTUNREACH, Errno::ENETUNREACH, Errno::ENETDOWN => e
|
1282
|
-
puts "p#{ Process.pid } #{ Time.new } sendmsg #{ e.class },
|
1283
|
-
|
1314
|
+
puts "p#{ Process.pid } #{ Time.new } sendmsg #{ e.class }, set tun closing"
|
1315
|
+
set_tun_closing
|
1284
1316
|
return
|
1285
1317
|
end
|
1286
1318
|
|
@@ -1297,14 +1329,6 @@ module Girl
|
|
1297
1329
|
return if src.closed?
|
1298
1330
|
src_info = @src_infos[ src ]
|
1299
1331
|
dst = src_info[ :dst ]
|
1300
|
-
|
1301
|
-
# 处理关闭
|
1302
|
-
if src_info[ :closing ] then
|
1303
|
-
close_src( src )
|
1304
|
-
return
|
1305
|
-
end
|
1306
|
-
|
1307
|
-
# 处理wbuff
|
1308
1332
|
data = src_info[ :wbuff ]
|
1309
1333
|
|
1310
1334
|
# 写前为空,处理关闭写
|
@@ -1350,13 +1374,6 @@ module Girl
|
|
1350
1374
|
return if dst.closed?
|
1351
1375
|
dst_info = @dst_infos[ dst ]
|
1352
1376
|
src = dst_info[ :src ]
|
1353
|
-
|
1354
|
-
# 处理关闭
|
1355
|
-
if dst_info[ :closing ] then
|
1356
|
-
close_dst( dst )
|
1357
|
-
return
|
1358
|
-
end
|
1359
|
-
|
1360
1377
|
data = dst_info[ :wbuff ]
|
1361
1378
|
|
1362
1379
|
# 写前为空,处理关闭写
|
@@ -1399,13 +1416,6 @@ module Girl
|
|
1399
1416
|
return if stream.closed?
|
1400
1417
|
stream_info = @stream_infos[ stream ]
|
1401
1418
|
src = stream_info[ :src ]
|
1402
|
-
|
1403
|
-
# 处理关闭
|
1404
|
-
if stream_info[ :closing ] then
|
1405
|
-
close_stream( stream )
|
1406
|
-
return
|
1407
|
-
end
|
1408
|
-
|
1409
1419
|
data = stream_info[ :wbuff ]
|
1410
1420
|
|
1411
1421
|
# 写前为空,处理关闭写
|