19ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk/* 29ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk * Copyright (C) 2013 The Android Open Source Project 39ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk * 49ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk * Licensed under the Apache License, Version 2.0 (the "License"); 59ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk * you may not use this file except in compliance with the License. 69ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk * You may obtain a copy of the License at 79ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk * 89ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk * http://www.apache.org/licenses/LICENSE-2.0 99ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk * 109ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk * Unless required by applicable law or agreed to in writing, software 119ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk * distributed under the License is distributed on an "AS IS" BASIS, 129ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk * See the License for the specific language governing permissions and 149ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk * limitations under the License. 159ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk */ 169ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk 179ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk#define LOG_TAG "PacProcessor" 189ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk 199ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk#include <utils/Log.h> 209ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk#include <utils/Mutex.h> 219ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk#include "android_runtime/AndroidRuntime.h" 229ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk 239ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk#include "jni.h" 242279b2534272282a5b5152723235da397e49195cSteven Moreland#include <nativehelper/JNIHelp.h> 259ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk 269ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk#include "proxy_resolver_v8.h" 279ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk 289ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monknamespace android { 299ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk 309ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monkclass ProxyErrorLogger : public net::ProxyErrorListener { 319ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monkpublic: 329ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk ~ProxyErrorLogger() { 339ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk 349ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk } 359ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk void AlertMessage(String16 message) { 369ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk String8 str(message); 379ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk ALOGD("Alert: %s", str.string()); 389ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk } 399ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk void ErrorMessage(String16 message) { 409ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk String8 str(message); 419ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk ALOGE("Error: %s", str.string()); 429ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk } 439ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk}; 449ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk 459ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monknet::ProxyResolverV8* proxyResolver = NULL; 469ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason MonkProxyErrorLogger* logger = NULL; 479ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monkbool pacSet = false; 489ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk 499ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason MonkString16 jstringToString16(JNIEnv* env, jstring jstr) { 509ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk const jchar* str = env->GetStringCritical(jstr, 0); 516698749dd4d4d6513b26aa9071af290b956b68a7Dan Albert String16 str16(reinterpret_cast<const char16_t*>(str), 526698749dd4d4d6513b26aa9071af290b956b68a7Dan Albert env->GetStringLength(jstr)); 539ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk env->ReleaseStringCritical(jstr, str); 549ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk return str16; 559ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk} 569ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk 579ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monkjstring string16ToJstring(JNIEnv* env, String16 string) { 589ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk const char16_t* str = string.string(); 599ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk size_t len = string.size(); 609ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk 616698749dd4d4d6513b26aa9071af290b956b68a7Dan Albert return env->NewString(reinterpret_cast<const jchar*>(str), len); 629ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk} 639ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk 64423ba098bd6ed9e90fa3f940b58c5c058c6cbee8Andreas Gampestatic jboolean com_android_pacprocessor_PacNative_createV8ParserNativeLocked(JNIEnv* /* env */, 659ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk jobject) { 669ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk if (proxyResolver == NULL) { 679ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk logger = new ProxyErrorLogger(); 689ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk proxyResolver = new net::ProxyResolverV8(net::ProxyResolverJSBindings::CreateDefault(), 699ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk logger); 709ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk pacSet = false; 719ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk return JNI_FALSE; 729ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk } 739ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk return JNI_TRUE; 749ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk} 759ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk 76577f48c1c9b0d41f0a48d9091f0248fdd960343fAndreas Gampestatic jboolean com_android_pacprocessor_PacNative_destroyV8ParserNativeLocked(JNIEnv* /* env */, 779ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk jobject) { 789ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk if (proxyResolver != NULL) { 799ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk delete logger; 809ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk delete proxyResolver; 819ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk logger = NULL; 829ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk proxyResolver = NULL; 839ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk return JNI_FALSE; 849ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk } 859ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk return JNI_TRUE; 869ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk} 879ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk 889ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monkstatic jboolean com_android_pacprocessor_PacNative_setProxyScriptNativeLocked(JNIEnv* env, jobject, 899ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk jstring script) { 909ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk String16 script16 = jstringToString16(env, script); 919ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk 929ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk if (proxyResolver == NULL) { 939ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk ALOGE("V8 Parser not started when setting PAC script"); 949ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk return JNI_TRUE; 959ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk } 969ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk 979ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk if (proxyResolver->SetPacScript(script16) != OK) { 989ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk ALOGE("Unable to set PAC script"); 999ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk return JNI_TRUE; 1009ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk } 1019ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk pacSet = true; 1029ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk 1039ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk return JNI_FALSE; 1049ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk} 1059ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk 1069ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monkstatic jstring com_android_pacprocessor_PacNative_makeProxyRequestNativeLocked(JNIEnv* env, jobject, 1079ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk jstring url, jstring host) { 1089ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk String16 url16 = jstringToString16(env, url); 1099ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk String16 host16 = jstringToString16(env, host); 1109ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk String16 ret; 1119ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk 1129ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk if (proxyResolver == NULL) { 1139ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk ALOGE("V8 Parser not initialized when running PAC script"); 1149ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk return NULL; 1159ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk } 1169ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk 1179ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk if (!pacSet) { 1189ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk ALOGW("Attempting to run PAC with no script set"); 1199ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk return NULL; 1209ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk } 1219ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk 1229ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk if (proxyResolver->GetProxyForURL(url16, host16, &ret) != OK) { 1239ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk String8 ret8(ret); 1249ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk ALOGE("Error Running PAC: %s", ret8.string()); 1259ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk return NULL; 1269ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk } 1279ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk 1289ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk jstring jret = string16ToJstring(env, ret); 1299ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk 1309ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk return jret; 1319ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk} 1329ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk 13376f6a86de25e1bf74717e047e55fd44b089673f3Daniel Micaystatic const JNINativeMethod gMethods[] = { 1349ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk { "createV8ParserNativeLocked", "()Z", 1359ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk (void*)com_android_pacprocessor_PacNative_createV8ParserNativeLocked}, 1369ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk { "destroyV8ParserNativeLocked", "()Z", 1379ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk (void*)com_android_pacprocessor_PacNative_destroyV8ParserNativeLocked}, 1389ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk { "setProxyScriptNativeLocked", "(Ljava/lang/String;)Z", 1399ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk (void*)com_android_pacprocessor_PacNative_setProxyScriptNativeLocked}, 1409ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk { "makeProxyRequestNativeLocked", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;", 1419ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk (void*)com_android_pacprocessor_PacNative_makeProxyRequestNativeLocked}, 1429ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk}; 1439ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk 1449ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monkint register_com_android_pacprocessor_PacNative(JNIEnv* env) { 1459ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk return jniRegisterNativeMethods(env, "com/android/pacprocessor/PacNative", 1469ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk gMethods, NELEM(gMethods)); 1479ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk} 1489ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk 1499ced3cd9d6ea414523051ec872fffc68f5fdbf08Jason Monk} /* namespace android */ 150