diff -r 4ebc2e2fb97c -r 71c04702a3d5 src/java.base/share/native/libnet/proxy_util.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/java.base/share/native/libnet/proxy_util.c Tue Sep 12 19:03:39 2017 +0200 @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +#include "jni.h" +#include "jni_util.h" + +#include "proxy_util.h" + +jclass proxy_class; +jclass isaddr_class; +jclass ptype_class; +jmethodID isaddr_createUnresolvedID; +jmethodID proxy_ctrID; +jfieldID pr_no_proxyID; +jfieldID ptype_httpID; +jfieldID ptype_socksID; + +int initJavaClass(JNIEnv *env) { + jclass proxy_cls = NULL; + jclass ptype_cls = NULL; + jclass isaddr_cls = NULL; + + // Proxy initialization + proxy_cls = (*env)->FindClass(env,"java/net/Proxy"); + CHECK_NULL_RETURN(proxy_cls, 0); + proxy_class = (*env)->NewGlobalRef(env, proxy_cls); + CHECK_NULL_RETURN(proxy_class, 0); + proxy_ctrID = (*env)->GetMethodID(env, proxy_class, "", + "(Ljava/net/Proxy$Type;Ljava/net/SocketAddress;)V"); + CHECK_NULL_RETURN(proxy_ctrID, 0); + + // Proxy$Type initialization + ptype_cls = (*env)->FindClass(env,"java/net/Proxy$Type"); + CHECK_NULL_RETURN(ptype_cls, 0); + ptype_class = (*env)->NewGlobalRef(env, ptype_cls); + CHECK_NULL_RETURN(ptype_class, 0); + ptype_httpID = (*env)->GetStaticFieldID(env, ptype_class, "HTTP", + "Ljava/net/Proxy$Type;"); + CHECK_NULL_RETURN(ptype_httpID, 0); + ptype_socksID = (*env)->GetStaticFieldID(env, ptype_class, "SOCKS", + "Ljava/net/Proxy$Type;"); + CHECK_NULL_RETURN(ptype_socksID, 0); + + // NO_PROXY + pr_no_proxyID = (*env)->GetStaticFieldID(env, proxy_class, "NO_PROXY", + "Ljava/net/Proxy;"); + CHECK_NULL_RETURN(pr_no_proxyID, 0); + + // InetSocketAddress initialization + isaddr_cls = (*env)->FindClass(env, "java/net/InetSocketAddress"); + CHECK_NULL_RETURN(isaddr_cls, 0); + isaddr_class = (*env)->NewGlobalRef(env, isaddr_cls); + CHECK_NULL_RETURN(isaddr_class, 0); + isaddr_createUnresolvedID = (*env)->GetStaticMethodID(env, isaddr_class, + "createUnresolved", + "(Ljava/lang/String;I)Ljava/net/InetSocketAddress;"); + + return isaddr_createUnresolvedID != NULL ? 1 : 0; +} + +jobject createProxy(JNIEnv *env, jfieldID ptype_ID, const char* phost, unsigned short pport) { + jobject jProxy = NULL; + jobject type_proxy = NULL; + type_proxy = (*env)->GetStaticObjectField(env, ptype_class, ptype_ID); + if (type_proxy) { + jstring jhost = NULL; + jhost = (*env)->NewStringUTF(env, phost); + if (jhost) { + jobject isa = NULL; + isa = (*env)->CallStaticObjectMethod(env, isaddr_class, + isaddr_createUnresolvedID, jhost, pport); + if (isa) { + jProxy = (*env)->NewObject(env, proxy_class, proxy_ctrID, + type_proxy, isa); + } + } + } + return jProxy; +}