diff --git a/android/.settings/org.eclipse.buildship.core.prefs b/android/.settings/org.eclipse.buildship.core.prefs index 4a2e916..e479558 100644 --- a/android/.settings/org.eclipse.buildship.core.prefs +++ b/android/.settings/org.eclipse.buildship.core.prefs @@ -1,13 +1,13 @@ arguments= auto.sync=false build.scans.enabled=false -connection.gradle.distribution=GRADLE_DISTRIBUTION(VERSION(7.0-rc-1)) +connection.gradle.distribution=GRADLE_DISTRIBUTION(WRAPPER) connection.project.dir= eclipse.preferences.version=1 gradle.user.home= -java.home=/Library/Java/JavaVirtualMachines/zulu-11.jdk/Contents/Home +java.home= jvm.arguments= offline.mode=false -override.workspace.settings=true -show.console.view=true -show.executions.view=true +override.workspace.settings=false +show.console.view=false +show.executions.view=false diff --git a/ios/Classes/SwiftFlutterSystemProxyPlugin.swift b/ios/Classes/SwiftFlutterSystemProxyPlugin.swift index f16ef9f..f881fc3 100644 --- a/ios/Classes/SwiftFlutterSystemProxyPlugin.swift +++ b/ios/Classes/SwiftFlutterSystemProxyPlugin.swift @@ -21,21 +21,12 @@ public class SwiftFlutterSystemProxyPlugin: NSObject, FlutterPlugin { let args = call.arguments as! NSDictionary let url = args.value(forKey:"url") as! String let host = args.value(forKey:"host") as! String - let PacUrl = proxyDict.value(forKey:"ProxyAutoConfigURLString") as! String - if let uri = URL(string: PacUrl) { - do { - let contents = try String(contentsOf: uri) - let jsEngine:JSContext = JSContext() - jsEngine.evaluateScript(contents) - let fn = "FindProxyForURL(\"" + url + "\",\""+host+"\")" - let proxy = jsEngine.evaluateScript(fn) - result(proxy?.toString()) - } catch { - result("DIRECT") - } - } else { - result("DIRECT") - } + let js = args.value(forKey:"js") as! String + let jsEngine:JSContext = JSContext() + jsEngine.evaluateScript(js) + let fn = "FindProxyForURL(\"" + url + "\",\""+host+"\")" + let proxy = jsEngine.evaluateScript(fn) + result(proxy?.toString()) }else{ result("DIRECT") } diff --git a/lib/flutter_system_proxy.dart b/lib/flutter_system_proxy.dart index f2b9bf9..823a035 100644 --- a/lib/flutter_system_proxy.dart +++ b/lib/flutter_system_proxy.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'dart:convert'; import 'dart:io'; import 'package:flutter/services.dart'; @@ -32,7 +33,10 @@ class FlutterSystemProxy { return null; } else if (Platform.isIOS) { if (proxySettings["ProxyAutoConfigEnable"] == 1) { - return {"pacEnabled": "true"}; + return { + "pacEnabled": "true", + "pacUrl": proxySettings['ProxyAutoConfigURLString'] + }; } else { if (isHttps) { if (proxySettings['HTTPSEnable'] == 1) { @@ -65,9 +69,13 @@ class FlutterSystemProxy { (parsedProxy["host"] as String) + ":" + (parsedProxy["port"] as String); - } else if (parsedProxy != null && parsedProxy["pacEnabled"] == "true") { - String proxy = - await _channel.invokeMethod("executePAC", {"url": url, "host": host}); + } else if (parsedProxy != null && + parsedProxy["pacEnabled"] == "true" && + parsedProxy["pacUrl"] != null) { + String pacLocation = parsedProxy["pacUrl"] as String; + String jsContents = await contents(pacLocation); + String proxy = await _channel.invokeMethod( + "executePAC", {"url": url, "host": host, "js": jsContents}); return proxy; } else { return HttpClient.findProxyFromEnvironment(Uri.parse(url)); @@ -88,3 +96,15 @@ bool isPort(String? port) { return false; } } + +Future contents(String url) async { + HttpClient client = new HttpClient(); + var completor = new Completer(); + client.findProxy = null; + var request = await client.getUrl(Uri.parse(url)); + var response = await request.close(); + response.transform(utf8.decoder).listen((contents) { + completor.complete(contents); + }); + return completor.future; +} diff --git a/pubspec.yaml b/pubspec.yaml index c13d71c..c2711bb 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: flutter_system_proxy description: A Flutter Plugin to detect System proxy. When using HTTP client that are not proxy aware this plugin can help with finding the proxy from system settings which then can be used with HTTP Client to make a successful request. -version: 0.0.1 +version: 0.0.2 homepage: https://github.com/Rushabhshroff/flutter_system_proxy.git environment: @@ -24,4 +24,4 @@ flutter: ios: pluginClass: FlutterSystemProxyPlugin - \ No newline at end of file +