Bug 36356

Summary: HTTP proxy wildcard for no_proxy
Product: [Mono] Class Libraries Reporter: Christoph Brill <egore>
Component: SystemAssignee: Andi McClure <andi.mcclure>
Severity: normal CC: andi.mcclure, mono-bugs+mono
Priority: ---    
Version: 4.2.0 (C6)   
Target Milestone: Untriaged   
Hardware: PC   
OS: Linux   
Tags: Is this bug a regression?: ---
Last known good build:

Description Christoph Brill 2015-11-30 09:04:18 UTC
When setting the environment variable "no_proxy='localhost,,::1,*.local'" I get the following exception:

System.TypeInitializationException: The type initializer for 'NuGet.ProxyCache' threw an exception. ---> System.ArgumentException: parsing '*.cgm.ag' - Quantifier {x,y} following nothing.
  at System.Text.RegularExpressions.RegexParser.ScanRegex () <0x4167b4a0 + 0x00633> in <filename unknown>:0 
  at System.Text.RegularExpressions.RegexParser.Parse (System.String re, RegexOptions op) <0x4167a340 + 0x000af> in <filename unknown>:0 
  at System.Text.RegularExpressions.Regex..ctor (System.String pattern, RegexOptions options, TimeSpan matchTimeout, Boolean useCache) <0x41679770 + 0x00227> in <filename unknown>:0 
  at System.Text.RegularExpressions.Regex..ctor (System.String pattern) <0x41679720 + 0x00033> in <filename unknown>:0 
  at System.Net.WebProxy.CheckBypassList () <0x416790e0 + 0x0007b> in <filename unknown>:0 
  at System.Net.WebProxy..ctor (System.Uri address, Boolean bypassOnLocal, System.String[] bypassList, ICredentials credentials) <0x41678b50 + 0x00103> in <filename unknown>:0 
  at System.Net.WebProxy..ctor (System.Uri address, Boolean bypassOnLocal, System.String[] bypassList) <0x41678b10 + 0x0002b> in <filename unknown>:0 
  at System.Net.WebRequest.GetSystemWebProxy () <0x4164e220 + 0x0083f> in <filename unknown>:0 
  at NuGet.ProxyCache..cctor () <0x4164bd10 + 0x0000b> in <filename unknown>:0 
  --- End of inner exception stack trace ---
  at NuGet.HttpClient.GetResponse () <0x4164bb10 + 0x00117> in <filename unknown>:0 
  at NuGet.RedirectedHttpClient.GetResponseUri (NuGet.HttpClient client) <0x4164b9e0 + 0x00029> in <filename unknown>:0 
  at NuGet.RedirectedHttpClient.EnsureClient () <0x4164b950 + 0x00047> in <filename unknown>:0 
  at System.Lazy`1[T].CreateValue () <0x415c8c20 + 0x001b7> in <filename unknown>:0 

This syntax is e.g. supported by the major browsers.
Comment 1 Christoph Brill 2015-11-30 09:08:07 UTC
Note that "*.cgm.ag" should be replaced by "*.local" in the stack trace.
Comment 2 Andi McClure 2015-12-07 19:37:01 UTC
Christoph's problem is that the no_proxy value for WebRequest is expecting regular expressions (as in, System.Text.RegularExpressions.Regex syntax) but Christoph reasonably expects to use fileglob syntax.

The no_proxy variable goes directly into the bypassList of a WebProxy. 

The bypassList is documented by https://msdn.microsoft.com/en-us/library/ms144293(v=vs.110).aspx to take "An array of regular expression strings". Our current implementation interprets that as a Regex. However, the sample code at that same MSDN URL gives ";*.Contoso.com" as an example of a bypass list member, which appears to be a glob expression and clearly not a Regex (what's up with the semicolon...?). Meanwhile our own WebRequest code seems to expect that the bypass list members are fileglobs, with System.Net.WebRequest special-casing "*.local".

Either WebRequest should be converting from fileglob to regex, or WebProxy should treat the bypass list members as fileglobs to start with.
Comment 3 Andi McClure 2015-12-07 19:59:54 UTC
Double-checked the reference sources, MS's implementation is definitely using Regex. So we are obliged to treat WebProxy as "correct" and fix WebRequest.

Checking Google suggests other people have run into this problem also http://stackoverflow.com/questions/30620652/nuget-on-mono-behind-proxy-not-able-to-connect-to-the-internet
Comment 4 Andi McClure 2015-12-07 20:32:51 UTC
Minimal test program

using System;
using System.Net;

namespace Test {
	class Program {
	    static void Main(string[] args) {
	    	Console.WriteLine("{0}", WebRequest.GetSystemWebProxy());

Try invoking with
http_proxy="https://example.com" no_proxy="*.google.com" mono --debug Test.exe
on Linux (proxy env vars ignored on mac)
Comment 5 Andi McClure 2015-12-07 21:05:38 UTC
See https://github.com/mono/mono/pull/2296
Comment 6 Andi McClure 2015-12-10 16:56:55 UTC
Should be fixed as of 6ae64e4 (goes into Mono 4.4)