src/java.base/windows/native/libnet/DefaultProxySelector.c
author vtewari
Thu, 22 Nov 2018 13:25:44 +0530
changeset 52651 526b2490c616
parent 47216 71c04702a3d5
child 52725 c470f977ade8
permissions -rw-r--r--
8046500: GetIpAddrTable function failed on Pure Ipv6 environment Reviewed-by: chegar
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     1
/*
43501
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
     2
 * Copyright (c) 2004, 2017, Oracle and/or its affiliates. All rights reserved.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
90ce3da70b43 Initial load
duke
parents:
diff changeset
     4
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
90ce3da70b43 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    10
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
90ce3da70b43 Initial load
duke
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
90ce3da70b43 Initial load
duke
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
90ce3da70b43 Initial load
duke
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
90ce3da70b43 Initial load
duke
parents:
diff changeset
    15
 * accompanied this code).
90ce3da70b43 Initial load
duke
parents:
diff changeset
    16
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
90ce3da70b43 Initial load
duke
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    20
 *
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2
diff changeset
    23
 * questions.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    24
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    25
90ce3da70b43 Initial load
duke
parents:
diff changeset
    26
#include <windows.h>
43501
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
    27
#include <Winhttp.h>
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
    28
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    29
#include "jni.h"
90ce3da70b43 Initial load
duke
parents:
diff changeset
    30
#include "jni_util.h"
90ce3da70b43 Initial load
duke
parents:
diff changeset
    31
#include "jvm.h"
43501
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
    32
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
    33
#include "proxy_util.h"
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
    34
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    35
#include "sun_net_spi_DefaultProxySelector.h"
90ce3da70b43 Initial load
duke
parents:
diff changeset
    36
43501
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
    37
/*
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    38
 * These functions are used by the sun.net.spi.DefaultProxySelector class
90ce3da70b43 Initial load
duke
parents:
diff changeset
    39
 * to access some platform specific settings.
43501
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
    40
 * On Windows use WinHTTP functions to get the system settings.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    41
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    42
43501
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
    43
/* Keep one static session for all requests. */
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
    44
static HINTERNET session = NULL;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    45
90ce3da70b43 Initial load
duke
parents:
diff changeset
    46
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
    47
 * Class:     sun_net_spi_DefaultProxySelector
90ce3da70b43 Initial load
duke
parents:
diff changeset
    48
 * Method:    init
90ce3da70b43 Initial load
duke
parents:
diff changeset
    49
 * Signature: ()Z
90ce3da70b43 Initial load
duke
parents:
diff changeset
    50
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    51
JNIEXPORT jboolean JNICALL
90ce3da70b43 Initial load
duke
parents:
diff changeset
    52
Java_sun_net_spi_DefaultProxySelector_init(JNIEnv *env, jclass clazz) {
43501
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
    53
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
    54
    /*
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
    55
     * Get one WinHTTP session handle to initialize the WinHTTP internal data
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
    56
     * structures. Keep and use only this one for the whole life time.
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
    57
     */
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
    58
    session = WinHttpOpen(L"Only used internal", /* we need no real agent string here */
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
    59
                          WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
    60
                          WINHTTP_NO_PROXY_NAME,
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
    61
                          WINHTTP_NO_PROXY_BYPASS,
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
    62
                          0);
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
    63
    if (session == NULL) {
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
    64
        return JNI_FALSE;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
    65
    }
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
    66
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
    67
    if (!initJavaClass(env)) {
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
    68
        return JNI_FALSE;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
    69
    }
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
    70
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
    71
    return JNI_TRUE;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
    72
}
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    73
43501
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
    74
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
    75
#define MAX_STR_LEN 1024
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
    76
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
    77
/* A linked list element for a proxy */
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
    78
typedef struct list_item {
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
    79
    wchar_t *host;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
    80
    int port;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
    81
    struct list_item *next;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
    82
} list_item;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    83
43501
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
    84
/* Free the linked list */
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
    85
static void freeList(list_item *head) {
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
    86
    list_item *next = NULL;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
    87
    list_item *current = head;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
    88
    while (current != NULL) {
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
    89
        next = current->next;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
    90
        free(current->host);
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
    91
        free(current);
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
    92
        current = next;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
    93
    }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    94
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
    95
43501
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
    96
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
    97
/*
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
    98
 * Creates a linked list of list_item elements that has to be freed later on.
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
    99
 * Returns the size of the array as int.
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   100
 */
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   101
static int createProxyList(LPWSTR win_proxy, const WCHAR *pproto, list_item **head) {
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   102
    static const wchar_t separators[] = L"\t\r\n ;";
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   103
    list_item *current = NULL;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   104
    int nr_elems = 0;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   105
    wchar_t *context = NULL;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   106
    wchar_t *current_proxy = NULL;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   107
    BOOL error = FALSE;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   108
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   109
    /*
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   110
     * The proxy server list contains one or more of the following strings
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   111
     * separated by semicolons or whitespace:
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   112
     *    ([<scheme>=][<scheme>"://"]<server>[":"<port>])
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   113
     */
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   114
    current_proxy = wcstok_s(win_proxy, separators, &context);
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   115
    while (current_proxy != NULL) {
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   116
        LPWSTR pport;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   117
        LPWSTR phost;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   118
        int portVal = 0;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   119
        wchar_t *next_proxy = NULL;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   120
        list_item *proxy = NULL;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   121
        wchar_t* pos = NULL;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   122
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   123
        /* Filter based on the scheme, if there is one */
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   124
        pos = wcschr(current_proxy, L'=');
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   125
        if (pos) {
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   126
          *pos = L'\0';
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   127
          if (wcscmp(current_proxy, pproto) != 0) {
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   128
              current_proxy = wcstok_s(NULL, separators, &context);
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   129
              continue;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   130
          }
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   131
          current_proxy = pos + 1;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   132
        }
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   133
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   134
        /* Let's check for a scheme and ignore it. */
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   135
        if ((phost = wcsstr(current_proxy, L"://")) != NULL) {
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   136
            phost += 3;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   137
        } else {
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   138
            phost = current_proxy;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   139
        }
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   140
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   141
        /* Get the port */
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   142
        pport = wcschr(phost, L':');
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   143
        if (pport != NULL) {
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   144
            *pport = 0;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   145
            pport++;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   146
            swscanf(pport, L"%d", &portVal);
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   147
        }
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   148
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   149
        proxy = (list_item *)malloc(sizeof(list_item));
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   150
        if (proxy != NULL) {
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   151
            proxy->next = NULL;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   152
            proxy->port = portVal;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   153
            proxy->host = _wcsdup(phost);
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   154
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   155
            if (proxy->host != NULL) {
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   156
                if (*head == NULL) {
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   157
                    *head = proxy; /* first elem */
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   158
                }
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   159
                if (current != NULL) {
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   160
                    current->next = proxy;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   161
                }
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   162
                current = proxy;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   163
                nr_elems++;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   164
            } else {
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   165
                free(proxy); /* cleanup */
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   166
            }
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   167
        }
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   168
        /* goto next proxy if available... */
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   169
        current_proxy = wcstok_s(NULL, separators, &context);
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   170
    }
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   171
    return nr_elems;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   172
}
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   173
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   174
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   175
90ce3da70b43 Initial load
duke
parents:
diff changeset
   176
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   177
 * Class:     sun_net_spi_DefaultProxySelector
43501
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   178
 * Method:    getSystemProxies
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   179
 * Signature: ([Ljava/lang/String;Ljava/lang/String;)[Ljava/net/Proxy;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   180
 */
43501
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   181
JNIEXPORT jobjectArray JNICALL
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   182
Java_sun_net_spi_DefaultProxySelector_getSystemProxies(JNIEnv *env,
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   183
                                                       jobject this,
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   184
                                                       jstring proto,
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   185
                                                       jstring host)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   186
{
43501
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   187
    jobjectArray proxy_array = NULL;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   188
    jobject type_proxy = NULL;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   189
    LPCWSTR lpProto;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   190
    LPCWSTR lpHost;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   191
    list_item *head = NULL;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   192
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   193
    BOOL                                   use_auto_proxy = FALSE;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   194
    WINHTTP_CURRENT_USER_IE_PROXY_CONFIG   ie_proxy_config;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   195
    WINHTTP_AUTOPROXY_OPTIONS              auto_proxy_options;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   196
    WINHTTP_PROXY_INFO                     proxy_info;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   197
    LPWSTR win_proxy = NULL;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   198
    LPWSTR win_bypass_proxy = NULL;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   199
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   200
    memset(&ie_proxy_config, 0, sizeof(WINHTTP_CURRENT_USER_IE_PROXY_CONFIG));
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   201
    memset(&auto_proxy_options, 0, sizeof(WINHTTP_AUTOPROXY_OPTIONS));
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   202
    memset(&proxy_info, 0, sizeof(WINHTTP_PROXY_INFO));
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   203
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   204
    lpHost = (*env)->GetStringChars(env, host, NULL);
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   205
    if (lpHost == NULL) {
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   206
        if (!(*env)->ExceptionCheck(env))
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   207
            JNU_ThrowOutOfMemoryError(env, NULL);
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   208
        return NULL;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   209
    }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   210
43501
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   211
    lpProto = (*env)->GetStringChars(env, proto, NULL);
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   212
    if (lpProto == NULL) {
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   213
        (*env)->ReleaseStringChars(env, host, lpHost);
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   214
        if (!(*env)->ExceptionCheck(env))
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   215
            JNU_ThrowOutOfMemoryError(env, NULL);
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   216
        return NULL;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   217
    }
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   218
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   219
    if (WinHttpGetIEProxyConfigForCurrentUser(&ie_proxy_config) == FALSE) {
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   220
        /* cleanup and exit */
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   221
        (*env)->ReleaseStringChars(env, host, lpHost);
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   222
        (*env)->ReleaseStringChars(env, proto, lpProto);
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   223
        return NULL;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   224
    }
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   225
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   226
    if (ie_proxy_config.fAutoDetect) {
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   227
        /* Windows uses WPAD */
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   228
        auto_proxy_options.dwAutoDetectFlags = WINHTTP_AUTO_DETECT_TYPE_DHCP |
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   229
                                               WINHTTP_AUTO_DETECT_TYPE_DNS_A;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   230
        auto_proxy_options.dwFlags = WINHTTP_AUTOPROXY_AUTO_DETECT;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   231
        auto_proxy_options.fAutoLogonIfChallenged = TRUE;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   232
        use_auto_proxy = TRUE;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   233
    } else if (ie_proxy_config.lpszAutoConfigUrl != NULL) {
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   234
        /* Windows uses PAC file */
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   235
        auto_proxy_options.lpszAutoConfigUrl = ie_proxy_config.lpszAutoConfigUrl;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   236
        auto_proxy_options.dwFlags = WINHTTP_AUTOPROXY_CONFIG_URL;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   237
        use_auto_proxy = TRUE;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   238
    } else if (ie_proxy_config.lpszProxy != NULL) {
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   239
        /* Windows uses manually entered proxy. */
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   240
        use_auto_proxy = FALSE;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   241
        win_bypass_proxy = ie_proxy_config.lpszProxyBypass;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   242
        win_proxy = ie_proxy_config.lpszProxy;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   243
    }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   244
43501
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   245
    if (use_auto_proxy) {
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   246
        WCHAR url[MAX_STR_LEN];
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   247
        /* Create url for WinHttpGetProxyForUrl */
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   248
        _snwprintf(url, sizeof(url) - 1, L"%s://%s", lpProto, lpHost);
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   249
        /* Get proxy for URL from Windows */
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   250
        use_auto_proxy = WinHttpGetProxyForUrl(session, &url[0], &auto_proxy_options, &proxy_info);
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   251
        if (use_auto_proxy) {
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   252
            win_proxy = proxy_info.lpszProxy;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   253
            win_bypass_proxy = proxy_info.lpszProxyBypass;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   254
        }
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   255
    }
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   256
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   257
    /* Check the bypass entry. */
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   258
    if (NULL != win_bypass_proxy) {
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   259
        /*
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   260
         * From MSDN:
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   261
         * The proxy bypass list contains one or more server names separated by
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   262
         * semicolons or whitespace. The proxy bypass list can also contain the
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   263
         * string "<local>" to indicate that all local intranet sites are
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   264
         * bypassed. Local intranet sites are considered to be all servers that
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   265
         * do not contain a period in their name.
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   266
         */
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   267
        wchar_t *context = NULL;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   268
        LPWSTR s = wcstok_s(win_bypass_proxy, L"; ", &context);
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   269
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   270
        while (s != NULL) {
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   271
            size_t maxlen = wcslen(s);
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   272
            if (wcsncmp(s, lpHost, maxlen) == 0) {
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   273
                /*
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   274
                 * The URL host name matches with one of the prefixes, use a
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   275
                 * direct connection.
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   276
                 */
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   277
                goto noproxy;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   278
            }
43501
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   279
            if (wcsncmp(s, L"<local>", maxlen) == 0) {
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   280
                /*
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   281
                 * All local intranet sites are bypassed - Microsoft consider all
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   282
                 * servers that do not contain a period in their name to be local.
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   283
                 */
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   284
                if (wcschr(lpHost, '.') == NULL) {
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   285
                    goto noproxy;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   286
                }
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   287
            }
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   288
            s = wcstok_s(NULL, L"; ", &context);
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   289
        }
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   290
    }
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   291
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   292
    if (win_proxy != NULL) {
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   293
        wchar_t *context = NULL;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   294
        int defport = 0;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   295
        int nr_elems = 0;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   296
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   297
        /* Set the default port value & proxy type from protocol. */
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   298
        if ((wcscmp(lpProto, L"http") == 0) ||
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   299
            (wcscmp(lpProto, L"ftp") == 0) ||
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   300
            (wcscmp(lpProto, L"gopher") == 0))
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   301
            defport = 80;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   302
        if (wcscmp(lpProto, L"https") == 0)
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   303
            defport = 443;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   304
        if (wcscmp(lpProto, L"socks") == 0) {
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   305
            defport = 1080;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   306
            type_proxy = (*env)->GetStaticObjectField(env, ptype_class, ptype_socksID);
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   307
        } else {
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   308
            type_proxy = (*env)->GetStaticObjectField(env, ptype_class, ptype_httpID);
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   309
        }
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   310
        if (type_proxy == NULL || (*env)->ExceptionCheck(env)) {
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   311
            goto noproxy;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   312
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   313
43501
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   314
        nr_elems = createProxyList(win_proxy, lpProto, &head);
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   315
        if (nr_elems != 0 && head != NULL) {
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   316
            int index = 0;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   317
            proxy_array = (*env)->NewObjectArray(env, nr_elems, proxy_class, NULL);
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   318
            if (proxy_array == NULL || (*env)->ExceptionCheck(env)) {
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   319
                goto noproxy;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   320
            }
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   321
            while (head != NULL && index < nr_elems) {
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   322
                jstring jhost;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   323
                jobject isa;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   324
                jobject proxy;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   325
43501
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   326
                if (head->host != NULL && proxy_array != NULL) {
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   327
                    /* Let's create the appropriate Proxy object then. */
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   328
                    if (head->port == 0) {
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   329
                        head->port = defport;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   330
                    }
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   331
                    jhost = (*env)->NewString(env, head->host, (jsize)wcslen(head->host));
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   332
                    if (jhost == NULL || (*env)->ExceptionCheck(env)) {
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   333
                        proxy_array = NULL;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   334
                    }
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   335
                    isa = (*env)->CallStaticObjectMethod(env, isaddr_class,
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   336
                                                         isaddr_createUnresolvedID, jhost,
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   337
                                                         head->port);
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   338
                    if (isa == NULL || (*env)->ExceptionCheck(env)) {
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   339
                        proxy_array = NULL;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   340
                    }
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   341
                    proxy = (*env)->NewObject(env, proxy_class, proxy_ctrID, type_proxy, isa);
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   342
                    if (proxy == NULL || (*env)->ExceptionCheck(env)) {
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   343
                        proxy_array = NULL;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   344
                    }
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   345
                    (*env)->SetObjectArrayElement(env, proxy_array, index, proxy);
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   346
                    if ((*env)->ExceptionCheck(env)) {
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   347
                        proxy_array = NULL;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   348
                    }
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   349
                    index++;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   350
                }
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   351
                head = head->next;
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   352
            }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   353
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   354
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   355
90ce3da70b43 Initial load
duke
parents:
diff changeset
   356
noproxy:
43501
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   357
    if (head != NULL) {
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   358
        freeList(head);
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   359
    }
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   360
    if (proxy_info.lpszProxy != NULL)
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   361
      GlobalFree(proxy_info.lpszProxy);
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   362
    if (proxy_info.lpszProxyBypass != NULL)
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   363
      GlobalFree(proxy_info.lpszProxyBypass);
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   364
    if (ie_proxy_config.lpszAutoConfigUrl != NULL)
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   365
      GlobalFree(ie_proxy_config.lpszAutoConfigUrl);
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   366
    if (ie_proxy_config.lpszProxy != NULL)
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   367
      GlobalFree(ie_proxy_config.lpszProxy);
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   368
    if (ie_proxy_config.lpszProxyBypass != NULL)
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   369
      GlobalFree(ie_proxy_config.lpszProxyBypass);
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   370
    if (lpHost != NULL)
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   371
      (*env)->ReleaseStringChars(env, host, lpHost);
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   372
    if (lpProto != NULL)
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   373
      (*env)->ReleaseStringChars(env, proto, lpProto);
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   374
243c346dc905 8170868: DefaultProxySelector should use system defaults on Windows, MacOS and Gnome
clanger
parents: 25859
diff changeset
   375
    return proxy_array;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   376
}