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.

On 30/01/17 15:31, Zeller, Arno wrote:
Hi Chris,

thanks for your comments! I adjusted the change to contain your suggestions and 
slightly modified
src/java.base/share/classes/java/net/doc-files/net-properties.html  to refer to 
macOS .
Also found some missing adjustments of the copyright year myself...

Some smaller comments and observations ( I'm still reviewing and testing ):
...
2) unix/native/libnet/DefaultProxySelector.c

   You have changes to make g_strv_length available, but then
   count the proxies in the list manually. Maybe just use
   g_strv_length.
Removed reference to g_strv_length - I simply forgot to delete it after 
changing my code to iterate over the list.

   Nit: L 167 / 358    parameter indentation
Fixed.

3) windows/native/libnet/DefaultProxySelector.c

   The HINTERNET session could be set lazily, for the case
   where there are no auto proxy settings. Not sure if it
   worth it though.
I would like to keep the current approach because it avoids the need of locking 
to ensure that the initialization is
done only by one thread.

   The indentation of the main body of XXX_getSystemProxies
   could be reduced a little if:
     if (WinHttpGetIEProxyConfigForCurrentUser(&ie_proxy_config) == FALSE)
       return NULL;
Done.

4) macosx/native/libnet/DefaultProxySelector.c

   The indentation of the main body of XXX_getSystemProxies
   could be reduced a little if:
    proxyDicRef = CFNetworkCopySystemProxySettings();
    if (proxyDicRef == NULL)
       return NULL;
Done.


5) I personally prefer the code of the old createProxy. Was there
   specific reason why you changed it?
Sorry for this - another leftover from a former change. I reverted back to the 
original.

6) Can you generally check the line lengths in all files, and try
   where possible to keep it below 100, e.g. some comments could
   easily be wrapped.
Done.

7) I would like to add jtreg tags to test/java/net/ProxySelector/
   SystemProxies.java to have it run in any automated test systems.
   There would be no failure mode of this test, as it requires
   manually inspecting the output, but it would at least give some
   coverage to this new code. Something like:
     /*
      * @test
      * @bug 8170868
      * @summary Basic test to provide some coverage of system proxy code.
Will
      * always pass. Should be run manually for specific systems to inspect
output.
      * @run/othervm -Djava.net.useSystemProxies=true SystemProxies
      */
Done.

The new webrev can be found at:
http://cr.openjdk.java.net/~clanger/webrevs/8170868.4/

Best regards,
Arno

Reply via email to