girl 9.1.1 → 9.1.3

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.
@@ -3,9 +3,12 @@ module Girl
3
3
  include Dns
4
4
 
5
5
  def initialize(
6
+ redir_host,
6
7
  redir_port,
7
8
  memd_port,
9
+ relayd_host,
8
10
  relayd_port,
11
+ tspd_host,
9
12
  tspd_port,
10
13
  proxyd_host,
11
14
  proxyd_port,
@@ -45,34 +48,34 @@ module Girl
45
48
  is_server_fastopen )
46
49
 
47
50
  @proxyd_host = proxyd_host
48
- @proxyd_addr = Socket.sockaddr_in( proxyd_port, proxyd_host )
49
- @nameserver_addrs = nameservers.map{ | n | Socket.sockaddr_in( 53, n ) }
51
+ @proxyd_addr = Socket.sockaddr_in(proxyd_port, proxyd_host)
52
+ @nameserver_addrs = nameservers.map{|n| Socket.sockaddr_in(53, n)}
50
53
  @im = im
51
54
  @directs = directs
52
55
  @remotes = remotes
53
- @local_ips = Socket.ip_address_list.select{ | info | info.ipv4? }.map{ | info | info.ip_address }
54
- @update_roles = [ :dns, :dst, :mem, :p1, :src, :rsv ] # 参与淘汰的角色
56
+ @local_ips = Socket.ip_address_list.select{|info| info.ipv4?}.map{|info| info.ip_address}
57
+ @update_roles = [:dns, :dst, :mem, :p1, :src, :rsv] # 参与淘汰的角色
55
58
  @updates_limit = 1007 # 淘汰池上限,1015(mac) - info, infod, memd, proxy, redir, relayd, rsvd, tspd
56
59
  @eliminate_count = 0 # 淘汰次数
57
60
  @reads = [] # 读池
58
61
  @writes = [] # 写池
59
62
  @roles = {} # sock => :dns / :dst / :girl / :infod / :mem / :memd / :p1 / :proxy / :redir / :relay / :relayd / :rsv / :rsvd / :src / :tspd
60
63
  @updates = {} # sock => updated_at
61
- @proxy_infos = {} # proxy => { :is_syn :paused_p1s :paused_srcs :rbuff :recv_at :wbuff }
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 }
65
- @src_infos = {} # src => { :addrinfo :closing :destination_domain :destination_port :dst :is_connect :overflowing :proxy_proto :proxy_type :rbuff :src_id :wbuff }
66
- @dst_infos = {} # dst => { :closing :connected :domain :ip :overflowing :port :src :wbuff }
67
- @dns_infos = {} # dns => { :domain :src }
68
- @rsv_infos = {} # rsv => { :addrinfo :domain :type }
69
- @near_infos = {} # near_id => { :addrinfo :created_at :domain :id :type }
70
- @resolv_caches = {} # domain => [ ip, created_at ]
64
+ @proxy_infos = {} # proxy => {:is_syn :paused_p1s :paused_srcs :rbuff :recv_at :wbuff}
65
+ @mem_infos = {} # mem => {:wbuff}
66
+ @relay_infos = {} # relay => {:addrinfo :closing :girl :overflowing :wbuff}
67
+ @girl_infos = {} # girl => {:closing :connected :is_syn :overflowing :relay :wbuff}
68
+ @src_infos = {} # src => {:addrinfo :closing :destination_domain :destination_port :dst :is_connect :overflowing :proxy_proto :proxy_type :rbuff :src_id :wbuff}
69
+ @dst_infos = {} # dst => {:closing :connected :domain :ip :overflowing :port :src :wbuff}
70
+ @dns_infos = {} # dns => {:domain :src}
71
+ @rsv_infos = {} # rsv => {:addrinfo :domain :type}
72
+ @near_infos = {} # near_id => {:addrinfo :created_at :domain :id :type}
73
+ @resolv_caches = {} # domain => [ip, created_at]
71
74
  @is_direct_caches = {} # ip => true / false
72
- @response_caches = {} # domain => [ response, created_at, ip, is_remote ]
73
- @response6_caches = {} # domain => [ response, created_at, ip, is_remote ]
74
- @p1_infos = {} # p1 => { :closing :connected :overflowing :p2_id :wbuff }
75
- @appd_addr = Socket.sockaddr_in( appd_port, appd_host )
75
+ @response_caches = {} # domain => [response, created_at, ip, is_remote]
76
+ @response6_caches = {} # domain => [response, created_at, ip, is_remote]
77
+ @p1_infos = {} # p1 => {:closing :connected :overflowing :p2_id :wbuff}
78
+ @appd_addr = Socket.sockaddr_in(appd_port, appd_host)
76
79
 
77
80
  @head_len = head_len
78
81
  @h_a_new_source = h_a_new_source
@@ -103,12 +106,12 @@ module Girl
103
106
  @is_client_fastopen = is_client_fastopen
104
107
  @is_server_fastopen = is_server_fastopen
105
108
 
106
- new_a_redir( redir_port )
107
- new_a_infod( redir_port )
108
- new_a_memd( memd_port )
109
- new_a_relayd( relayd_port )
110
- new_a_rsvd( tspd_port )
111
- new_a_tspd( tspd_port )
109
+ new_a_redir(redir_host, redir_port)
110
+ new_a_infod(redir_port)
111
+ new_a_memd(memd_port)
112
+ new_a_relayd(relayd_host, relayd_port)
113
+ new_a_rsvd(tspd_host, tspd_port)
114
+ new_a_tspd(tspd_host, tspd_port)
112
115
  new_a_proxy
113
116
  end
114
117
 
@@ -117,67 +120,67 @@ module Girl
117
120
  loop_heartbeat
118
121
 
119
122
  loop do
120
- rs, ws = IO.select( @reads, @writes )
123
+ rs, ws = IO.select(@reads, @writes)
121
124
 
122
- rs.each do | sock |
123
- role = @roles[ sock ]
125
+ rs.each do |sock|
126
+ role = @roles[sock]
124
127
 
125
128
  case role
126
- when :dns then
127
- read_dns( sock )
128
- when :dst then
129
- read_dst( sock )
130
- when :girl then
131
- read_girl( sock )
132
- when :infod then
133
- read_infod( sock )
134
- when :mem then
135
- read_mem( sock )
136
- when :memd then
137
- read_memd( sock )
138
- when :p1 then
139
- read_p1( sock )
140
- when :proxy then
141
- read_proxy( sock )
142
- when :redir then
143
- read_redir( sock )
144
- when :relay then
145
- read_relay( sock )
146
- when :relayd then
147
- read_relayd( sock )
148
- when :rsv then
149
- read_rsv( sock )
150
- when :rsvd then
151
- read_rsvd( sock )
152
- when :src then
153
- read_src( sock )
154
- when :tspd then
155
- read_tspd( sock )
129
+ when :dns
130
+ read_dns(sock)
131
+ when :dst
132
+ read_dst(sock)
133
+ when :girl
134
+ read_girl(sock)
135
+ when :infod
136
+ read_infod(sock)
137
+ when :mem
138
+ read_mem(sock)
139
+ when :memd
140
+ read_memd(sock)
141
+ when :p1
142
+ read_p1(sock)
143
+ when :proxy
144
+ read_proxy(sock)
145
+ when :redir
146
+ read_redir(sock)
147
+ when :relay
148
+ read_relay(sock)
149
+ when :relayd
150
+ read_relayd(sock)
151
+ when :rsv
152
+ read_rsv(sock)
153
+ when :rsvd
154
+ read_rsvd(sock)
155
+ when :src
156
+ read_src(sock)
157
+ when :tspd
158
+ read_tspd(sock)
156
159
  else
157
- close_sock( sock )
160
+ close_sock(sock)
158
161
  end
159
162
  end
160
163
 
161
- ws.each do | sock |
162
- role = @roles[ sock ]
164
+ ws.each do |sock|
165
+ role = @roles[sock]
163
166
 
164
167
  case role
165
- when :dst then
166
- write_dst( sock )
167
- when :girl then
168
- write_girl( sock )
169
- when :mem then
170
- write_mem( sock )
171
- when :p1 then
172
- write_p1( sock )
173
- when :proxy then
174
- write_proxy( sock )
175
- when :relay then
176
- write_relay( sock )
177
- when :src then
178
- write_src( sock )
168
+ when :dst
169
+ write_dst(sock)
170
+ when :girl
171
+ write_girl(sock)
172
+ when :mem
173
+ write_mem(sock)
174
+ when :p1
175
+ write_p1(sock)
176
+ when :proxy
177
+ write_proxy(sock)
178
+ when :relay
179
+ write_relay(sock)
180
+ when :src
181
+ write_src(sock)
179
182
  else
180
- close_sock( sock )
183
+ close_sock(sock)
181
184
  end
182
185
  end
183
186
  end
@@ -192,583 +195,578 @@ module Girl
192
195
 
193
196
  private
194
197
 
195
- def add_dst_wbuff( dst, data )
198
+ def add_dst_wbuff(dst, data)
196
199
  return if dst.nil? || dst.closed? || data.nil? || data.empty?
197
- dst_info = @dst_infos[ dst ]
198
- dst_info[ :wbuff ] << data
199
- bytesize = dst_info[ :wbuff ].bytesize
200
+ dst_info = @dst_infos[dst]
201
+ dst_info[:wbuff] << data
202
+ bytesize = dst_info[:wbuff].bytesize
200
203
 
201
- if bytesize >= CLOSE_ABOVE then
202
- puts "close overflow dst #{ dst_info[ :domain ] }"
203
- close_dst( dst )
204
+ if bytesize >= CLOSE_ABOVE
205
+ puts "close overflow dst #{dst_info[:domain]}"
206
+ close_dst(dst)
204
207
  return
205
208
  end
206
209
 
207
- if !dst_info[ :overflowing ] && ( bytesize >= WBUFF_LIMIT ) then
208
- puts "dst overflow pause src #{ dst_info[ :domain ] }"
209
- @reads.delete( dst_info[ :src ] )
210
- dst_info[ :overflowing ] = true
210
+ if !dst_info[:overflowing] && (bytesize >= WBUFF_LIMIT)
211
+ puts "dst overflow pause src #{dst_info[:domain]}"
212
+ @reads.delete(dst_info[:src])
213
+ dst_info[:overflowing] = true
211
214
  end
212
215
 
213
- add_write( dst )
216
+ add_write(dst)
214
217
  end
215
218
 
216
- def add_girl_wbuff( girl, data )
219
+ def add_girl_wbuff(girl, data)
217
220
  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
+ girl_info = @girl_infos[girl]
222
+ girl_info[:wbuff] << data
223
+ bytesize = girl_info[:wbuff].bytesize
221
224
 
222
- if bytesize >= CLOSE_ABOVE then
225
+ if bytesize >= CLOSE_ABOVE
223
226
  puts "close overflow girl"
224
- close_girl( girl )
227
+ close_girl(girl)
225
228
  return
226
229
  end
227
230
 
228
- if !girl_info[ :overflowing ] && ( bytesize >= WBUFF_LIMIT ) then
231
+ if !girl_info[:overflowing] && (bytesize >= WBUFF_LIMIT)
229
232
  puts "girl overflow pause relay"
230
- @reads.delete( girl_info[ :relay ] )
231
- girl_info[ :overflowing ] = true
233
+ @reads.delete(girl_info[:relay])
234
+ girl_info[:overflowing] = true
232
235
  end
233
236
 
234
- add_write( girl )
237
+ add_write(girl)
235
238
  end
236
239
 
237
- def add_mem_wbuff( mem, data )
240
+ def add_mem_wbuff(mem, data)
238
241
  return if mem.nil? || mem.closed? || data.nil? || data.empty?
239
- mem_info = @mem_infos[ mem ]
240
- mem_info[ :wbuff ] << data
241
- add_write( mem )
242
+ mem_info = @mem_infos[mem]
243
+ mem_info[:wbuff] << data
244
+ add_write(mem)
242
245
  end
243
246
 
244
- def add_p1_wbuff( p1, data )
247
+ def add_p1_wbuff(p1, data)
245
248
  return if p1.nil? || p1.closed? || data.nil? || data.empty?
246
- p1_info = @p1_infos[ p1 ]
247
- p1_info[ :wbuff ] << data
248
- bytesize = p1_info[ :wbuff ].bytesize
249
- p2_id = p1_info[ :p2_id ]
249
+ p1_info = @p1_infos[p1]
250
+ p1_info[:wbuff] << data
251
+ bytesize = p1_info[:wbuff].bytesize
252
+ p2_id = p1_info[:p2_id]
250
253
 
251
- if bytesize >= CLOSE_ABOVE then
252
- puts "close overflow p1 #{ p2_id }"
253
- close_p1( p1 )
254
+ if bytesize >= CLOSE_ABOVE
255
+ puts "close overflow p1 #{p2_id}"
256
+ close_p1(p1)
254
257
  return
255
258
  end
256
259
 
257
- if !p1_info[ :overflowing ] && ( bytesize >= WBUFF_LIMIT ) then
258
- puts "add h_p1_overflow #{ p2_id }"
259
- msg = "#{ @h_p1_overflow }#{ [ p2_id ].pack( 'Q>' ) }"
260
- add_proxy_wbuff( pack_a_chunk( msg ) )
261
- p1_info[ :overflowing ] = true
260
+ if !p1_info[:overflowing] && (bytesize >= WBUFF_LIMIT)
261
+ puts "add h_p1_overflow #{p2_id}"
262
+ msg = "#{@h_p1_overflow}#{[p2_id].pack('Q>')}"
263
+ add_proxy_wbuff(pack_a_chunk(msg))
264
+ p1_info[:overflowing] = true
262
265
  end
263
266
 
264
- add_write( p1 )
267
+ add_write(p1)
265
268
  end
266
269
 
267
- def add_proxy_wbuff( data )
270
+ def add_proxy_wbuff(data)
268
271
  return if @proxy.closed? || data.nil? || data.empty?
269
- proxy_info = @proxy_infos[ @proxy ]
270
- proxy_info[ :wbuff ] << data
271
- bytesize = proxy_info[ :wbuff ].bytesize
272
+ proxy_info = @proxy_infos[@proxy]
273
+ proxy_info[:wbuff] << data
274
+ bytesize = proxy_info[:wbuff].bytesize
272
275
 
273
- if bytesize >= CLOSE_ABOVE then
276
+ if bytesize >= CLOSE_ABOVE
274
277
  puts "close overflow proxy"
275
- close_proxy( @proxy )
278
+ close_proxy(@proxy)
276
279
  return
277
280
  end
278
281
 
279
- add_write( @proxy )
282
+ add_write(@proxy)
280
283
  end
281
284
 
282
- def add_read( sock, role = nil )
283
- return if sock.nil? || sock.closed? || @reads.include?( sock )
285
+ def add_read(sock, role = nil)
286
+ return if sock.nil? || sock.closed? || @reads.include?(sock)
284
287
  @reads << sock
285
288
 
286
- if role then
287
- @roles[ sock ] = role
289
+ if role
290
+ @roles[sock] = role
288
291
  else
289
- role = @roles[ sock ]
292
+ role = @roles[sock]
290
293
  end
291
294
 
292
- if @update_roles.include?( role ) then
293
- set_update( sock )
294
- end
295
+ set_update(sock) if @update_roles.include?(role)
295
296
  end
296
297
 
297
- def add_relay_wbuff( relay, data )
298
+ def add_relay_wbuff(relay, data)
298
299
  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
300
+ relay_info = @relay_infos[relay]
301
+ relay_info[:wbuff] << data
302
+ bytesize = relay_info[:wbuff].bytesize
302
303
 
303
- if bytesize >= CLOSE_ABOVE then
304
- puts "close overflow relay #{ relay_info[ :addrinfo ].ip_unpack.inspect }"
305
- close_relay( relay )
304
+ if bytesize >= CLOSE_ABOVE
305
+ puts "close overflow relay #{relay_info[:addrinfo].ip_unpack.inspect}"
306
+ close_relay(relay)
306
307
  return
307
308
  end
308
309
 
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
310
+ if !relay_info[:overflowing] && (bytesize >= WBUFF_LIMIT)
311
+ puts "relay overflow pause girl #{relay_info[:addrinfo].ip_unpack.inspect}"
312
+ @reads.delete(relay_info[:girl])
313
+ relay_info[:overflowing] = true
313
314
  end
314
315
 
315
- add_write( relay )
316
+ add_write(relay)
316
317
  end
317
318
 
318
- def add_socks5_conn_reply( src )
319
+ def add_socks5_conn_reply(src)
319
320
  # +----+-----+-------+------+----------+----------+
320
321
  # |VER | REP | RSV | ATYP | BND.ADDR | BND.PORT |
321
322
  # +----+-----+-------+------+----------+----------+
322
323
  # | 1 | 1 | X'00' | 1 | Variable | 2 |
323
324
  # +----+-----+-------+------+----------+----------+
324
325
  redir_ip, redir_port = @redir_local_address.ip_unpack
325
- data = [ [ 5, 0, 0, 1 ].pack( 'C4' ), IPAddr.new( redir_ip ).hton, [ redir_port ].pack( 'n' ) ].join
326
- add_src_wbuff( src, data )
326
+ data = [[5, 0, 0, 1].pack('C4'), IPAddr.new(redir_ip).hton, [redir_port].pack('n')].join
327
+ add_src_wbuff(src, data)
327
328
  end
328
329
 
329
- def add_src_rbuff( src, data )
330
+ def add_src_rbuff(src, data)
330
331
  return if src.nil? || src.closed? || data.nil? || data.empty?
331
- src_info = @src_infos[ src ]
332
- puts "add src rbuff #{ data.bytesize }" if @is_debug
333
- src_info[ :rbuff ] << data
332
+ src_info = @src_infos[src]
333
+ puts "add src rbuff #{data.bytesize}" if @is_debug
334
+ src_info[:rbuff] << data
334
335
 
335
- if src_info[ :rbuff ].bytesize >= WBUFF_LIMIT then
336
+ if src_info[:rbuff].bytesize >= WBUFF_LIMIT
336
337
  puts "src rbuff full"
337
- close_src( src )
338
+ close_src(src)
338
339
  end
339
340
  end
340
341
 
341
- def add_src_wbuff( src, data )
342
+ def add_src_wbuff(src, data)
342
343
  return if src.nil? || src.closed? || data.nil? || data.empty?
343
- src_info = @src_infos[ src ]
344
- src_info[ :wbuff ] << data
345
- bytesize = src_info[ :wbuff ].bytesize
346
- src_id = src_info[ :src_id ]
347
- domain = src_info[ :destination_domain ]
348
-
349
- if bytesize >= CLOSE_ABOVE then
350
- puts "close overflow src #{ src_id } #{ domain }"
351
- close_src( src )
352
- return
353
- end
354
-
355
- if !src_info[ :overflowing ] && ( bytesize >= WBUFF_LIMIT ) then
356
- if src_info[ :proxy_type ] == :direct then
357
- puts "src overflow pause dst #{ src_id } #{ domain }"
358
- @reads.delete( src_info[ :dst ] )
359
- elsif src_info[ :proxy_type ] == :remote then
360
- puts "add h_src_overflow #{ src_id } #{ domain }"
361
- msg = "#{ @h_src_overflow }#{ [ src_id ].pack( 'Q>' ) }"
362
- add_proxy_wbuff( pack_a_chunk( msg ) )
344
+ src_info = @src_infos[src]
345
+ src_info[:wbuff] << data
346
+ bytesize = src_info[:wbuff].bytesize
347
+ src_id = src_info[:src_id]
348
+ domain = src_info[:destination_domain]
349
+
350
+ if bytesize >= CLOSE_ABOVE
351
+ puts "close overflow src #{src_id} #{domain}"
352
+ close_src(src)
353
+ return
354
+ end
355
+
356
+ if !src_info[:overflowing] && (bytesize >= WBUFF_LIMIT)
357
+ if src_info[:proxy_type] == :direct
358
+ puts "src overflow pause dst #{src_id} #{domain}"
359
+ @reads.delete(src_info[:dst])
360
+ elsif src_info[:proxy_type] == :remote
361
+ puts "add h_src_overflow #{src_id} #{domain}"
362
+ msg = "#{@h_src_overflow}#{[src_id].pack('Q>')}"
363
+ add_proxy_wbuff(pack_a_chunk(msg))
363
364
  end
364
365
 
365
- src_info[ :overflowing ] = true
366
+ src_info[:overflowing] = true
366
367
  end
367
368
 
368
- add_write( src )
369
+ add_write(src)
369
370
  end
370
371
 
371
- def add_write( sock )
372
- return if sock.nil? || sock.closed? || @writes.include?( sock )
372
+ def add_write(sock)
373
+ return if sock.nil? || sock.closed? || @writes.include?(sock)
373
374
  @writes << sock
374
- role = @roles[ sock ]
375
-
376
- if @update_roles.include?( role ) then
377
- set_update( sock )
378
- end
375
+ role = @roles[sock]
376
+ set_update(sock) if @update_roles.include?(role)
379
377
  end
380
378
 
381
379
  def check_expire_dnses
382
380
  now = Time.new
383
381
 
384
- @dns_infos.select{ | dns, _ | now.to_i - @updates[ dns ].to_i >= @expire_short_after }.each do | dns, info |
385
- puts "expire dns #{ info[ :domain ] }" if @is_debug
386
- close_dns( dns )
382
+ @dns_infos.select{|dns, _| now.to_i - @updates[dns].to_i >= @expire_short_after}.each do |dns, info|
383
+ puts "expire dns #{info[:domain]}" if @is_debug
384
+ close_dns(dns)
387
385
  end
388
386
  end
389
387
 
390
388
  def check_expire_dsts
391
389
  now = Time.new
392
390
 
393
- @dst_infos.select{ | dst, info | info[ :connected ] ? ( now.to_i - @updates[ dst ].to_i >= @expire_long_after ) : ( now.to_i - @updates[ dst ].to_i >= @expire_connecting ) }.each do | dst, info |
394
- puts "expire dst #{ info[ :domain ] }" if @is_debug
395
- close_dst( dst )
391
+ @dst_infos.select{|dst, info| info[:connected] ? (now.to_i - @updates[dst].to_i >= @expire_long_after) : (now.to_i - @updates[dst].to_i >= @expire_connecting)}.each do |dst, info|
392
+ puts "expire dst #{info[:domain]}" if @is_debug
393
+ close_dst(dst)
396
394
  end
397
395
  end
398
396
 
399
397
  def check_expire_girls
400
398
  now = Time.new
401
399
 
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, _ |
400
+ @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
401
  puts "expire girl" if @is_debug
404
- close_girl( girl )
402
+ close_girl(girl)
405
403
  end
406
404
  end
407
405
 
408
406
  def check_expire_mems
409
407
  now = Time.new
410
408
 
411
- @mem_infos.select{ | mem, _ | now.to_i - @updates[ mem ].to_i >= @expire_short_after }.each do | mem, _ |
409
+ @mem_infos.select{|mem, _| now.to_i - @updates[mem].to_i >= @expire_short_after}.each do |mem, _|
412
410
  puts "expire mem" if @is_debug
413
- close_mem( mem )
411
+ close_mem(mem)
414
412
  end
415
413
  end
416
414
 
417
415
  def check_expire_nears
418
416
  now = Time.new
419
417
 
420
- @near_infos.select{ | _, info | now.to_i - info[ :created_at ].to_i >= @expire_short_after }.each do | near_id, info |
421
- puts "expire near #{ info[ :domain ] }" if @is_debug
422
- @near_infos.delete( near_id )
418
+ @near_infos.select{|_, info| now.to_i - info[:created_at].to_i >= @expire_short_after}.each do |near_id, info|
419
+ puts "expire near #{info[:domain]}" if @is_debug
420
+ @near_infos.delete(near_id)
423
421
  end
424
422
  end
425
423
 
426
424
  def check_expire_p1s
427
425
  now = Time.new
428
426
 
429
- @p1_infos.select{ | p1, info | info[ :connected ] ? ( now.to_i - @updates[ p1 ].to_i >= @expire_long_after ) : ( now.to_i - @updates[ p1 ].to_i >= @expire_connecting ) }.each do | p1, info |
430
- puts "expire p1 #{ info[ :p2_id ] }" if @is_debug
431
- close_p1( p1 )
427
+ @p1_infos.select{|p1, info| info[:connected] ? (now.to_i - @updates[p1].to_i >= @expire_long_after) : (now.to_i - @updates[p1].to_i >= @expire_connecting)}.each do |p1, info|
428
+ puts "expire p1 #{info[:p2_id]}" if @is_debug
429
+ close_p1(p1)
432
430
  end
433
431
  end
434
432
 
435
433
  def check_expire_relays
436
434
  now = Time.new
437
435
 
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 )
436
+ @relay_infos.select{|relay, _| now.to_i - @updates[relay].to_i >= @expire_long_after}.each do |relay, info|
437
+ puts "expire relay #{info[:addrinfo].ip_unpack.inspect}" if @is_debug
438
+ close_relay(relay)
441
439
  end
442
440
  end
443
441
 
444
442
  def check_expire_rsvs
445
443
  now = Time.new
446
444
 
447
- @rsv_infos.select{ | rsv, _ | now.to_i - @updates[ rsv ].to_i >= @expire_short_after }.each do | rsv, info |
448
- puts "expire rsv #{ info[ :domain ] }" if @is_debug
449
- close_rsv( rsv )
445
+ @rsv_infos.select{|rsv, _| now.to_i - @updates[rsv].to_i >= @expire_short_after}.each do |rsv, info|
446
+ puts "expire rsv #{info[:domain]}" if @is_debug
447
+ close_rsv(rsv)
450
448
  end
451
449
  end
452
450
 
453
451
  def check_expire_srcs
454
452
  now = Time.new
455
453
 
456
- @src_infos.select{ | src, _ | now.to_i - @updates[ src ].to_i >= @expire_long_after }.each do | src, info |
457
- puts "expire src #{ info[ :destination_domain ] }" if @is_debug
458
- close_src( src )
454
+ @src_infos.select{|src, _| now.to_i - @updates[src].to_i >= @expire_long_after}.each do |src, info|
455
+ puts "expire src #{info[:destination_domain]}" if @is_debug
456
+ close_src(src)
459
457
  end
460
458
  end
461
459
 
462
- def close_dns( dns )
460
+ def close_dns(dns)
463
461
  return nil if dns.nil? || dns.closed?
464
- close_sock( dns )
465
- dns_info = @dns_infos.delete( dns )
466
- puts "close dns #{ dns_info[ :domain ] }" if @is_debug
462
+ close_sock(dns)
463
+ dns_info = @dns_infos.delete(dns)
464
+ puts "close dns #{dns_info[:domain]}" if @is_debug
467
465
  dns_info
468
466
  end
469
467
 
470
- def close_dst( dst )
468
+ def close_dst(dst)
471
469
  return nil if dst.nil? || dst.closed?
472
- close_sock( dst )
473
- dst_info = @dst_infos.delete( dst )
474
- puts "close dst #{ dst_info[ :domain ] }" if @is_debug
475
- set_src_closing( dst_info[ :src ] ) if dst_info
470
+ close_sock(dst)
471
+ dst_info = @dst_infos.delete(dst)
472
+ puts "close dst #{dst_info[:domain]}" if @is_debug
473
+ set_src_closing(dst_info[:src]) if dst_info
476
474
  dst_info
477
475
  end
478
476
 
479
- def close_girl( girl )
477
+ def close_girl(girl)
480
478
  return nil if girl.nil? || girl.closed?
481
- close_sock( girl )
482
- girl_info = @girl_infos.delete( girl )
479
+ close_sock(girl)
480
+ girl_info = @girl_infos.delete(girl)
483
481
  puts "close girl" if @is_debug
484
- set_relay_closing( girl_info[ :relay ] ) if girl_info
482
+ set_relay_closing(girl_info[:relay]) if girl_info
485
483
  girl_info
486
484
  end
487
485
 
488
- def close_mem( mem )
486
+ def close_mem(mem)
489
487
  return nil if mem.nil? || mem.closed?
490
- close_sock( mem )
491
- @mem_infos.delete( mem )
488
+ close_sock(mem)
489
+ @mem_infos.delete(mem)
492
490
  end
493
491
 
494
- def close_p1( p1 )
492
+ def close_p1(p1)
495
493
  return nil if p1.nil? || p1.closed?
496
- close_sock( p1 )
497
- p1_info = @p1_infos.delete( p1 )
494
+ close_sock(p1)
495
+ p1_info = @p1_infos.delete(p1)
498
496
 
499
- unless @proxy.closed? then
500
- proxy_info = @proxy_infos[ @proxy ]
501
- proxy_info[ :paused_p1s ].delete( p1 )
502
- p2_id = p1_info[ :p2_id ]
503
- puts "add h_p1_close #{ p2_id }"
504
- msg = "#{ @h_p1_close }#{ [ p2_id ].pack( 'Q>' ) }"
505
- add_proxy_wbuff( pack_a_chunk( msg ) )
497
+ unless @proxy.closed?
498
+ proxy_info = @proxy_infos[@proxy]
499
+ proxy_info[:paused_p1s].delete(p1)
500
+ p2_id = p1_info[:p2_id]
501
+ puts "add h_p1_close #{p2_id}"
502
+ msg = "#{@h_p1_close}#{[p2_id].pack('Q>')}"
503
+ add_proxy_wbuff(pack_a_chunk(msg))
506
504
  end
507
505
 
508
506
  p1_info
509
507
  end
510
508
 
511
- def close_proxy( proxy )
509
+ def close_proxy(proxy)
512
510
  return if proxy.nil? || proxy.closed?
513
- close_sock( proxy )
514
- proxy_info = @proxy_infos.delete( proxy )
511
+ close_sock(proxy)
512
+ proxy_info = @proxy_infos.delete(proxy)
515
513
  puts "close proxy"
516
- @src_infos.each{ | src, _ | close_src( src ) }
517
- @p1_infos.each{ | p1, _ | close_p1( p1 ) }
514
+ @src_infos.each{|src, _| close_src(src)}
515
+ @p1_infos.each{|p1, _| close_p1(p1)}
518
516
  proxy_info
519
517
  end
520
518
 
521
- def close_relay( relay )
519
+ def close_relay(relay)
522
520
  return nil if relay.nil? || relay.closed?
523
- close_sock( relay )
524
- relay_info = @relay_infos.delete( relay )
521
+ close_sock(relay)
522
+ relay_info = @relay_infos.delete(relay)
525
523
  puts "close relay" if @is_debug
526
- set_girl_closing( relay_info[ :girl ] ) if relay_info
524
+ set_girl_closing(relay_info[:girl]) if relay_info
527
525
  relay_info
528
526
  end
529
527
 
530
- def close_rsv( rsv )
528
+ def close_rsv(rsv)
531
529
  return nil if rsv.nil? || rsv.closed?
532
- close_sock( rsv )
533
- rsv_info = @rsv_infos.delete( rsv )
534
- puts "close rsv #{ rsv_info[ :domain ] }" if @is_debug
530
+ close_sock(rsv)
531
+ rsv_info = @rsv_infos.delete(rsv)
532
+ puts "close rsv #{rsv_info[:domain]}" if @is_debug
535
533
  rsv_info
536
534
  end
537
535
 
538
- def close_sock( sock )
536
+ def close_sock(sock)
539
537
  return if sock.nil? || sock.closed?
540
538
  sock.close
541
- @reads.delete( sock )
542
- @writes.delete( sock )
543
- @updates.delete( sock )
544
- @roles.delete( sock )
539
+ @reads.delete(sock)
540
+ @writes.delete(sock)
541
+ @updates.delete(sock)
542
+ @roles.delete(sock)
545
543
  end
546
544
 
547
- def close_src( src )
545
+ def close_src(src)
548
546
  return nil if src.nil? || src.closed?
549
- close_sock( src )
550
- src_info = @src_infos.delete( src )
551
- src_id = src_info[ :src_id ]
552
- domain = src_info[ :destination_domain ]
553
- puts "close src #{ domain }" if @is_debug
554
-
555
- if src_info[ :proxy_type ] == :direct then
556
- set_dst_closing( src_info[ :dst ] )
557
- elsif ( src_info[ :proxy_type ] == :remote ) && !@proxy.closed? then
558
- proxy_info = @proxy_infos[ @proxy ]
559
- proxy_info[ :paused_srcs ].delete( src )
560
- puts "add h_src_close #{ src_id }" if @is_debug
561
- msg = "#{ @h_src_close }#{ [ src_id ].pack( 'Q>' ) }"
562
- add_proxy_wbuff( pack_a_chunk( msg ) )
547
+ close_sock(src)
548
+ src_info = @src_infos.delete(src)
549
+ src_id = src_info[:src_id]
550
+ domain = src_info[:destination_domain]
551
+ puts "close src #{domain}" if @is_debug
552
+
553
+ if src_info[:proxy_type] == :direct
554
+ set_dst_closing(src_info[:dst])
555
+ elsif (src_info[:proxy_type] == :remote) && !@proxy.closed?
556
+ proxy_info = @proxy_infos[@proxy]
557
+ proxy_info[:paused_srcs].delete(src)
558
+ puts "add h_src_close #{src_id}" if @is_debug
559
+ msg = "#{@h_src_close}#{[src_id].pack('Q>')}"
560
+ add_proxy_wbuff(pack_a_chunk(msg))
563
561
  end
564
562
 
565
563
  src_info
566
564
  end
567
565
 
568
- def deal_msg( data )
566
+ def deal_msg(data)
569
567
  return if data.nil? || data.empty? || @proxy.closed?
570
- proxy_info = @proxy_infos[ @proxy ]
568
+ proxy_info = @proxy_infos[@proxy]
571
569
  now = Time.new
572
- proxy_info[ :recv_at ] = now
573
- h = data[ 0 ]
570
+ proxy_info[:recv_at] = now
571
+ h = data[0]
574
572
 
575
573
  case h
576
- when @h_a_new_p2 then
574
+ when @h_a_new_p2
577
575
  return if data.bytesize < 9
578
- p2_id = data[ 1, 8 ].unpack( 'Q>' ).first
579
- puts "got h_a_new_p2 #{ p2_id }"
580
- new_a_p1( p2_id )
581
- when @h_dst_close then
576
+ p2_id = data[1, 8].unpack('Q>').first
577
+ puts "got h_a_new_p2 #{p2_id}"
578
+ new_a_p1(p2_id)
579
+ when @h_dst_close
582
580
  return if data.bytesize < 9
583
- src_id = data[ 1, 8 ].unpack( 'Q>' ).first
584
- puts "got h_dst_close #{ src_id }" if @is_debug
585
- src, _ = @src_infos.find{ | _, info | info[ :src_id ] == src_id }
586
- set_src_closing( src )
587
- when @h_heartbeat then
581
+ src_id = data[1, 8].unpack('Q>').first
582
+ puts "got h_dst_close #{src_id}" if @is_debug
583
+ src, _ = @src_infos.find{|_, info| info[:src_id] == src_id}
584
+ set_src_closing(src)
585
+ when @h_heartbeat
588
586
  puts "got h_heartbeat" if @is_debug
589
- when @h_p2_close then
587
+ when @h_p2_close
590
588
  return if data.bytesize < 9
591
- p2_id = data[ 1, 8 ].unpack( 'Q>' ).first
592
- puts "got h_p2_close #{ p2_id }"
593
- p1, _ = @p1_infos.find{ | _, info | info[ :p2_id ] == p2_id }
594
- set_p1_closing( p1 )
595
- when @h_p2_traffic then
589
+ p2_id = data[1, 8].unpack('Q>').first
590
+ puts "got h_p2_close #{p2_id}"
591
+ p1, _ = @p1_infos.find{|_, info| info[:p2_id] == p2_id}
592
+ set_p1_closing(p1)
593
+ when @h_p2_traffic
596
594
  return if data.bytesize < 9
597
- p2_id = data[ 1, 8 ].unpack( 'Q>' ).first
598
- data = data[ 9..-1 ]
599
- # puts "got h_p2_traffic #{ p2_id } #{ data.bytesize }" if @is_debug
600
- p1, _ = @p1_infos.find{ | _, info | info[ :p2_id ] == p2_id }
601
- add_p1_wbuff( p1, data )
602
- when @h_p2_overflow then
595
+ p2_id = data[1, 8].unpack('Q>').first
596
+ data = data[9..-1]
597
+ # puts "got h_p2_traffic #{p2_id} #{data.bytesize}" if @is_debug
598
+ p1, _ = @p1_infos.find{|_, info| info[:p2_id] == p2_id}
599
+ add_p1_wbuff(p1, data)
600
+ when @h_p2_overflow
603
601
  return if data.bytesize < 9
604
- p2_id = data[ 1, 8 ].unpack( 'Q>' ).first
605
- puts "got h_p2_overflow pause p1 #{ p2_id }"
606
- p1, _ = @p1_infos.find{ | _, info | info[ :p2_id ] == p2_id }
607
- @reads.delete( p1 )
608
- proxy_info[ :paused_p1s ].delete( p1 )
609
- when @h_p2_underhalf then
602
+ p2_id = data[1, 8].unpack('Q>').first
603
+ puts "got h_p2_overflow pause p1 #{p2_id}"
604
+ p1, _ = @p1_infos.find{|_, info| info[:p2_id] == p2_id}
605
+ @reads.delete(p1)
606
+ proxy_info[:paused_p1s].delete(p1)
607
+ when @h_p2_underhalf
610
608
  return if data.bytesize < 9
611
- p2_id = data[ 1, 8 ].unpack( 'Q>' ).first
612
- puts "got h_p2_underhalf #{ p2_id }"
613
- p1, _ = @p1_infos.find{ | _, info | info[ :p2_id ] == p2_id }
614
- add_read( p1 )
615
- when @h_response then
609
+ p2_id = data[1, 8].unpack('Q>').first
610
+ puts "got h_p2_underhalf #{p2_id}"
611
+ p1, _ = @p1_infos.find{|_, info| info[:p2_id] == p2_id}
612
+ add_read(p1)
613
+ when @h_response
616
614
  return if data.bytesize < 3
617
- near_id = data[ 1, 8 ].unpack( 'Q>' ).first
618
- data = data[ 9..-1 ]
619
- puts "got h_response #{ near_id } #{ data.bytesize }" if @is_debug
620
- near_info = @near_infos.delete( near_id )
615
+ near_id = data[1, 8].unpack('Q>').first
616
+ data = data[9..-1]
617
+ puts "got h_response #{near_id} #{data.bytesize}" if @is_debug
618
+ near_info = @near_infos.delete(near_id)
621
619
 
622
- if near_info then
623
- data[ 0, 2 ] = near_info[ :id ]
624
- addrinfo = near_info[ :addrinfo ]
625
- send_data( @rsvd, data, addrinfo )
620
+ if near_info
621
+ data[0, 2] = near_info[:id]
622
+ addrinfo = near_info[:addrinfo]
623
+ send_data(@rsvd, data, addrinfo)
626
624
 
627
625
  begin
628
- ip = seek_ip( data )
626
+ ip = seek_ip(data)
629
627
  rescue Exception => e
630
- puts "response seek ip #{ e.class } #{ e.message }"
628
+ puts "response seek ip #{e.class} #{e.message}"
631
629
  end
632
630
 
633
- if ip then
634
- domain = near_info[ :domain ]
635
- type = near_info[ :type ]
631
+ if ip
632
+ domain = near_info[:domain]
633
+ type = near_info[:type]
636
634
 
637
- if type == 1 then
638
- @response_caches[ domain ] = [ data, now, ip, true ]
635
+ if type == 1
636
+ @response_caches[domain] = [data, now, ip, true]
639
637
  else
640
- @response6_caches[ domain ] = [ data, now, ip, true ]
638
+ @response6_caches[domain] = [data, now, ip, true]
641
639
  end
642
640
  end
643
641
  end
644
- when @h_traffic then
642
+ when @h_traffic
645
643
  return if data.bytesize < 9
646
- src_id = data[ 1, 8 ].unpack( 'Q>' ).first
647
- data = data[ 9..-1 ]
648
- # puts "got h_traffic #{ src_id } #{ data.bytesize }" if @is_debug
649
- src, _ = @src_infos.find{ | _, info | info[ :src_id ] == src_id }
650
- add_src_wbuff( src, data )
651
- when @h_dst_overflow then
644
+ src_id = data[1, 8].unpack('Q>').first
645
+ data = data[9..-1]
646
+ # puts "got h_traffic #{src_id} #{data.bytesize}" if @is_debug
647
+ src, _ = @src_infos.find{|_, info| info[:src_id] == src_id}
648
+ add_src_wbuff(src, data)
649
+ when @h_dst_overflow
652
650
  return if data.bytesize < 9
653
- src_id = data[ 1, 8 ].unpack( 'Q>' ).first
654
- puts "got h_dst_overflow pause src #{ src_id }"
655
- src, _ = @src_infos.find{ | _, info | info[ :src_id ] == src_id }
656
- @reads.delete( src )
657
- proxy_info[ :paused_srcs ].delete( src )
658
- when @h_dst_underhalf then
651
+ src_id = data[1, 8].unpack('Q>').first
652
+ puts "got h_dst_overflow pause src #{src_id}"
653
+ src, _ = @src_infos.find{|_, info| info[:src_id] == src_id}
654
+ @reads.delete(src)
655
+ proxy_info[:paused_srcs].delete(src)
656
+ when @h_dst_underhalf
659
657
  return if data.bytesize < 9
660
- src_id = data[ 1, 8 ].unpack( 'Q>' ).first
661
- puts "got h_dst_underhalf #{ src_id }"
662
- src, _ = @src_infos.find{ | _, info | info[ :src_id ] == src_id }
663
- add_read( src )
658
+ src_id = data[1, 8].unpack('Q>').first
659
+ puts "got h_dst_underhalf #{src_id}"
660
+ src, _ = @src_infos.find{|_, info| info[:src_id] == src_id}
661
+ add_read(src)
664
662
  end
665
663
  end
666
664
 
667
- def decode_to_msgs( data )
665
+ def decode_to_msgs(data)
668
666
  msgs = []
669
667
  part = ''
670
668
 
671
669
  loop do
672
- if data.bytesize <= 2 then
670
+ if data.bytesize <= 2
673
671
  part = data
674
672
  break
675
673
  end
676
674
 
677
- len = data[ 0, 2 ].unpack( 'n' ).first
675
+ len = data[0, 2].unpack('n').first
678
676
 
679
- if len == 0 then
677
+ if len == 0
680
678
  puts "msg zero len?"
681
679
  break
682
680
  end
683
681
 
684
- if data.bytesize < ( 2 + len ) then
682
+ if data.bytesize < (2 + len)
685
683
  part = data
686
684
  break
687
685
  end
688
686
 
689
- msgs << data[ 2, len ]
690
- data = data[ ( 2 + len )..-1 ]
687
+ msgs << data[2, len]
688
+ data = data[(2 + len)..-1]
691
689
  break if data.empty?
692
690
  end
693
691
 
694
- [ msgs, part ]
692
+ [msgs, part]
695
693
  end
696
694
 
697
695
  def loop_heartbeat
698
696
  Thread.new do
699
697
  loop do
700
698
  sleep HEARTBEAT_INTERVAL
701
- msg = { message_type: 'heartbeat' }
702
- send_data( @info, JSON.generate( msg ), @infod_addr )
699
+ msg = {message_type: 'heartbeat'}
700
+ send_data(@info, JSON.generate(msg), @infod_addr)
703
701
  end
704
702
  end
705
703
  end
706
704
 
707
- def make_tunnel( ip, src )
705
+ def make_tunnel(ip, src)
708
706
  return if src.nil? || src.closed?
709
- src_info = @src_infos[ src ]
710
- domain = src_info[ :destination_domain ]
711
- port = src_info[ :destination_port ]
707
+ src_info = @src_infos[src]
708
+ domain = src_info[:destination_domain]
709
+ port = src_info[:destination_port]
712
710
 
713
- if @local_ips.include?( ip ) && [ @redir_port, @tspd_port ].include?( port ) then
714
- puts "ignore #{ ip }:#{ port }"
715
- close_src( src )
711
+ if @local_ips.include?(ip) && [@redir_port, @relayd_port, @tspd_port].include?(port)
712
+ puts "ignore #{ip}:#{port}"
713
+ close_src(src)
716
714
  return
717
715
  end
718
716
 
719
- if [ domain, ip ].include?( @proxyd_host ) then
720
- # 访问远端,直连
721
- puts "direct #{ ip } #{ port }"
722
- new_a_dst( ip, src )
717
+ if [domain, ip].include?(@proxyd_host) && ![80, 443].include?(port)
718
+ # 访问远端非http端口,直连
719
+ puts "direct #{ip} #{port}"
720
+ new_a_dst(ip, src)
723
721
  return
724
722
  end
725
723
 
726
- if @is_direct_caches.include?( ip ) then
727
- is_direct = @is_direct_caches[ ip ]
724
+ if @is_direct_caches.include?(ip)
725
+ is_direct = @is_direct_caches[ip]
728
726
  else
729
727
  begin
730
- is_direct = @directs.any?{ | direct | direct.include?( ip ) }
728
+ is_direct = @directs.any?{|direct| direct.include?(ip)}
731
729
  rescue IPAddr::InvalidAddressError => e
732
- puts "make tunnel #{ e.class }"
733
- close_src( src )
730
+ puts "make tunnel #{e.class}"
731
+ close_src(src)
734
732
  return
735
733
  end
736
734
 
737
- @is_direct_caches[ ip ] = is_direct
735
+ @is_direct_caches[ip] = is_direct
738
736
  end
739
737
 
740
- if is_direct then
741
- new_a_dst( ip, src )
738
+ if is_direct
739
+ new_a_dst(ip, src)
742
740
  else
743
- set_remote( src )
741
+ set_remote(src)
744
742
  end
745
743
  end
746
744
 
747
- def new_a_dst( ip, src )
745
+ def new_a_dst(ip, src)
748
746
  return if src.nil? || src.closed?
749
- src_info = @src_infos[ src ]
750
- domain = src_info[ :destination_domain ]
751
- port = src_info[ :destination_port ]
747
+ src_info = @src_infos[src]
748
+ domain = src_info[:destination_domain]
749
+ port = src_info[:destination_port]
752
750
  check_expire_dsts
753
751
 
754
752
  begin
755
- destination_addr = Socket.sockaddr_in( port, ip )
756
- dst = Socket.new( Socket::AF_INET, Socket::SOCK_STREAM, 0 )
753
+ destination_addr = Socket.sockaddr_in(port, ip)
754
+ dst = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
757
755
  rescue Exception => e
758
- puts "new a dst #{ e.class } #{ domain } #{ ip }:#{ port }"
759
- close_src( src )
756
+ puts "new a dst #{e.class} #{domain} #{ip}:#{port}"
757
+ close_src(src)
760
758
  return
761
759
  end
762
760
 
763
- dst.setsockopt( Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1 )
761
+ dst.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)
764
762
 
765
763
  begin
766
- dst.connect_nonblock( destination_addr )
764
+ dst.connect_nonblock(destination_addr)
767
765
  rescue IO::WaitWritable
768
766
  rescue Exception => e
769
- puts "dst connect destination #{ e.class } #{ domain } #{ ip }:#{ port }"
767
+ puts "dst connect destination #{e.class} #{domain} #{ip}:#{port}"
770
768
  dst.close
771
- close_src( src )
769
+ close_src(src)
772
770
  return
773
771
  end
774
772
 
@@ -783,51 +781,51 @@ module Girl
783
781
  wbuff: ''
784
782
  }
785
783
 
786
- @dst_infos[ dst ] = dst_info
787
- src_info[ :proxy_type ] = :direct
788
- src_info[ :dst ] = dst
784
+ @dst_infos[dst] = dst_info
785
+ src_info[:proxy_type] = :direct
786
+ src_info[:dst] = dst
789
787
 
790
- if src_info[ :proxy_proto ] == :http then
791
- if src_info[ :is_connect ] then
788
+ if src_info[:proxy_proto] == :http
789
+ if src_info[:is_connect]
792
790
  puts "add HTTP_OK" if @is_debug
793
- add_src_wbuff( src, HTTP_OK )
791
+ add_src_wbuff(src, HTTP_OK)
794
792
  end
795
- elsif src_info[ :proxy_proto ] == :socks5 then
793
+ elsif src_info[:proxy_proto] == :socks5
796
794
  puts "add_socks5_conn_reply" if @is_debug
797
- add_socks5_conn_reply( src )
795
+ add_socks5_conn_reply(src)
798
796
  end
799
797
 
800
- add_read( dst, :dst )
801
- add_write( dst )
802
- data = src_info[ :rbuff ].dup
798
+ add_read(dst, :dst)
799
+ add_write(dst)
800
+ data = src_info[:rbuff].dup
803
801
 
804
- unless data.empty? then
805
- puts "move src rbuff to dst #{ domain } #{ data.bytesize }" if @is_debug
806
- add_dst_wbuff( dst, data )
802
+ unless data.empty?
803
+ puts "move src rbuff to dst #{domain} #{data.bytesize}" if @is_debug
804
+ add_dst_wbuff(dst, data)
807
805
  end
808
806
  end
809
807
 
810
- def new_a_girl( relay )
808
+ def new_a_girl(relay)
811
809
  return if relay.nil? || relay.closed?
812
810
  check_expire_girls
813
811
 
814
812
  begin
815
- girl = Socket.new( Socket::AF_INET, Socket::SOCK_STREAM, 0 )
813
+ girl = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
816
814
  rescue Exception => e
817
- puts "new a girl #{ e.class }"
818
- close_girl( girl )
815
+ puts "new a girl #{e.class}"
816
+ close_girl(girl)
819
817
  return
820
818
  end
821
819
 
822
- girl.setsockopt( Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1 )
820
+ girl.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)
823
821
 
824
822
  begin
825
- girl.connect_nonblock( @proxyd_addr )
823
+ girl.connect_nonblock(@proxyd_addr)
826
824
  rescue IO::WaitWritable
827
825
  rescue Exception => e
828
- puts "girl connect proxyd #{ e.class }"
826
+ puts "girl connect proxyd #{e.class}"
829
827
  girl.close
830
- close_girl( girl )
828
+ close_girl(girl)
831
829
  return
832
830
  end
833
831
 
@@ -840,55 +838,55 @@ module Girl
840
838
  wbuff: ''
841
839
  }
842
840
 
843
- @girl_infos[ girl ] = girl_info
844
- add_read( girl, :girl )
845
- add_write( girl )
841
+ @girl_infos[girl] = girl_info
842
+ add_read(girl, :girl)
843
+ add_write(girl)
846
844
  girl
847
845
  end
848
846
 
849
- def new_a_infod( infod_port )
850
- infod_ip = '127.0.0.1'
851
- infod_addr = Socket.sockaddr_in( infod_port, infod_ip )
852
- infod = Socket.new( Socket::AF_INET, Socket::SOCK_DGRAM, 0 )
853
- infod.setsockopt( Socket::SOL_SOCKET, Socket::SO_REUSEPORT, 1 ) if RUBY_PLATFORM.include?( 'linux' )
854
- infod.bind( infod_addr )
855
- puts "infod bind on #{ infod_ip } #{ infod_port }"
856
- add_read( infod, :infod )
857
- info = Socket.new( Socket::AF_INET, Socket::SOCK_DGRAM, 0 )
847
+ def new_a_infod(infod_port)
848
+ infod_host = '127.0.0.1'
849
+ infod_addr = Socket.sockaddr_in(infod_port, infod_host)
850
+ infod = Socket.new(Socket::AF_INET, Socket::SOCK_DGRAM, 0)
851
+ infod.setsockopt(Socket::SOL_SOCKET, Socket::SO_REUSEPORT, 1) if RUBY_PLATFORM.include?('linux')
852
+ infod.bind(infod_addr)
853
+ puts "infod bind on #{infod_host} #{infod_port}"
854
+ add_read(infod, :infod)
855
+ info = Socket.new(Socket::AF_INET, Socket::SOCK_DGRAM, 0)
858
856
  @infod_addr = infod_addr
859
857
  @infod = infod
860
858
  @info = info
861
859
  end
862
860
 
863
- def new_a_memd( memd_port )
864
- memd_ip = '127.0.0.1'
865
- memd = Socket.new( Socket::AF_INET, Socket::SOCK_STREAM, 0 )
866
- memd.setsockopt( Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1 )
867
- memd.setsockopt( Socket::SOL_SOCKET, Socket::SO_REUSEPORT, 1 ) if RUBY_PLATFORM.include?( 'linux' )
868
- memd.setsockopt( Socket::IPPROTO_TCP, Socket::TCP_FASTOPEN, 5 ) if @is_server_fastopen
869
- memd.bind( Socket.sockaddr_in( memd_port, memd_ip ) )
870
- memd.listen( 5 )
871
- puts "memd listen on #{ memd_ip } #{ memd_port }"
872
- add_read( memd, :memd )
861
+ def new_a_memd(memd_port)
862
+ memd_host = '127.0.0.1'
863
+ memd = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
864
+ memd.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)
865
+ memd.setsockopt(Socket::SOL_SOCKET, Socket::SO_REUSEPORT, 1) if RUBY_PLATFORM.include?('linux')
866
+ memd.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_FASTOPEN, 5) if @is_server_fastopen
867
+ memd.bind(Socket.sockaddr_in(memd_port, memd_host))
868
+ memd.listen(5)
869
+ puts "memd listen on #{memd_host} #{memd_port}"
870
+ add_read(memd, :memd)
873
871
  end
874
872
 
875
- def new_a_p1( p2_id )
873
+ def new_a_p1(p2_id)
876
874
  check_expire_p1s
877
875
 
878
876
  begin
879
- p1 = Socket.new( Socket::AF_INET, Socket::SOCK_STREAM, 0 )
877
+ p1 = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
880
878
  rescue Exception => e
881
- puts "new a p1 #{ e.class } #{ p2_id }"
879
+ puts "new a p1 #{e.class} #{p2_id}"
882
880
  return
883
881
  end
884
882
 
885
- p1.setsockopt( Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1 )
883
+ p1.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)
886
884
 
887
885
  begin
888
- p1.connect_nonblock( @appd_addr )
886
+ p1.connect_nonblock(@appd_addr)
889
887
  rescue IO::WaitWritable
890
888
  rescue Exception => e
891
- puts "connect appd_addr #{ e.class } #{ p2_id }"
889
+ puts "connect appd_addr #{e.class} #{p2_id}"
892
890
  p1.close
893
891
  return
894
892
  end
@@ -901,32 +899,32 @@ module Girl
901
899
  wbuff: ''
902
900
  }
903
901
 
904
- @p1_infos[ p1 ] = p1_info
905
- add_read( p1, :p1 )
906
- add_write( p1 )
902
+ @p1_infos[p1] = p1_info
903
+ add_read(p1, :p1)
904
+ add_write(p1)
907
905
  end
908
906
 
909
907
  def new_a_proxy
910
- proxy = Socket.new( Socket::AF_INET, Socket::SOCK_STREAM, 0 )
911
- proxy.setsockopt( Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1 )
908
+ proxy = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
909
+ proxy.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)
912
910
 
913
- if @is_client_fastopen then
914
- proxy.setsockopt( Socket::IPPROTO_TCP, Socket::TCP_FASTOPEN, 5 )
911
+ if @is_client_fastopen
912
+ proxy.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_FASTOPEN, 5)
915
913
  else
916
914
  begin
917
- proxy.connect_nonblock( @proxyd_addr )
915
+ proxy.connect_nonblock(@proxyd_addr)
918
916
  rescue IO::WaitWritable
919
917
  rescue Exception => e
920
- puts "connect proxyd #{ e.class }"
918
+ puts "connect proxyd #{e.class}"
921
919
  proxy.close
922
920
  return
923
921
  end
924
922
  end
925
923
 
926
- puts "im #{ @im }"
924
+ puts "im #{@im}"
927
925
  chars = []
928
- @head_len.times{ chars << rand( 256 ) }
929
- head = "#{ chars.pack( 'C*' ) }#{ [ @im.bytesize ].pack( 'C' ) }#{ @im }"
926
+ @head_len.times{chars << rand(256)}
927
+ head = "#{chars.pack('C*')}#{[@im.bytesize].pack('C')}#{@im}"
930
928
 
931
929
  proxy_info = {
932
930
  is_syn: @is_client_fastopen,
@@ -938,48 +936,47 @@ module Girl
938
936
  }
939
937
 
940
938
  @proxy = proxy
941
- @proxy_infos[ proxy ] = proxy_info
942
- add_read( proxy, :proxy )
943
- add_write( proxy )
939
+ @proxy_infos[proxy] = proxy_info
940
+ add_read(proxy, :proxy)
941
+ add_write(proxy)
944
942
  proxy_info
945
943
  end
946
944
 
947
- def new_a_redir( redir_port )
948
- redir_ip = '0.0.0.0'
949
- redir = Socket.new( Socket::AF_INET, Socket::SOCK_STREAM, 0 )
950
- redir.setsockopt( Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1 )
951
- redir.setsockopt( Socket::SOL_SOCKET, Socket::SO_REUSEADDR, 1 )
952
- redir.setsockopt( Socket::SOL_SOCKET, Socket::SO_REUSEPORT, 1 ) if RUBY_PLATFORM.include?( 'linux' )
953
- redir.setsockopt( Socket::IPPROTO_TCP, Socket::TCP_FASTOPEN, BACKLOG ) if @is_server_fastopen
954
- redir.bind( Socket.sockaddr_in( redir_port, redir_ip ) )
955
- redir.listen( BACKLOG )
956
- puts "redir listen on #{ redir_ip } #{ redir_port }"
957
- add_read( redir, :redir )
945
+ def new_a_redir(redir_host, redir_port)
946
+ redir = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
947
+ redir.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)
948
+ redir.setsockopt(Socket::SOL_SOCKET, Socket::SO_REUSEADDR, 1)
949
+ redir.setsockopt(Socket::SOL_SOCKET, Socket::SO_REUSEPORT, 1) if RUBY_PLATFORM.include?('linux')
950
+ redir.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_FASTOPEN, BACKLOG) if @is_server_fastopen
951
+ redir.bind(Socket.sockaddr_in(redir_port, redir_host))
952
+ redir.listen(BACKLOG)
953
+ puts "redir listen on #{redir_host} #{redir_port}"
954
+ add_read(redir, :redir)
958
955
  @redir_port = redir_port
959
956
  @redir_local_address = redir.local_address
960
957
  end
961
958
 
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 )
959
+ def new_a_relayd(relayd_host, relayd_port)
960
+ relayd = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
961
+ relayd.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)
962
+ relayd.setsockopt(Socket::SOL_SOCKET, Socket::SO_REUSEADDR, 1)
963
+ relayd.setsockopt(Socket::SOL_SOCKET, Socket::SO_REUSEPORT, 1) if RUBY_PLATFORM.include?('linux')
964
+ relayd.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_FASTOPEN, BACKLOG) if @is_server_fastopen
965
+ relayd.bind(Socket.sockaddr_in(relayd_port, relayd_host))
966
+ relayd.listen(BACKLOG)
967
+ puts "relayd listen on #{relayd_host} #{relayd_port}"
968
+ add_read(relayd, :relayd)
969
+ @relayd_port = relayd_port
973
970
  end
974
971
 
975
- def new_a_rsv( data, addrinfo, domain, type )
972
+ def new_a_rsv(data, addrinfo, domain, type)
976
973
  check_expire_rsvs
977
- rsv = Socket.new( Socket::AF_INET, Socket::SOCK_DGRAM, 0 )
974
+ rsv = Socket.new(Socket::AF_INET, Socket::SOCK_DGRAM, 0)
978
975
 
979
976
  begin
980
- @nameserver_addrs.each{ | addr | rsv.sendmsg( data, 0, addr ) }
977
+ @nameserver_addrs.each{|addr| rsv.sendmsg(data, 0, addr)}
981
978
  rescue Exception => e
982
- puts "rsv send data #{ e.class }"
979
+ puts "rsv send data #{e.class}"
983
980
  rsv.close
984
981
  return
985
982
  end
@@ -990,199 +987,197 @@ module Girl
990
987
  type: type
991
988
  }
992
989
 
993
- @rsv_infos[ rsv ] = rsv_info
994
- add_read( rsv, :rsv )
990
+ @rsv_infos[rsv] = rsv_info
991
+ add_read(rsv, :rsv)
995
992
  end
996
993
 
997
- def new_a_rsvd( rsvd_port )
998
- rsvd_ip = '0.0.0.0'
999
- rsvd_addr = Socket.sockaddr_in( rsvd_port, rsvd_ip )
1000
- rsvd = Socket.new( Socket::AF_INET, Socket::SOCK_DGRAM, 0 )
1001
- rsvd.setsockopt( Socket::SOL_SOCKET, Socket::SO_REUSEPORT, 1 ) if RUBY_PLATFORM.include?( 'linux' )
1002
- rsvd.bind( rsvd_addr )
1003
- puts "rsvd bind on #{ rsvd_ip } #{ rsvd_port }"
1004
- add_read( rsvd, :rsvd )
994
+ def new_a_rsvd(rsvd_host, rsvd_port)
995
+ rsvd_addr = Socket.sockaddr_in(rsvd_port, rsvd_host)
996
+ rsvd = Socket.new(Socket::AF_INET, Socket::SOCK_DGRAM, 0)
997
+ rsvd.setsockopt(Socket::SOL_SOCKET, Socket::SO_REUSEPORT, 1) if RUBY_PLATFORM.include?('linux')
998
+ rsvd.bind(rsvd_addr)
999
+ puts "rsvd bind on #{rsvd_host} #{rsvd_port}"
1000
+ add_read(rsvd, :rsvd)
1005
1001
  @rsvd = rsvd
1006
1002
  end
1007
1003
 
1008
- def new_a_tspd( tspd_port )
1009
- tspd_ip = '0.0.0.0'
1010
- tspd = Socket.new( Socket::AF_INET, Socket::SOCK_STREAM, 0 )
1011
- tspd.setsockopt( Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1 )
1012
- tspd.setsockopt( Socket::SOL_SOCKET, Socket::SO_REUSEADDR, 1 )
1013
- tspd.setsockopt( Socket::SOL_SOCKET, Socket::SO_REUSEPORT, 1 ) if RUBY_PLATFORM.include?( 'linux' )
1014
- tspd.setsockopt( Socket::IPPROTO_TCP, Socket::TCP_FASTOPEN, BACKLOG ) if @is_server_fastopen
1015
- tspd.bind( Socket.sockaddr_in( tspd_port, tspd_ip ) )
1016
- tspd.listen( BACKLOG )
1017
- puts "tspd listen on #{ tspd_ip } #{ tspd_port }"
1018
- add_read( tspd, :tspd )
1004
+ def new_a_tspd(tspd_host, tspd_port)
1005
+ tspd = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
1006
+ tspd.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)
1007
+ tspd.setsockopt(Socket::SOL_SOCKET, Socket::SO_REUSEADDR, 1)
1008
+ tspd.setsockopt(Socket::SOL_SOCKET, Socket::SO_REUSEPORT, 1) if RUBY_PLATFORM.include?('linux')
1009
+ tspd.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_FASTOPEN, BACKLOG) if @is_server_fastopen
1010
+ tspd.bind(Socket.sockaddr_in(tspd_port, tspd_host))
1011
+ tspd.listen(BACKLOG)
1012
+ puts "tspd listen on #{tspd_host} #{tspd_port}"
1013
+ add_read(tspd, :tspd)
1019
1014
  @tspd_port = tspd_port
1020
1015
  end
1021
1016
 
1022
- def pack_a_chunk( msg )
1023
- "#{ [ msg.bytesize ].pack( 'n' ) }#{ msg }"
1017
+ def pack_a_chunk(msg)
1018
+ "#{[msg.bytesize].pack('n')}#{msg}"
1024
1019
  end
1025
1020
 
1026
- def pack_p2_traffic( p2_id, data )
1021
+ def pack_p2_traffic(p2_id, data)
1027
1022
  chunks = ''
1028
1023
 
1029
1024
  loop do
1030
- part = data[ 0, 65526 ]
1031
- # puts "add h_p2_traffic #{ p2_id } #{ part.bytesize }" if @is_debug
1032
- msg = "#{ @h_p2_traffic }#{ [ p2_id ].pack( 'Q>' ) }#{ part }"
1033
- chunks << pack_a_chunk( msg )
1034
- data = data[ part.bytesize..-1 ]
1025
+ part = data[0, 65526]
1026
+ # puts "add h_p2_traffic #{p2_id} #{part.bytesize}" if @is_debug
1027
+ msg = "#{@h_p2_traffic}#{[p2_id].pack('Q>')}#{part}"
1028
+ chunks << pack_a_chunk(msg)
1029
+ data = data[part.bytesize..-1]
1035
1030
  break if data.empty?
1036
1031
  end
1037
1032
 
1038
1033
  chunks
1039
1034
  end
1040
1035
 
1041
- def pack_traffic( src_id, data )
1036
+ def pack_traffic(src_id, data)
1042
1037
  chunks = ''
1043
1038
 
1044
1039
  loop do
1045
- part = data[ 0, 65526 ]
1046
- # puts "add h_traffic #{ src_id } #{ part.bytesize }" if @is_debug
1047
- msg = "#{ @h_traffic }#{ [ src_id ].pack( 'Q>' ) }#{ part }"
1048
- chunks << pack_a_chunk( msg )
1049
- data = data[ part.bytesize..-1 ]
1040
+ part = data[0, 65526]
1041
+ # puts "add h_traffic #{src_id} #{part.bytesize}" if @is_debug
1042
+ msg = "#{@h_traffic}#{[src_id].pack('Q>')}#{part}"
1043
+ chunks << pack_a_chunk(msg)
1044
+ data = data[part.bytesize..-1]
1050
1045
  break if data.empty?
1051
1046
  end
1052
1047
 
1053
1048
  chunks
1054
1049
  end
1055
1050
 
1056
- def read_dns( dns )
1051
+ def read_dns(dns)
1057
1052
  begin
1058
1053
  data, addrinfo, rflags, *controls = dns.recvmsg
1059
1054
  rescue Exception => e
1060
- puts "dns recvmsg #{ e.class }"
1061
- close_dns( dns )
1055
+ puts "dns recvmsg #{e.class}"
1056
+ close_dns(dns)
1062
1057
  return
1063
1058
  end
1064
1059
 
1065
1060
  return if data.empty?
1066
1061
 
1067
1062
  begin
1068
- ip = seek_ip( data )
1063
+ ip = seek_ip(data)
1069
1064
  rescue Exception => e
1070
- puts "dns seek ip #{ e.class } #{ e.message }"
1071
- close_dns( dns )
1065
+ puts "dns seek ip #{e.class} #{e.message}"
1066
+ close_dns(dns)
1072
1067
  return
1073
1068
  end
1074
1069
 
1075
- dns_info = @dns_infos[ dns ]
1076
- domain = dns_info[ :domain ]
1070
+ dns_info = @dns_infos[dns]
1071
+ domain = dns_info[:domain]
1077
1072
 
1078
- if ip then
1079
- src = dns_info[ :src ]
1080
- make_tunnel( ip, src )
1081
- puts "set resolv cache #{ domain } #{ ip }" if @is_debug
1082
- @resolv_caches[ domain ] = [ ip, Time.new ]
1073
+ if ip
1074
+ src = dns_info[:src]
1075
+ make_tunnel(ip, src)
1076
+ puts "set resolv cache #{domain} #{ip}" if @is_debug
1077
+ @resolv_caches[domain] = [ip, Time.new]
1083
1078
  else
1084
- puts "no ip in answer #{ domain }"
1085
- close_src( src )
1079
+ puts "no ip in answer #{domain}"
1080
+ close_src(src)
1086
1081
  end
1087
1082
 
1088
- close_dns( dns )
1083
+ close_dns(dns)
1089
1084
  end
1090
1085
 
1091
- def read_dst( dst )
1086
+ def read_dst(dst)
1092
1087
  begin
1093
- data = dst.read_nonblock( READ_SIZE )
1088
+ data = dst.read_nonblock(READ_SIZE)
1094
1089
  rescue Errno::ENOTCONN => e
1095
1090
  return
1096
1091
  rescue Exception => e
1097
- close_dst( dst )
1092
+ close_dst(dst)
1098
1093
  return
1099
1094
  end
1100
1095
 
1101
- set_update( dst )
1102
- dst_info = @dst_infos[ dst ]
1103
- # puts "read dst #{ dst_info[ :domain ] } #{ data.bytesize }" if @is_debug
1104
- src = dst_info[ :src ]
1105
- add_src_wbuff( src, data )
1096
+ set_update(dst)
1097
+ dst_info = @dst_infos[dst]
1098
+ # puts "read dst #{dst_info[:domain]} #{data.bytesize}" if @is_debug
1099
+ src = dst_info[:src]
1100
+ add_src_wbuff(src, data)
1106
1101
  end
1107
1102
 
1108
- def read_girl( girl )
1103
+ def read_girl(girl)
1109
1104
  begin
1110
- data = girl.read_nonblock( READ_SIZE )
1105
+ data = girl.read_nonblock(READ_SIZE)
1111
1106
  rescue Errno::ENOTCONN => e
1112
1107
  return
1113
1108
  rescue Exception => e
1114
- close_girl( girl )
1109
+ close_girl(girl)
1115
1110
  return
1116
1111
  end
1117
1112
 
1118
- set_update( girl )
1119
- girl_info = @girl_infos[ girl ]
1120
- relay = girl_info[ :relay ]
1121
- add_relay_wbuff( relay, data )
1113
+ set_update(girl)
1114
+ girl_info = @girl_infos[girl]
1115
+ relay = girl_info[:relay]
1116
+ add_relay_wbuff(relay, data)
1122
1117
  end
1123
1118
 
1124
- def read_infod( infod )
1119
+ def read_infod(infod)
1125
1120
  begin
1126
1121
  data, addrinfo, rflags, *controls = infod.recvmsg
1127
1122
  rescue Exception => e
1128
- puts "infod recvmsg #{ e.class }"
1123
+ puts "infod recvmsg #{e.class}"
1129
1124
  return
1130
1125
  end
1131
1126
 
1132
1127
  return if data.empty?
1133
1128
 
1134
1129
  begin
1135
- msg = JSON.parse( data, symbolize_names: true )
1130
+ msg = JSON.parse(data, symbolize_names: true)
1136
1131
  rescue JSON::ParserError, EncodingError => e
1137
- puts "read infod #{ e.class }"
1132
+ puts "read infod #{e.class}"
1138
1133
  return
1139
1134
  end
1140
1135
 
1141
- message_type = msg[ :message_type ]
1136
+ message_type = msg[:message_type]
1142
1137
 
1143
1138
  case message_type
1144
- when 'heartbeat' then
1145
- if @proxy.closed? then
1139
+ when 'heartbeat'
1140
+ if @proxy.closed?
1146
1141
  new_a_proxy
1147
1142
  else
1148
- proxy_info = @proxy_infos[ @proxy ]
1143
+ proxy_info = @proxy_infos[@proxy]
1149
1144
 
1150
- if Time.new.to_i - proxy_info[ :recv_at ].to_i >= @expire_proxy_after then
1151
- close_proxy( @proxy )
1145
+ if Time.new.to_i - proxy_info[:recv_at].to_i >= @expire_proxy_after
1146
+ close_proxy(@proxy)
1152
1147
  new_a_proxy
1153
1148
  else
1154
1149
  puts "heartbeat" if @is_debug
1155
- add_proxy_wbuff( pack_a_chunk( @h_heartbeat ) )
1150
+ add_proxy_wbuff(pack_a_chunk(@h_heartbeat))
1156
1151
  end
1157
1152
  end
1158
1153
  end
1159
1154
  end
1160
1155
 
1161
- def read_mem( mem )
1156
+ def read_mem(mem)
1162
1157
  begin
1163
- mem.read_nonblock( READ_SIZE )
1158
+ mem.read_nonblock(READ_SIZE)
1164
1159
  rescue Errno::ENOTCONN => e
1165
1160
  return
1166
1161
  rescue Exception => e
1167
- close_mem( mem )
1162
+ close_mem(mem)
1168
1163
  return
1169
1164
  end
1170
1165
 
1171
- set_update( mem )
1166
+ set_update(mem)
1172
1167
  src_arr = []
1173
1168
 
1174
- @src_infos.each do | _, info |
1169
+ @src_infos.each do |_, info|
1175
1170
  src_arr << {
1176
- addrinfo: info[ :addrinfo ].ip_unpack,
1177
- destination_domain: info[ :destination_domain ],
1178
- destination_port: info[ :destination_port ]
1171
+ addrinfo: info[:addrinfo].ip_unpack,
1172
+ destination_domain: info[:destination_domain],
1173
+ destination_port: info[:destination_port]
1179
1174
  }
1180
1175
  end
1181
1176
 
1182
1177
  msg = {
1183
1178
  resolv_caches: @resolv_caches.sort,
1184
- response_caches: @response_caches.sort.map{ | a | [ a[ 0 ], a[ 1 ][ 2 ], a[ 1 ][ 3 ] ] },
1185
- response6_caches: @response6_caches.sort.map{ | a | [ a[ 0 ], a[ 1 ][ 2 ], a[ 1 ][ 3 ] ] },
1179
+ response_caches: @response_caches.sort.map{|a| [a[0], a[1][2], a[1][3]]},
1180
+ response6_caches: @response6_caches.sort.map{|a| [a[0], a[1][2], a[1][3]]},
1186
1181
  sizes: {
1187
1182
  directs: @directs.size,
1188
1183
  remotes: @remotes.size,
@@ -1210,16 +1205,16 @@ module Girl
1210
1205
  src_arr: src_arr
1211
1206
  }
1212
1207
 
1213
- add_mem_wbuff( mem, JSON.generate( msg ) )
1208
+ add_mem_wbuff(mem, JSON.generate(msg))
1214
1209
  end
1215
1210
 
1216
- def read_memd( memd )
1211
+ def read_memd(memd)
1217
1212
  check_expire_mems
1218
1213
 
1219
1214
  begin
1220
1215
  mem, addrinfo = memd.accept_nonblock
1221
1216
  rescue Exception => e
1222
- puts "memd accept #{ e.class }"
1217
+ puts "memd accept #{e.class}"
1223
1218
  return
1224
1219
  end
1225
1220
 
@@ -1227,75 +1222,75 @@ module Girl
1227
1222
  wbuff: ''
1228
1223
  }
1229
1224
 
1230
- @mem_infos[ mem ] = mem_info
1231
- add_read( mem, :mem )
1225
+ @mem_infos[mem] = mem_info
1226
+ add_read(mem, :mem)
1232
1227
  end
1233
1228
 
1234
- def read_p1( p1 )
1229
+ def read_p1(p1)
1235
1230
  begin
1236
- data = p1.read_nonblock( READ_SIZE )
1231
+ data = p1.read_nonblock(READ_SIZE)
1237
1232
  rescue Errno::ENOTCONN => e
1238
1233
  return
1239
1234
  rescue Exception => e
1240
- close_p1( p1 )
1235
+ close_p1(p1)
1241
1236
  return
1242
1237
  end
1243
1238
 
1244
- set_update( p1 )
1239
+ set_update(p1)
1245
1240
 
1246
- if @proxy.closed? then
1247
- close_p1( p1 )
1241
+ if @proxy.closed?
1242
+ close_p1(p1)
1248
1243
  return
1249
1244
  end
1250
1245
 
1251
- p1_info = @p1_infos[ p1 ]
1252
- p2_id = p1_info[ :p2_id ]
1253
- # puts "read p1 #{ p2_id } #{ data.bytesize }" if @is_debug
1254
- add_proxy_wbuff( pack_p2_traffic( p2_id, data ) )
1246
+ p1_info = @p1_infos[p1]
1247
+ p2_id = p1_info[:p2_id]
1248
+ # puts "read p1 #{p2_id} #{data.bytesize}" if @is_debug
1249
+ add_proxy_wbuff(pack_p2_traffic(p2_id, data))
1255
1250
 
1256
- unless @proxy.closed? then
1257
- proxy_info = @proxy_infos[ @proxy ]
1258
- bytesize = proxy_info[ :wbuff ].bytesize
1251
+ unless @proxy.closed?
1252
+ proxy_info = @proxy_infos[@proxy]
1253
+ bytesize = proxy_info[:wbuff].bytesize
1259
1254
 
1260
- if ( bytesize >= WBUFF_LIMIT ) && !proxy_info[ :paused_p1s ].include?( p1 ) then
1261
- puts "proxy overflow pause p1 #{ p2_id }"
1262
- @reads.delete( p1 )
1263
- proxy_info[ :paused_p1s ] << p1
1255
+ if (bytesize >= WBUFF_LIMIT) && !proxy_info[:paused_p1s].include?(p1)
1256
+ puts "proxy overflow pause p1 #{p2_id}"
1257
+ @reads.delete(p1)
1258
+ proxy_info[:paused_p1s] << p1
1264
1259
  end
1265
1260
  end
1266
1261
  end
1267
1262
 
1268
- def read_proxy( proxy )
1263
+ def read_proxy(proxy)
1269
1264
  begin
1270
- data = proxy.read_nonblock( READ_SIZE )
1265
+ data = proxy.read_nonblock(READ_SIZE)
1271
1266
  rescue Errno::ENOTCONN => e
1272
1267
  return
1273
1268
  rescue Exception => e
1274
- close_proxy( proxy )
1269
+ close_proxy(proxy)
1275
1270
  return
1276
1271
  end
1277
1272
 
1278
- set_update( proxy )
1279
- proxy_info = @proxy_infos[ proxy ]
1280
- data = "#{ proxy_info[ :rbuff ] }#{ data }"
1273
+ set_update(proxy)
1274
+ proxy_info = @proxy_infos[proxy]
1275
+ data = "#{proxy_info[:rbuff]}#{data}"
1281
1276
 
1282
- msgs, part = decode_to_msgs( data )
1283
- msgs.each{ | msg | deal_msg( msg ) }
1284
- proxy_info[ :rbuff ] = part
1277
+ msgs, part = decode_to_msgs(data)
1278
+ msgs.each{|msg| deal_msg(msg)}
1279
+ proxy_info[:rbuff] = part
1285
1280
  end
1286
1281
 
1287
- def read_redir( redir )
1282
+ def read_redir(redir)
1288
1283
  check_expire_srcs
1289
1284
 
1290
1285
  begin
1291
1286
  src, addrinfo = redir.accept_nonblock
1292
1287
  rescue IO::WaitReadable, Errno::EINTR => e
1293
- puts "redir accept #{ e.class }"
1288
+ puts "redir accept #{e.class}"
1294
1289
  return
1295
1290
  end
1296
1291
 
1297
- puts "redir accept a src #{ addrinfo.ip_unpack.inspect }" if @is_debug
1298
- src_id = rand( ( 2 ** 64 ) - 2 ) + 1
1292
+ puts "redir accept a src #{addrinfo.ip_unpack.inspect}" if @is_debug
1293
+ src_id = rand((2 ** 64) - 2) + 1
1299
1294
 
1300
1295
  src_info = {
1301
1296
  addrinfo: addrinfo,
@@ -1312,37 +1307,37 @@ module Girl
1312
1307
  wbuff: ''
1313
1308
  }
1314
1309
 
1315
- @src_infos[ src ] = src_info
1316
- add_read( src, :src )
1310
+ @src_infos[src] = src_info
1311
+ add_read(src, :src)
1317
1312
  end
1318
1313
 
1319
- def read_relay( relay )
1314
+ def read_relay(relay)
1320
1315
  begin
1321
- data = relay.read_nonblock( READ_SIZE )
1316
+ data = relay.read_nonblock(READ_SIZE)
1322
1317
  rescue Errno::ENOTCONN => e
1323
1318
  return
1324
1319
  rescue Exception => e
1325
- close_relay( relay )
1320
+ close_relay(relay)
1326
1321
  return
1327
1322
  end
1328
1323
 
1329
- set_update( relay )
1330
- relay_info = @relay_infos[ relay ]
1331
- girl = relay_info[ :girl ]
1332
- add_girl_wbuff( girl, data )
1324
+ set_update(relay)
1325
+ relay_info = @relay_infos[relay]
1326
+ girl = relay_info[:girl]
1327
+ add_girl_wbuff(girl, data)
1333
1328
  end
1334
1329
 
1335
- def read_relayd( relayd )
1330
+ def read_relayd(relayd)
1336
1331
  check_expire_relays
1337
1332
 
1338
1333
  begin
1339
1334
  relay, addrinfo = relayd.accept_nonblock
1340
1335
  rescue IO::WaitReadable, Errno::EINTR => e
1341
- puts "relayd accept #{ e.class }"
1336
+ puts "relayd accept #{e.class}"
1342
1337
  return
1343
1338
  end
1344
1339
 
1345
- puts "relayd accept a relay #{ addrinfo.ip_unpack.inspect }"
1340
+ puts "relayd accept a relay #{addrinfo.ip_unpack.inspect}"
1346
1341
 
1347
1342
  relay_info = {
1348
1343
  addrinfo: addrinfo,
@@ -1352,98 +1347,98 @@ module Girl
1352
1347
  wbuff: ''
1353
1348
  }
1354
1349
 
1355
- @relay_infos[ relay ] = relay_info
1356
- add_read( relay, :relay )
1357
- relay_info[ :girl ] = new_a_girl( relay )
1350
+ @relay_infos[relay] = relay_info
1351
+ add_read(relay, :relay)
1352
+ relay_info[:girl] = new_a_girl(relay)
1358
1353
  end
1359
1354
 
1360
- def read_rsv( rsv )
1355
+ def read_rsv(rsv)
1361
1356
  begin
1362
1357
  data, addrinfo, rflags, *controls = rsv.recvmsg
1363
1358
  rescue Exception => e
1364
- puts "rsv recvmsg #{ e.class }"
1365
- close_rsv( rsv )
1359
+ puts "rsv recvmsg #{e.class}"
1360
+ close_rsv(rsv)
1366
1361
  return
1367
1362
  end
1368
1363
 
1369
1364
  return if data.empty?
1370
1365
 
1371
- rsv_info = @rsv_infos[ rsv ]
1372
- addrinfo = rsv_info[ :addrinfo ]
1373
- domain = rsv_info[ :domain ]
1374
- type = rsv_info[ :type ]
1375
- send_data( @rsvd, data, addrinfo )
1366
+ rsv_info = @rsv_infos[rsv]
1367
+ addrinfo = rsv_info[:addrinfo]
1368
+ domain = rsv_info[:domain]
1369
+ type = rsv_info[:type]
1370
+ send_data(@rsvd, data, addrinfo)
1376
1371
 
1377
1372
  begin
1378
- ip = seek_ip( data )
1373
+ ip = seek_ip(data)
1379
1374
  rescue Exception => e
1380
- puts "rsv seek ip #{ e.class } #{ e.message }"
1381
- close_rsv( rsv )
1375
+ puts "rsv seek ip #{e.class} #{e.message}"
1376
+ close_rsv(rsv)
1382
1377
  return
1383
1378
  end
1384
1379
 
1385
- if ip then
1386
- if type == 1 then
1387
- puts "set response cache #{ domain } #{ ip }" if @is_debug
1388
- @response_caches[ domain ] = [ data, Time.new, ip, false ]
1380
+ if ip
1381
+ if type == 1
1382
+ puts "set response cache #{domain} #{ip}" if @is_debug
1383
+ @response_caches[domain] = [data, Time.new, ip, false]
1389
1384
  else
1390
- puts "set response6 cache #{ domain } #{ ip }" if @is_debug
1391
- @response6_caches[ domain ] = [ data, Time.new, ip, false ]
1385
+ puts "set response6 cache #{domain} #{ip}" if @is_debug
1386
+ @response6_caches[domain] = [data, Time.new, ip, false]
1392
1387
  end
1393
1388
  end
1394
1389
 
1395
- close_rsv( rsv )
1390
+ close_rsv(rsv)
1396
1391
  end
1397
1392
 
1398
- def read_rsvd( rsvd )
1393
+ def read_rsvd(rsvd)
1399
1394
  begin
1400
1395
  data, addrinfo, rflags, *controls = rsvd.recvmsg
1401
1396
  rescue Exception => e
1402
- puts "rsvd recvmsg #{ e.class }"
1397
+ puts "rsvd recvmsg #{e.class}"
1403
1398
  return
1404
1399
  end
1405
1400
 
1406
1401
  return if data.empty?
1407
1402
 
1408
1403
  begin
1409
- id, domain, type = seek_question_dn( data )
1404
+ id, domain, type = seek_question_dn(data)
1410
1405
  rescue Exception => e
1411
- puts "seek question dn #{ e.class } #{ e.message }"
1406
+ puts "seek question dn #{e.class} #{e.message}"
1412
1407
  return
1413
1408
  end
1414
1409
 
1415
- return unless [ 1, 12, 28 ].include?( type )
1410
+ return unless [1, 12, 28].include?(type)
1416
1411
 
1417
- if type == 12 then
1418
- new_a_rsv( data, addrinfo, domain, type )
1412
+ if type == 12
1413
+ new_a_rsv(data, addrinfo, domain, type)
1419
1414
  return
1420
1415
  end
1421
1416
 
1422
- if type == 1 then
1423
- response_cache = @response_caches[ domain ]
1417
+ if type == 1
1418
+ response_cache = @response_caches[domain]
1424
1419
  else
1425
- response_cache = @response6_caches[ domain ]
1420
+ response_cache = @response6_caches[domain]
1426
1421
  end
1427
1422
 
1428
- if response_cache then
1423
+ if response_cache
1429
1424
  response, created_at = response_cache
1430
1425
 
1431
- if Time.new - created_at < @expire_resolv_cache then
1432
- response[ 0, 2 ] = id
1433
- send_data( @rsvd, response, addrinfo )
1426
+ if Time.new - created_at < @expire_resolv_cache
1427
+ response[0, 2] = id
1428
+ send_data(@rsvd, response, addrinfo)
1434
1429
  return
1435
1430
  end
1436
1431
 
1437
- if type == 1 then
1438
- @response_caches.delete( domain )
1432
+ if type == 1
1433
+ @response_caches.delete(domain)
1439
1434
  else
1440
- @response6_caches.delete( domain )
1435
+ @response6_caches.delete(domain)
1441
1436
  end
1442
1437
  end
1443
1438
 
1444
- if @remotes.any?{ | r | domain.include?( r ) } then
1439
+ if @remotes.any?{|r| domain.include?(r)}
1445
1440
  check_expire_nears
1446
- near_id = rand( ( 2 ** 64 ) - 2 ) + 1
1441
+ near_id = rand((2 ** 64) - 2) + 1
1447
1442
 
1448
1443
  near_info = {
1449
1444
  addrinfo: addrinfo,
@@ -1453,41 +1448,41 @@ module Girl
1453
1448
  type: type
1454
1449
  }
1455
1450
 
1456
- @near_infos[ near_id ] = near_info
1457
- puts "add h_query #{ near_id } #{ type } #{ domain }" if @is_debug
1458
- msg = "#{ @h_query }#{ [ near_id, type ].pack( 'Q>C' ) }#{ domain }"
1459
- add_proxy_wbuff( pack_a_chunk( msg ) )
1451
+ @near_infos[near_id] = near_info
1452
+ puts "add h_query #{near_id} #{type} #{domain}" if @is_debug
1453
+ msg = "#{@h_query}#{[near_id, type].pack('Q>C')}#{domain}"
1454
+ add_proxy_wbuff(pack_a_chunk(msg))
1460
1455
  return
1461
1456
  end
1462
1457
 
1463
- new_a_rsv( data, addrinfo, domain, type )
1458
+ new_a_rsv(data, addrinfo, domain, type)
1464
1459
  end
1465
1460
 
1466
- def read_src( src )
1461
+ def read_src(src)
1467
1462
  begin
1468
- data = src.read_nonblock( READ_SIZE )
1463
+ data = src.read_nonblock(READ_SIZE)
1469
1464
  rescue Errno::ENOTCONN => e
1470
1465
  return
1471
1466
  rescue Exception => e
1472
- close_src( src )
1467
+ close_src(src)
1473
1468
  return
1474
1469
  end
1475
1470
 
1476
- set_update( src )
1477
- src_info = @src_infos[ src ]
1478
- proxy_type = src_info[ :proxy_type ]
1471
+ set_update(src)
1472
+ src_info = @src_infos[src]
1473
+ proxy_type = src_info[:proxy_type]
1479
1474
 
1480
1475
  case proxy_type
1481
- when :uncheck then
1482
- if data[ 0, 7 ] == 'CONNECT' then
1483
- domain_port = data.split( "\r\n" )[ 0 ].split( ' ' )[ 1 ]
1476
+ when :uncheck
1477
+ if data[0, 7] == 'CONNECT'
1478
+ domain_port = data.split("\r\n")[0].split(' ')[1]
1484
1479
 
1485
- unless domain_port then
1480
+ unless domain_port
1486
1481
  puts "CONNECT miss domain"
1487
- close_src( src )
1482
+ close_src(src)
1488
1483
  return
1489
1484
  end
1490
- elsif data[ 0 ].unpack( 'C' ).first == 5 then
1485
+ elsif data[0].unpack('C').first == 5
1491
1486
  # https://tools.ietf.org/html/rfc1928
1492
1487
  #
1493
1488
  # +----+----------+----------+
@@ -1495,12 +1490,12 @@ module Girl
1495
1490
  # +----+----------+----------+
1496
1491
  # | 1 | 1 | 1 to 255 |
1497
1492
  # +----+----------+----------+
1498
- nmethods = data[ 1 ].unpack( 'C' ).first
1499
- methods = data[ 2, nmethods ].unpack( 'C*' )
1493
+ nmethods = data[1].unpack('C').first
1494
+ methods = data[2, nmethods].unpack('C*')
1500
1495
 
1501
- unless methods.include?( 0 ) then
1496
+ unless methods.include?(0)
1502
1497
  puts "miss method 00"
1503
- close_src( src )
1498
+ close_src(src)
1504
1499
  return
1505
1500
  end
1506
1501
 
@@ -1509,159 +1504,159 @@ module Girl
1509
1504
  # +----+--------+
1510
1505
  # | 1 | 1 |
1511
1506
  # +----+--------+
1512
- puts "read src version 5 nmethods #{ nmethods } methods #{ methods.inspect }" if @is_debug
1513
- data2 = [ 5, 0 ].pack( 'CC' )
1514
- add_src_wbuff( src, data2 )
1507
+ puts "read src version 5 nmethods #{nmethods} methods #{methods.inspect}" if @is_debug
1508
+ data2 = [5, 0].pack('CC')
1509
+ add_src_wbuff(src, data2)
1515
1510
  return if src.closed?
1516
- src_info[ :proxy_proto ] = :socks5
1517
- src_info[ :proxy_type ] = :negotiation
1511
+ src_info[:proxy_proto] = :socks5
1512
+ src_info[:proxy_type] = :negotiation
1518
1513
  return
1519
1514
  else
1520
- host_line = data.split( "\r\n" ).find{ | _line | _line[ 0, 6 ] == 'Host: ' }
1515
+ host_line = data.split("\r\n").find{|_line| _line[0, 6] == 'Host: '}
1521
1516
 
1522
- unless host_line then
1523
- close_src( src )
1517
+ unless host_line
1518
+ close_src(src)
1524
1519
  return
1525
1520
  end
1526
1521
 
1527
- lines = data.split( "\r\n" )
1522
+ lines = data.split("\r\n")
1528
1523
 
1529
- unless lines.empty? then
1530
- method, url, proto = lines.first.split( ' ' )
1524
+ unless lines.empty?
1525
+ method, url, proto = lines.first.split(' ')
1531
1526
 
1532
- if proto && url && proto[ 0, 4 ] == 'HTTP' && url[ 0, 7 ] == 'http://' then
1533
- domain_port = url.split( '/' )[ 2 ]
1527
+ if proto && url && proto[0, 4] == 'HTTP' && url[0, 7] == 'http://'
1528
+ domain_port = url.split('/')[2]
1534
1529
  end
1535
1530
  end
1536
1531
 
1537
- unless domain_port then
1538
- domain_port = host_line.split( ' ' )[ 1 ]
1532
+ unless domain_port
1533
+ domain_port = host_line.split(' ')[1]
1539
1534
 
1540
- unless domain_port then
1535
+ unless domain_port
1541
1536
  puts "Host line miss domain"
1542
- close_src( src )
1537
+ close_src(src)
1543
1538
  return
1544
1539
  end
1545
1540
  end
1546
1541
 
1547
- src_info[ :is_connect ] = false
1548
- add_src_rbuff( src, data )
1542
+ src_info[:is_connect] = false
1543
+ add_src_rbuff(src, data)
1549
1544
  end
1550
1545
 
1551
- colon_idx = domain_port.rindex( ':' )
1552
- close_idx = domain_port.rindex( ']' )
1546
+ colon_idx = domain_port.rindex(':')
1547
+ close_idx = domain_port.rindex(']')
1553
1548
 
1554
- if colon_idx && ( close_idx.nil? || ( colon_idx > close_idx ) ) then
1555
- domain = domain_port[ 0...colon_idx ]
1556
- port = domain_port[ ( colon_idx + 1 )..-1 ].to_i
1549
+ if colon_idx && (close_idx.nil? || (colon_idx > close_idx))
1550
+ domain = domain_port[0...colon_idx]
1551
+ port = domain_port[(colon_idx + 1)..-1].to_i
1557
1552
  else
1558
1553
  domain = domain_port
1559
1554
  port = 80
1560
1555
  end
1561
1556
 
1562
- domain = domain.gsub( /\[|\]/, '' )
1563
- src_info[ :proxy_proto ] = :http
1564
- src_info[ :destination_domain ] = domain
1565
- src_info[ :destination_port ] = port
1566
- resolve_domain( domain, src )
1567
- when :checking then
1568
- add_src_rbuff( src, data )
1569
- when :negotiation then
1557
+ domain = domain.gsub(/\[|\]/, '')
1558
+ src_info[:proxy_proto] = :http
1559
+ src_info[:destination_domain] = domain
1560
+ src_info[:destination_port] = port
1561
+ resolve_domain(domain, src)
1562
+ when :checking
1563
+ add_src_rbuff(src, data)
1564
+ when :negotiation
1570
1565
  # +----+-----+-------+------+----------+----------+
1571
1566
  # |VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT |
1572
1567
  # +----+-----+-------+------+----------+----------+
1573
1568
  # | 1 | 1 | X'00' | 1 | Variable | 2 |
1574
1569
  # +----+-----+-------+------+----------+----------+
1575
- ver, cmd, rsv, atyp = data[ 0, 4 ].unpack( 'C4' )
1570
+ ver, cmd, rsv, atyp = data[0, 4].unpack('C4')
1576
1571
 
1577
- if cmd == 1 then
1578
- if atyp == 1 then
1579
- destination_host, destination_port = data[ 4, 6 ].unpack( 'Nn' )
1572
+ if cmd == 1
1573
+ if atyp == 1
1574
+ destination_host, destination_port = data[4, 6].unpack('Nn')
1580
1575
 
1581
1576
  begin
1582
- destination_addr = Socket.sockaddr_in( destination_port, destination_host )
1583
- destination_addrinfo = Addrinfo.new( destination_addr )
1577
+ destination_addr = Socket.sockaddr_in(destination_port, destination_host)
1578
+ destination_addrinfo = Addrinfo.new(destination_addr)
1584
1579
  rescue Exception => e
1585
- puts "new addrinfo #{ e.class }"
1586
- close_src( src )
1580
+ puts "new addrinfo #{e.class}"
1581
+ close_src(src)
1587
1582
  return
1588
1583
  end
1589
1584
 
1590
1585
  destination_ip = destination_addrinfo.ip_address
1591
- puts "read src cmd #{ cmd } atyp #{ atyp } #{ destination_ip } #{ destination_port }" if @is_debug
1592
- src_info[ :destination_domain ] = destination_ip
1593
- src_info[ :destination_port ] = destination_port
1594
- make_tunnel( destination_ip, src )
1595
- elsif atyp == 3 then
1596
- domain_len = data[ 4 ].unpack( 'C' ).first
1597
-
1598
- if ( domain_len + 7 ) == data.bytesize then
1599
- domain = data[ 5, domain_len ]
1600
- port = data[ ( 5 + domain_len ), 2 ].unpack( 'n' ).first
1601
- puts "read src cmd #{ cmd } atyp #{ atyp } #{ domain } #{ port }" if @is_debug
1602
- src_info[ :destination_domain ] = domain
1603
- src_info[ :destination_port ] = port
1604
- resolve_domain( domain, src )
1586
+ puts "read src cmd #{cmd} atyp #{atyp} #{destination_ip} #{destination_port}" if @is_debug
1587
+ src_info[:destination_domain] = destination_ip
1588
+ src_info[:destination_port] = destination_port
1589
+ make_tunnel(destination_ip, src)
1590
+ elsif atyp == 3
1591
+ domain_len = data[4].unpack('C').first
1592
+
1593
+ if (domain_len + 7) == data.bytesize
1594
+ domain = data[5, domain_len]
1595
+ port = data[(5 + domain_len), 2].unpack('n').first
1596
+ puts "read src cmd #{cmd} atyp #{atyp} #{domain} #{port}" if @is_debug
1597
+ src_info[:destination_domain] = domain
1598
+ src_info[:destination_port] = port
1599
+ resolve_domain(domain, src)
1605
1600
  end
1606
1601
  else
1607
- puts "socks5 atyp #{ atyp } not implement"
1608
- close_src( src )
1602
+ puts "socks5 atyp #{atyp} not implement"
1603
+ close_src(src)
1609
1604
  end
1610
1605
  else
1611
- puts "socks5 cmd #{ cmd } not implement"
1612
- close_src( src )
1606
+ puts "socks5 cmd #{cmd} not implement"
1607
+ close_src(src)
1613
1608
  end
1614
- when :remote then
1615
- src_id = src_info[ :src_id ]
1616
- add_proxy_wbuff( pack_traffic( src_id, data ) )
1617
-
1618
- unless @proxy.closed? then
1619
- proxy_info = @proxy_infos[ @proxy ]
1620
- bytesize = proxy_info[ :wbuff ].bytesize
1621
-
1622
- if ( bytesize >= WBUFF_LIMIT ) && !proxy_info[ :paused_srcs ].include?( src ) then
1623
- puts "proxy overflow pause src #{ src_id } #{ src_info[ :destination_domain ] }"
1624
- @reads.delete( src )
1625
- proxy_info[ :paused_srcs ] << src
1609
+ when :remote
1610
+ src_id = src_info[:src_id]
1611
+ add_proxy_wbuff(pack_traffic(src_id, data))
1612
+
1613
+ unless @proxy.closed?
1614
+ proxy_info = @proxy_infos[@proxy]
1615
+ bytesize = proxy_info[:wbuff].bytesize
1616
+
1617
+ if (bytesize >= WBUFF_LIMIT) && !proxy_info[:paused_srcs].include?(src)
1618
+ puts "proxy overflow pause src #{src_id} #{src_info[:destination_domain]}"
1619
+ @reads.delete(src)
1620
+ proxy_info[:paused_srcs] << src
1626
1621
  end
1627
1622
  end
1628
- when :direct then
1629
- dst = src_info[ :dst ]
1623
+ when :direct
1624
+ dst = src_info[:dst]
1630
1625
 
1631
- if dst then
1632
- add_dst_wbuff( dst, data )
1626
+ if dst
1627
+ add_dst_wbuff(dst, data)
1633
1628
  else
1634
- add_src_rbuff( src, data )
1629
+ add_src_rbuff(src, data)
1635
1630
  end
1636
1631
  end
1637
1632
  end
1638
1633
 
1639
- def read_tspd( tspd )
1634
+ def read_tspd(tspd)
1640
1635
  check_expire_srcs
1641
1636
 
1642
1637
  begin
1643
1638
  src, addrinfo = tspd.accept_nonblock
1644
1639
  rescue IO::WaitReadable, Errno::EINTR => e
1645
- puts "tspd accept #{ e.class }"
1640
+ puts "tspd accept #{e.class}"
1646
1641
  return
1647
1642
  end
1648
1643
 
1649
- puts "tspd accept a src #{ addrinfo.ip_unpack.inspect }" if @is_debug
1644
+ puts "tspd accept a src #{addrinfo.ip_unpack.inspect}" if @is_debug
1650
1645
 
1651
1646
  begin
1652
1647
  # /usr/include/linux/netfilter_ipv4.h
1653
- option = src.getsockopt( Socket::SOL_IP, 80 )
1648
+ option = src.getsockopt(Socket::SOL_IP, 80)
1654
1649
  rescue Exception => e
1655
- puts "get SO_ORIGINAL_DST #{ e.class } #{ addrinfo.ip_unpack.inspect }"
1650
+ puts "get SO_ORIGINAL_DST #{e.class} #{addrinfo.ip_unpack.inspect}"
1656
1651
  src.close
1657
1652
  return
1658
1653
  end
1659
1654
 
1660
- dest_family, dest_port, dest_host = option.unpack( 'nnN' )
1661
- dest_addr = Socket.sockaddr_in( dest_port, dest_host )
1662
- dest_addrinfo = Addrinfo.new( dest_addr )
1655
+ dest_family, dest_port, dest_host = option.unpack('nnN')
1656
+ dest_addr = Socket.sockaddr_in(dest_port, dest_host)
1657
+ dest_addrinfo = Addrinfo.new(dest_addr)
1663
1658
  dest_ip = dest_addrinfo.ip_address
1664
- src_id = rand( ( 2 ** 64 ) - 2 ) + 1
1659
+ src_id = rand((2 ** 64) - 2) + 1
1665
1660
 
1666
1661
  src_info = {
1667
1662
  addrinfo: addrinfo,
@@ -1678,66 +1673,64 @@ module Girl
1678
1673
  wbuff: ''
1679
1674
  }
1680
1675
 
1681
- @src_infos[ src ] = src_info
1682
- add_read( src, :src )
1683
- make_tunnel( dest_ip, src )
1676
+ @src_infos[src] = src_info
1677
+ add_read(src, :src)
1678
+ make_tunnel(dest_ip, src)
1684
1679
  end
1685
1680
 
1686
- def resolve_domain( domain, src )
1681
+ def resolve_domain(domain, src)
1687
1682
  return if src.nil? || src.closed?
1688
1683
 
1689
- unless domain =~ /^[0-9a-zA-Z\-\.]{1,63}$/ then
1684
+ unless domain =~ /^(?=^.{3,255}$)[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+$/
1690
1685
  # 忽略非法域名
1691
- puts "ignore #{ domain }"
1692
- close_src( src )
1686
+ puts "ignore #{domain}"
1687
+ close_src(src)
1693
1688
  return
1694
1689
  end
1695
1690
 
1696
- if domain == 'localhost' then
1697
- domain = "127.0.0.1"
1698
- end
1691
+ domain = "127.0.0.1" if domain == 'localhost'
1699
1692
 
1700
- if domain =~ /^\d{1,3}\.\d{1,3}\.\d{1,3}.\d{1,3}$/ then
1693
+ if domain =~ /^\d{1,3}\.\d{1,3}\.\d{1,3}.\d{1,3}$/
1701
1694
  # ipv4
1702
- make_tunnel( domain, src )
1695
+ make_tunnel(domain, src)
1703
1696
  return
1704
1697
  end
1705
1698
 
1706
- if @remotes.any?{ | remote | ( domain.size >= remote.size ) && ( domain[ ( remote.size * -1 )..-1 ] == remote ) } then
1707
- set_remote( src )
1699
+ if @remotes.any?{|remote| (domain.size >= remote.size) && (domain[(remote.size * -1)..-1] == remote)}
1700
+ set_remote(src)
1708
1701
  return
1709
1702
  end
1710
1703
 
1711
- resolv_cache = @resolv_caches[ domain ]
1704
+ resolv_cache = @resolv_caches[domain]
1712
1705
 
1713
- if resolv_cache then
1706
+ if resolv_cache
1714
1707
  ip, created_at = resolv_cache
1715
1708
 
1716
- if Time.new - created_at < @expire_resolv_cache then
1717
- make_tunnel( ip, src )
1709
+ if Time.new - created_at < @expire_resolv_cache
1710
+ make_tunnel(ip, src)
1718
1711
  return
1719
1712
  end
1720
1713
 
1721
- @resolv_caches.delete( domain )
1714
+ @resolv_caches.delete(domain)
1722
1715
  end
1723
1716
 
1724
1717
  begin
1725
- data = pack_a_query( domain )
1718
+ data = pack_a_query(domain)
1726
1719
  rescue Exception => e
1727
- puts "pack a query #{ e.class } #{ e.message } #{ domain }"
1728
- close_src( src )
1720
+ puts "pack a query #{e.class} #{e.message} #{domain}"
1721
+ close_src(src)
1729
1722
  return
1730
1723
  end
1731
1724
 
1732
1725
  check_expire_dnses
1733
- dns = Socket.new( Socket::AF_INET, Socket::SOCK_DGRAM, 0 )
1726
+ dns = Socket.new(Socket::AF_INET, Socket::SOCK_DGRAM, 0)
1734
1727
 
1735
1728
  begin
1736
- @nameserver_addrs.each{ | addr | dns.sendmsg( data, 0, addr ) }
1729
+ @nameserver_addrs.each{|addr| dns.sendmsg(data, 0, addr)}
1737
1730
  rescue Exception => e
1738
- puts "dns send data #{ e.class }"
1731
+ puts "dns send data #{e.class}"
1739
1732
  dns.close
1740
- close_src( src )
1733
+ close_src(src)
1741
1734
  return
1742
1735
  end
1743
1736
 
@@ -1746,126 +1739,123 @@ module Girl
1746
1739
  src: src
1747
1740
  }
1748
1741
 
1749
- @dns_infos[ dns ] = dns_info
1750
- add_read( dns, :dns )
1751
- src_info = @src_infos[ src ]
1752
- src_info[ :proxy_type ] = :checking
1742
+ @dns_infos[dns] = dns_info
1743
+ add_read(dns, :dns)
1744
+ src_info = @src_infos[src]
1745
+ src_info[:proxy_type] = :checking
1753
1746
  end
1754
1747
 
1755
- def send_data( sock, data, target_addr )
1748
+ def send_data(sock, data, target_addr)
1756
1749
  begin
1757
- sock.sendmsg( data, 0, target_addr )
1750
+ sock.sendmsg(data, 0, target_addr)
1758
1751
  rescue Exception => e
1759
- puts "sendmsg #{ e.class }"
1752
+ puts "sendmsg #{e.class}"
1760
1753
  end
1761
1754
  end
1762
1755
 
1763
- def set_dst_closing( dst )
1756
+ def set_dst_closing(dst)
1764
1757
  return if dst.nil? || dst.closed?
1765
- dst_info = @dst_infos[ dst ]
1766
- return if dst_info.nil? || dst_info[ :closing ]
1767
- dst_info[ :closing ] = true
1768
- add_write( dst )
1758
+ dst_info = @dst_infos[dst]
1759
+ return if dst_info.nil? || dst_info[:closing]
1760
+ dst_info[:closing] = true
1761
+ add_write(dst)
1769
1762
  end
1770
1763
 
1771
- def set_girl_closing( girl )
1764
+ def set_girl_closing(girl)
1772
1765
  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 )
1766
+ girl_info = @girl_infos[girl]
1767
+ return if girl_info.nil? || girl_info[:closing]
1768
+ girl_info[:closing] = true
1769
+ add_write(girl)
1777
1770
  end
1778
1771
 
1779
- def set_p1_closing( p1 )
1772
+ def set_p1_closing(p1)
1780
1773
  return if p1.nil? || p1.closed?
1781
- p1_info = @p1_infos[ p1 ]
1782
- return if p1_info.nil? || p1_info[ :closing ]
1783
- p1_info[ :closing ] = true
1784
- add_write( p1 )
1774
+ p1_info = @p1_infos[p1]
1775
+ return if p1_info.nil? || p1_info[:closing]
1776
+ p1_info[:closing] = true
1777
+ add_write(p1)
1785
1778
  end
1786
1779
 
1787
- def set_relay_closing( relay )
1780
+ def set_relay_closing(relay)
1788
1781
  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 )
1782
+ relay_info = @relay_infos[relay]
1783
+ return if relay_info.nil? || relay_info[:closing]
1784
+ relay_info[:closing] = true
1785
+ add_write(relay)
1793
1786
  end
1794
1787
 
1795
- def set_remote( src )
1788
+ def set_remote(src)
1796
1789
  return if src.nil? || src.closed?
1797
1790
 
1798
- if @proxy.closed? then
1799
- close_src( src )
1791
+ if @proxy.closed?
1792
+ close_src(src)
1800
1793
  return
1801
1794
  end
1802
1795
 
1803
- src_info = @src_infos[ src ]
1804
- src_info[ :proxy_type ] = :remote
1796
+ src_info = @src_infos[src]
1797
+ src_info[:proxy_type] = :remote
1805
1798
 
1806
- if src_info[ :proxy_proto ] == :http then
1807
- if src_info[ :is_connect ] then
1808
- puts "add HTTP_OK #{ src_info[ :proxy_type ] }" if @is_debug
1809
- add_src_wbuff( src, HTTP_OK )
1799
+ if src_info[:proxy_proto] == :http
1800
+ if src_info[:is_connect]
1801
+ puts "add HTTP_OK #{src_info[:proxy_type]}" if @is_debug
1802
+ add_src_wbuff(src, HTTP_OK)
1810
1803
  end
1811
- elsif src_info[ :proxy_proto ] == :socks5 then
1812
- puts "add_socks5_conn_reply #{ src_info[ :proxy_type ] }" if @is_debug
1813
- add_socks5_conn_reply( src )
1804
+ elsif src_info[:proxy_proto] == :socks5
1805
+ puts "add_socks5_conn_reply #{src_info[:proxy_type]}" if @is_debug
1806
+ add_socks5_conn_reply(src)
1814
1807
  end
1815
1808
 
1816
- src_id = src_info[ :src_id ]
1817
- domain = src_info[ :destination_domain ]
1818
- port = src_info[ :destination_port ]
1819
- domain_port = [ domain, port ].join( ':' )
1820
- puts "add h_a_new_source #{ src_id } #{ domain_port }" if @is_debug
1821
- msg = "#{ @h_a_new_source }#{ [ src_id ].pack( 'Q>' ) }#{ domain_port }"
1822
- add_proxy_wbuff( pack_a_chunk( msg ) )
1823
- data = src_info[ :rbuff ].dup
1809
+ src_id = src_info[:src_id]
1810
+ domain = src_info[:destination_domain]
1811
+ port = src_info[:destination_port]
1812
+ domain_port = [domain, port].join(':')
1813
+ puts "add h_a_new_source #{src_id} #{domain_port}" if @is_debug
1814
+ msg = "#{@h_a_new_source}#{[src_id].pack('Q>')}#{domain_port}"
1815
+ add_proxy_wbuff(pack_a_chunk(msg))
1816
+ data = src_info[:rbuff].dup
1824
1817
 
1825
- unless data.empty? then
1826
- puts "move src rbuff to proxy #{ domain } #{ data.bytesize }" if @is_debug
1827
- add_proxy_wbuff( pack_traffic( src_id, data ) )
1818
+ unless data.empty?
1819
+ puts "move src rbuff to proxy #{domain} #{data.bytesize}" if @is_debug
1820
+ add_proxy_wbuff(pack_traffic(src_id, data))
1828
1821
  end
1829
1822
  end
1830
1823
 
1831
- def set_src_closing( src )
1824
+ def set_src_closing(src)
1832
1825
  return if src.nil? || src.closed?
1833
- src_info = @src_infos[ src ]
1834
- return if src_info.nil? || src_info[ :closing ]
1835
- src_info[ :closing ] = true
1836
- add_write( src )
1826
+ src_info = @src_infos[src]
1827
+ return if src_info.nil? || src_info[:closing]
1828
+ src_info[:closing] = true
1829
+ add_write(src)
1837
1830
  end
1838
1831
 
1839
- def set_update( sock )
1840
- @updates[ sock ] = Time.new
1841
-
1842
- if @updates_limit - @updates.size <= 20 then
1843
- puts "updates #{ @updates.size }"
1844
- end
1832
+ def set_update(sock)
1833
+ @updates[sock] = Time.new
1834
+ puts "updates #{@updates.size}" if @updates_limit - @updates.size <= 20
1845
1835
 
1846
- if @updates.size >= @updates_limit then
1836
+ if @updates.size >= @updates_limit
1847
1837
  puts "eliminate updates"
1848
1838
 
1849
- @updates.keys.each do | _sock |
1850
- case @roles[ _sock ]
1839
+ @updates.keys.each do |_sock|
1840
+ case @roles[_sock]
1851
1841
  when :dns
1852
- close_dns( _sock )
1842
+ close_dns(_sock)
1853
1843
  when :dst
1854
- close_dst( _sock )
1844
+ close_dst(_sock)
1855
1845
  when :girl
1856
- close_girl( _sock )
1846
+ close_girl(_sock)
1857
1847
  when :mem
1858
- close_mem( _sock )
1848
+ close_mem(_sock)
1859
1849
  when :p1
1860
- close_p1( _sock )
1850
+ close_p1(_sock)
1861
1851
  when :relay
1862
- close_relay( _sock )
1852
+ close_relay(_sock)
1863
1853
  when :rsv
1864
- close_rsv( _sock )
1854
+ close_rsv(_sock)
1865
1855
  when :src
1866
- close_src( _sock )
1856
+ close_src(_sock)
1867
1857
  else
1868
- close_sock( _sock )
1858
+ close_sock(_sock)
1869
1859
  end
1870
1860
  end
1871
1861
 
@@ -1873,301 +1863,301 @@ module Girl
1873
1863
  end
1874
1864
  end
1875
1865
 
1876
- def write_dst( dst )
1877
- if dst.closed? then
1866
+ def write_dst(dst)
1867
+ if dst.closed?
1878
1868
  puts "write closed dst?"
1879
1869
  return
1880
1870
  end
1881
1871
 
1882
- dst_info = @dst_infos[ dst ]
1883
- dst_info[ :connected ] = true
1884
- data = dst_info[ :wbuff ]
1872
+ dst_info = @dst_infos[dst]
1873
+ dst_info[:connected] = true
1874
+ data = dst_info[:wbuff]
1885
1875
 
1886
- if data.empty? then
1887
- if dst_info[ :closing ] then
1888
- close_dst( dst )
1876
+ if data.empty?
1877
+ if dst_info[:closing]
1878
+ close_dst(dst)
1889
1879
  else
1890
- @writes.delete( dst )
1880
+ @writes.delete(dst)
1891
1881
  end
1892
1882
 
1893
1883
  return
1894
1884
  end
1895
1885
 
1896
1886
  begin
1897
- written = dst.write_nonblock( data )
1887
+ written = dst.write_nonblock(data)
1898
1888
  rescue Errno::EINPROGRESS
1899
1889
  return
1900
1890
  rescue Exception => e
1901
- close_dst( dst )
1891
+ close_dst(dst)
1902
1892
  return
1903
1893
  end
1904
1894
 
1905
- set_update( dst )
1906
- data = data[ written..-1 ]
1907
- dst_info[ :wbuff ] = data
1908
- bytesize = dst_info[ :wbuff ].bytesize
1895
+ set_update(dst)
1896
+ data = data[written..-1]
1897
+ dst_info[:wbuff] = data
1898
+ bytesize = dst_info[:wbuff].bytesize
1909
1899
 
1910
- if dst_info[ :overflowing ] && ( bytesize < RESUME_BELOW ) then
1911
- puts "dst underhalf #{ dst_info[ :domain ] }"
1912
- add_read( dst_info[ :src ] )
1913
- dst_info[ :overflowing ] = false
1900
+ if dst_info[:overflowing] && (bytesize < RESUME_BELOW)
1901
+ puts "dst underhalf #{dst_info[:domain]}"
1902
+ add_read(dst_info[:src])
1903
+ dst_info[:overflowing] = false
1914
1904
  end
1915
1905
  end
1916
1906
 
1917
- def write_girl( girl )
1918
- if girl.closed? then
1907
+ def write_girl(girl)
1908
+ if girl.closed?
1919
1909
  puts "write closed girl?"
1920
1910
  return
1921
1911
  end
1922
1912
 
1923
- girl_info = @girl_infos[ girl ]
1924
- girl_info[ :connected ] = true
1925
- data = girl_info[ :wbuff ]
1913
+ girl_info = @girl_infos[girl]
1914
+ girl_info[:connected] = true
1915
+ data = girl_info[:wbuff]
1926
1916
 
1927
- if data.empty? then
1928
- if girl_info[ :closing ] then
1929
- close_girl( girl )
1917
+ if data.empty?
1918
+ if girl_info[:closing]
1919
+ close_girl(girl)
1930
1920
  else
1931
- @writes.delete( girl )
1921
+ @writes.delete(girl)
1932
1922
  end
1933
1923
 
1934
1924
  return
1935
1925
  end
1936
1926
 
1937
1927
  begin
1938
- if girl_info[ :is_syn ] then
1939
- written = girl.sendmsg_nonblock( data, 536870912, @proxyd_addr )
1940
- girl_info[ :is_syn ] = false
1928
+ if girl_info[:is_syn]
1929
+ written = girl.sendmsg_nonblock(data, 536870912, @proxyd_addr)
1930
+ girl_info[:is_syn] = false
1941
1931
  else
1942
- written = girl.write_nonblock( data )
1932
+ written = girl.write_nonblock(data)
1943
1933
  end
1944
1934
  rescue Errno::EINPROGRESS
1945
1935
  return
1946
1936
  rescue Exception => e
1947
- close_girl( girl )
1937
+ close_girl(girl)
1948
1938
  return
1949
1939
  end
1950
1940
 
1951
- set_update( girl )
1952
- data = data[ written..-1 ]
1953
- girl_info[ :wbuff ] = data
1954
- bytesize = girl_info[ :wbuff ].bytesize
1941
+ set_update(girl)
1942
+ data = data[written..-1]
1943
+ girl_info[:wbuff] = data
1944
+ bytesize = girl_info[:wbuff].bytesize
1955
1945
 
1956
- if girl_info[ :overflowing ] && ( bytesize < RESUME_BELOW ) then
1946
+ if girl_info[:overflowing] && (bytesize < RESUME_BELOW)
1957
1947
  puts "girl underhalf"
1958
- add_read( girl_info[ :relay ] )
1959
- girl_info[ :overflowing ] = false
1948
+ add_read(girl_info[:relay])
1949
+ girl_info[:overflowing] = false
1960
1950
  end
1961
1951
  end
1962
1952
 
1963
- def write_mem( mem )
1964
- if mem.closed? then
1953
+ def write_mem(mem)
1954
+ if mem.closed?
1965
1955
  puts "write closed mem?"
1966
1956
  return
1967
1957
  end
1968
1958
 
1969
- mem_info = @mem_infos[ mem ]
1970
- data = mem_info[ :wbuff ]
1959
+ mem_info = @mem_infos[mem]
1960
+ data = mem_info[:wbuff]
1971
1961
 
1972
- if data.empty? then
1973
- @writes.delete( mem )
1974
- close_mem( mem )
1962
+ if data.empty?
1963
+ @writes.delete(mem)
1964
+ close_mem(mem)
1975
1965
  return
1976
1966
  end
1977
1967
 
1978
1968
  begin
1979
- written = mem.write_nonblock( data )
1969
+ written = mem.write_nonblock(data)
1980
1970
  rescue Errno::EINPROGRESS
1981
1971
  return
1982
1972
  rescue Exception => e
1983
- close_mem( mem )
1973
+ close_mem(mem)
1984
1974
  return
1985
1975
  end
1986
1976
 
1987
- set_update( mem )
1988
- data = data[ written..-1 ]
1989
- mem_info[ :wbuff ] = data
1977
+ set_update(mem)
1978
+ data = data[written..-1]
1979
+ mem_info[:wbuff] = data
1990
1980
  end
1991
1981
 
1992
- def write_p1( p1 )
1993
- if p1.closed? then
1982
+ def write_p1(p1)
1983
+ if p1.closed?
1994
1984
  puts "write closed p1?"
1995
1985
  return
1996
1986
  end
1997
1987
 
1998
- p1_info = @p1_infos[ p1 ]
1999
- p1_info[ :connected ] = true
2000
- data = p1_info[ :wbuff ]
1988
+ p1_info = @p1_infos[p1]
1989
+ p1_info[:connected] = true
1990
+ data = p1_info[:wbuff]
2001
1991
 
2002
- if data.empty? then
2003
- if p1_info[ :closing ] then
2004
- close_p1( p1 )
1992
+ if data.empty?
1993
+ if p1_info[:closing]
1994
+ close_p1(p1)
2005
1995
  else
2006
- @writes.delete( p1 )
1996
+ @writes.delete(p1)
2007
1997
  end
2008
1998
 
2009
1999
  return
2010
2000
  end
2011
2001
 
2012
2002
  begin
2013
- written = p1.write_nonblock( data )
2003
+ written = p1.write_nonblock(data)
2014
2004
  rescue Errno::EINPROGRESS
2015
2005
  return
2016
2006
  rescue Exception => e
2017
- close_p1( p1 )
2007
+ close_p1(p1)
2018
2008
  return
2019
2009
  end
2020
2010
 
2021
- set_update( p1 )
2022
- data = data[ written..-1 ]
2023
- p1_info[ :wbuff ] = data
2024
- bytesize = p1_info[ :wbuff ].bytesize
2011
+ set_update(p1)
2012
+ data = data[written..-1]
2013
+ p1_info[:wbuff] = data
2014
+ bytesize = p1_info[:wbuff].bytesize
2025
2015
 
2026
- if p1_info[ :overflowing ] && ( bytesize < RESUME_BELOW ) then
2027
- p2_id = p1_info[ :p2_id ]
2028
- puts "add h_p1_underhalf #{ p2_id }"
2029
- msg = "#{ @h_p1_underhalf }#{ [ p2_id ].pack( 'Q>' ) }"
2030
- add_proxy_wbuff( pack_a_chunk( msg ) )
2031
- p1_info[ :overflowing ] = false
2016
+ if p1_info[:overflowing] && (bytesize < RESUME_BELOW)
2017
+ p2_id = p1_info[:p2_id]
2018
+ puts "add h_p1_underhalf #{p2_id}"
2019
+ msg = "#{@h_p1_underhalf}#{[p2_id].pack('Q>')}"
2020
+ add_proxy_wbuff(pack_a_chunk(msg))
2021
+ p1_info[:overflowing] = false
2032
2022
  end
2033
2023
  end
2034
2024
 
2035
- def write_proxy( proxy )
2036
- if proxy.closed? then
2025
+ def write_proxy(proxy)
2026
+ if proxy.closed?
2037
2027
  puts "write closed proxy?"
2038
2028
  return
2039
2029
  end
2040
2030
 
2041
- proxy_info = @proxy_infos[ proxy ]
2042
- data = proxy_info[ :wbuff ]
2031
+ proxy_info = @proxy_infos[proxy]
2032
+ data = proxy_info[:wbuff]
2043
2033
 
2044
- if data.empty? then
2045
- @writes.delete( proxy )
2034
+ if data.empty?
2035
+ @writes.delete(proxy)
2046
2036
  return
2047
2037
  end
2048
2038
 
2049
2039
  begin
2050
- if proxy_info[ :is_syn ] then
2051
- written = proxy.sendmsg_nonblock( data, 536870912, @proxyd_addr )
2052
- proxy_info[ :is_syn ] = false
2040
+ if proxy_info[:is_syn]
2041
+ written = proxy.sendmsg_nonblock(data, 536870912, @proxyd_addr)
2042
+ proxy_info[:is_syn] = false
2053
2043
  else
2054
- written = proxy.write_nonblock( data )
2044
+ written = proxy.write_nonblock(data)
2055
2045
  end
2056
2046
  rescue Errno::EINPROGRESS
2057
2047
  return
2058
2048
  rescue Exception => e
2059
- puts "write proxy #{ e.class }"
2060
- close_proxy( proxy )
2049
+ puts "write proxy #{e.class}"
2050
+ close_proxy(proxy)
2061
2051
  return
2062
2052
  end
2063
2053
 
2064
- set_update( proxy )
2065
- data = data[ written..-1 ]
2066
- proxy_info[ :wbuff ] = data
2067
- bytesize = proxy_info[ :wbuff ].bytesize
2054
+ set_update(proxy)
2055
+ data = data[written..-1]
2056
+ proxy_info[:wbuff] = data
2057
+ bytesize = proxy_info[:wbuff].bytesize
2068
2058
 
2069
- if bytesize < RESUME_BELOW then
2070
- if proxy_info[ :paused_srcs ].any? then
2071
- puts "proxy underhalf resume srcs #{ proxy_info[ :paused_srcs ].size }"
2072
- proxy_info[ :paused_srcs ].each{ | src | add_read( src ) }
2073
- proxy_info[ :paused_srcs ].clear
2059
+ if bytesize < RESUME_BELOW
2060
+ if proxy_info[:paused_srcs].any?
2061
+ puts "proxy underhalf resume srcs #{proxy_info[:paused_srcs].size}"
2062
+ proxy_info[:paused_srcs].each{|src| add_read(src)}
2063
+ proxy_info[:paused_srcs].clear
2074
2064
  end
2075
2065
 
2076
- if proxy_info[ :paused_p1s ].any? then
2077
- puts "proxy underhalf resume p1s #{ proxy_info[ :paused_p1s ].size }"
2078
- proxy_info[ :paused_p1s ].each{ | p1 | add_read( p1 ) }
2079
- proxy_info[ :paused_p1s ].clear
2066
+ if proxy_info[:paused_p1s].any?
2067
+ puts "proxy underhalf resume p1s #{proxy_info[:paused_p1s].size}"
2068
+ proxy_info[:paused_p1s].each{|p1| add_read(p1)}
2069
+ proxy_info[:paused_p1s].clear
2080
2070
  end
2081
2071
  end
2082
2072
  end
2083
2073
 
2084
- def write_src( src )
2085
- if src.closed? then
2074
+ def write_src(src)
2075
+ if src.closed?
2086
2076
  puts "write closed src?"
2087
2077
  return
2088
2078
  end
2089
2079
 
2090
- src_info = @src_infos[ src ]
2091
- data = src_info[ :wbuff ]
2080
+ src_info = @src_infos[src]
2081
+ data = src_info[:wbuff]
2092
2082
 
2093
- if data.empty? then
2094
- if src_info[ :closing ] then
2095
- close_src( src )
2083
+ if data.empty?
2084
+ if src_info[:closing]
2085
+ close_src(src)
2096
2086
  else
2097
- @writes.delete( src )
2087
+ @writes.delete(src)
2098
2088
  end
2099
2089
 
2100
2090
  return
2101
2091
  end
2102
2092
 
2103
2093
  begin
2104
- written = src.write_nonblock( data )
2094
+ written = src.write_nonblock(data)
2105
2095
  rescue Errno::EINPROGRESS
2106
2096
  return
2107
2097
  rescue Exception => e
2108
- close_src( src )
2098
+ close_src(src)
2109
2099
  return
2110
2100
  end
2111
2101
 
2112
- set_update( src )
2113
- data = data[ written..-1 ]
2114
- src_info[ :wbuff ] = data
2115
- bytesize = src_info[ :wbuff ].bytesize
2102
+ set_update(src)
2103
+ data = data[written..-1]
2104
+ src_info[:wbuff] = data
2105
+ bytesize = src_info[:wbuff].bytesize
2116
2106
 
2117
- if src_info[ :overflowing ] && ( bytesize < RESUME_BELOW ) then
2118
- src_id = src_info[ :src_id ]
2119
- domain = src_info[ :destination_domain ]
2107
+ if src_info[:overflowing] && (bytesize < RESUME_BELOW)
2108
+ src_id = src_info[:src_id]
2109
+ domain = src_info[:destination_domain]
2120
2110
 
2121
- if src_info[ :proxy_type ] == :direct then
2122
- puts "src underhalf #{ src_id } #{ domain }"
2123
- add_read( src_info[ :dst ] )
2111
+ if src_info[:proxy_type] == :direct
2112
+ puts "src underhalf #{src_id} #{domain}"
2113
+ add_read(src_info[:dst])
2124
2114
  else
2125
- puts "add h_src_underhalf #{ src_id } #{ domain }"
2126
- msg = "#{ @h_src_underhalf }#{ [ src_id ].pack( 'Q>' ) }"
2127
- add_proxy_wbuff( pack_a_chunk( msg ) )
2115
+ puts "add h_src_underhalf #{src_id} #{domain}"
2116
+ msg = "#{@h_src_underhalf}#{[src_id].pack('Q>')}"
2117
+ add_proxy_wbuff(pack_a_chunk(msg))
2128
2118
  end
2129
2119
 
2130
- src_info[ :overflowing ] = false
2120
+ src_info[:overflowing] = false
2131
2121
  end
2132
2122
  end
2133
2123
 
2134
- def write_relay( relay )
2135
- if relay.closed? then
2124
+ def write_relay(relay)
2125
+ if relay.closed?
2136
2126
  puts "write closed relay?"
2137
2127
  return
2138
2128
  end
2139
2129
 
2140
- relay_info = @relay_infos[ relay ]
2141
- data = relay_info[ :wbuff ]
2130
+ relay_info = @relay_infos[relay]
2131
+ data = relay_info[:wbuff]
2142
2132
 
2143
- if data.empty? then
2144
- if relay_info[ :closing ] then
2145
- close_relay( relay )
2133
+ if data.empty?
2134
+ if relay_info[:closing]
2135
+ close_relay(relay)
2146
2136
  else
2147
- @writes.delete( relay )
2137
+ @writes.delete(relay)
2148
2138
  end
2149
2139
 
2150
2140
  return
2151
2141
  end
2152
2142
 
2153
2143
  begin
2154
- written = relay.write_nonblock( data )
2144
+ written = relay.write_nonblock(data)
2155
2145
  rescue Errno::EINPROGRESS
2156
2146
  return
2157
2147
  rescue Exception => e
2158
- close_relay( relay )
2148
+ close_relay(relay)
2159
2149
  return
2160
2150
  end
2161
2151
 
2162
- set_update( relay )
2163
- data = data[ written..-1 ]
2164
- relay_info[ :wbuff ] = data
2165
- bytesize = relay_info[ :wbuff ].bytesize
2152
+ set_update(relay)
2153
+ data = data[written..-1]
2154
+ relay_info[:wbuff] = data
2155
+ bytesize = relay_info[:wbuff].bytesize
2166
2156
 
2167
- if relay_info[ :overflowing ] && ( bytesize < RESUME_BELOW ) then
2157
+ if relay_info[:overflowing] && (bytesize < RESUME_BELOW)
2168
2158
  puts "relay underhalf"
2169
- add_read( relay_info[ :girl ] )
2170
- relay_info[ :overflowing ] = false
2159
+ add_read(relay_info[:girl])
2160
+ relay_info[:overflowing] = false
2171
2161
  end
2172
2162
  end
2173
2163