Project

General

Profile

Feature #12062

Updated by nobu (Nobuyoshi Nakada) about 8 years ago

Ruby supports ENV["no_proxy"] in `lib/uri/generic.rb` 
 Current implementation expects comma separated hostname suffix and exact IP address. 
 It is similar to **`wget`** implementation. 
 (the difference is `wget` does suffix match only `no_proxy` hostname begins with period. But this difference is not so harmful.) 

 ## Current Implementation 

 Ruby doesn't support CIDR style(ex. `192.168.2.0/24`) `no_proxy` instruction. 

 It is also mentioned too in this post. 
 http://unix.stackexchange.com/questions/23452/set-a-network-range-in-the-no-proxy-environment-variable 

 ## Workaround 

 And mentioned workaround is below. 

 ```sh ``` 
 printf -v no_proxy '%s,' 10.1.{1..255}.{1..255}; 
 export no_proxy="${no_proxy%,}"; 
 ``` 

 I think it is ugly solution. 
 If one doesn't want to use proxy in private network(it is **very common** in company's network) 
 It may require configuration like 

 ```sh ``` 
 no_proxy=10.0.0.0,10.0.0.1,10.0.0.......10.255.255.255(about 219MB) 
 ``` 

 length of ENV["no_proxy"] will become about 219MB(!!) 
 It will take much more time in Ruby's URI implementation right now. 

 current `lib/uri/generic.rb` is below. 

 ```ruby ``` 
 no_proxy.scan(/([^:,]*)(?::(\d+))?/) {|host, port| 
   if /(\A|\.)#{Regexp.quote host}\z/i =~ self.host && 
     (!port || self.port == port.to_i) 
       return nil 
   end 
 } 
 ``` 

 It requires regexp engine searching over 219MB string's data. 
 Long config file cause terrible performance suffer. 

 Linux standard might be `wget`, but **Python does not**. 
 Python implementation in a widely used library **requests** is [here](https://github.com/kennethreitz/requests/blob/master/requests/utils.py#L519-L542) 

 ## Suggetsion 

 I think Python's solution is cool and fast and minimize surprising. 
 So I wish ruby to support CIDR style `no_proxy` instruction like Python. 

Back