Hi Chris,

thanks a lot - I did not see this case in my tests. I added your change to my 
new webrev:
http://cr.openjdk.java.net/~clanger/webrevs/8170868.5/


Best regards,
Arno

>-----Original Message-----
>From: Chris Hegarty [mailto:chris.hega...@oracle.com]
>Sent: Montag, 30. Januar 2017 17:14
>To: Zeller, Arno <arno.zel...@sap.com>
>Cc: net-dev@openjdk.java.net
>Subject: Re: RFR:8170868: DefaultProxySelector should use system defaults
>on Windows, MacOS and Gnome
>
>Arno,
>
>I found an issue on Windows when proxies are specified per-protocol, i.e.
>they are returned with their optional scheme set. I believe that the scheme
>should be checked, at least without this change FTP proxies were being
>returned for HTTP URL's, on my machine.
>
>$ hg -R jdk diff
>diff -r 07e07fecf383
>src/java.base/windows/native/libnet/DefaultProxySelector.c
>--- a/src/java.base/windows/native/libnet/DefaultProxySelector.c
>Mon Jan 30 14:09:14 2017 +0000
>+++ b/src/java.base/windows/native/libnet/DefaultProxySelector.c
>Mon Jan 30 16:09:23 2017 +0000
>@@ -99,6 +99,7 @@
>   * Returns the size of the array as int.
>   */
>  static int createProxyList(LPWSTR win_proxy, const WCHAR *pproto,
>list_item **head) {
>+    static const wchar_t separators[] = L"\t\r\n ;";
>      list_item *current = NULL;
>      int nr_elems = 0;
>      wchar_t *context = NULL;
>@@ -109,13 +110,26 @@
>       * The proxy server list contains one or more of the following strings
>separated by semicolons or whitespace.
>       * ([<scheme>=][<scheme>"://"]<server>[":"<port>])
>       */
>-    current_proxy = wcstok_s(win_proxy, L"; ", &context);
>-    while (current_proxy != NULL) {
>+    current_proxy = wcstok_s(win_proxy, separators, &context);
>+    while (current_proxy != NULL) {
>          LPWSTR pport;
>          LPWSTR phost;
>          int portVal = 0;
>          wchar_t *next_proxy = NULL;
>          list_item *proxy = NULL;
>+        wchar_t* pos = NULL;
>+
>+        /* Filter based on the scheme, if there is one */
>+        pos = wcschr(current_proxy, L'=');
>+        if (pos) {
>+          *pos = L'\0';
>+          if (wcscmp(current_proxy, pproto) != 0) {
>+              current_proxy = wcstok_s(NULL, separators, &context);
>+              continue;
>+          }
>+          current_proxy = pos + 1;
>+        }
>
>          /* Let's check for a scheme and ignore it. */
>          if ((phost = wcsstr(current_proxy, L"://")) != NULL) { @@ -152,7 
> +166,7
>@@
>              }
>          }
>          /* goto next proxy if available... */
>-        current_proxy = wcstok_s(NULL, L"; ", &context);
>+        current_proxy = wcstok_s(NULL, separators, &context);
>      }
>      return nr_elems;
>  }
>@@ -268,7 +282,6 @@
>          if (win_proxy != NULL) {
>              wchar_t *context = NULL;
>              int defport = 0;
>-            WCHAR pproto[MAX_STR_LEN];
>              int nr_elems = 0;
>
>              /**
>@@ -290,10 +303,7 @@
>                  goto noproxy;
>              }
>
>-            /* Prepare protocol string to compare with. */
>-            _snwprintf(pproto, sizeof(pproto), L"%s=", lpProto);
>-
>-            nr_elems = createProxyList(win_proxy, pproto, &head);
>+            nr_elems = createProxyList(win_proxy, lpProto, &head);
>              if (nr_elems != 0 && head != NULL) {
>                  int index = 0;
>                  proxy_array = (*env)->NewObjectArray(env, nr_elems, 
> proxy_class,
>NULL);
>
>-Chris.
>
>P.S. I will take a look at the latest webrev.
>

Reply via email to