Arno,

Thanks for doing this, and your patience so far. One more final
round of comments from me. Mostly minor. I’ve put them in the
form of a webrev so you can easily view and import them, if you
agree.

  http://cr.openjdk.java.net/~chegar/8170868_additional/

1)  A few comment rewordings and formatting suggestions.

2) I see duplicate DIRECT, and a few specific proxies, in my
    testing. Maybe my environment or PAC file is returning
    duplicate entries. I suggest that, at the java-level, we filter
    out duplicates while preserving ordering. ( see above webrev )

3) We do not use asserts in core libraries. So I replaced the usage
    with an early return NULL ( no proxy ). At a later stage we could
    throw an exception or something, but probably not all that
    interesting.

I have run this change ( along with my additional suggestions )
through our internal build and test system. No surprises.

-Chris.

> On 31 Jan 2017, at 09:14, Zeller, Arno <arno.zel...@sap.com> wrote:
> 
> 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