From d0ad272198c5802b4c112444624e8e29e06995d2 Mon Sep 17 00:00:00 2001 From: Charlie Qiu Date: Tue, 18 Oct 2016 23:35:17 +0800 Subject: [PATCH] Refactor pac proxy. --- ShadowsocksX-NG/AppDelegate.swift | 10 +- .../AdvPreferencesWindowController.xib | 164 ++++++++---------- ShadowsocksX-NG/ProxyConfHelper.h | 10 +- ShadowsocksX-NG/ProxyConfHelper.m | 64 ++++--- .../ProxyPreferencesController.swift | 2 +- 5 files changed, 120 insertions(+), 130 deletions(-) diff --git a/ShadowsocksX-NG/AppDelegate.swift b/ShadowsocksX-NG/AppDelegate.swift index 9ed542e..40f58ff 100755 --- a/ShadowsocksX-NG/AppDelegate.swift +++ b/ShadowsocksX-NG/AppDelegate.swift @@ -58,7 +58,6 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele "ShadowsocksRunningMode": "auto", "LocalSocks5.ListenPort": NSNumber(value: 1086 as UInt16), "LocalSocks5.ListenAddress": "127.0.0.1", - "PacServer.ListenAddress": "127.0.0.1", "PacServer.ListenPort":NSNumber(value: 8090 as UInt16), "LocalSocks5.Timeout": NSNumber(value: 60 as UInt), "LocalSocks5.EnableUDPRelay": NSNumber(value: false as Bool), @@ -171,10 +170,9 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele // Insert code here to tear down your application StopSSLocal() StopPrivoxy() - ProxyConfHelper.disableProxy("hi") + ProxyConfHelper.disableProxy() let defaults = UserDefaults.standard defaults.set(false, forKey: "ShadowsocksOn") - ProxyConfHelper.stopPACServer() } func applyConfig() { @@ -186,16 +184,16 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele StartSSLocal() StartPrivoxy() if mode == "auto" { - ProxyConfHelper.enablePACProxy("hi") + ProxyConfHelper.enablePACProxy() } else if mode == "global" { ProxyConfHelper.enableGlobalProxy() } else if mode == "manual" { - ProxyConfHelper.disableProxy("hi") + ProxyConfHelper.disableProxy() } } else { StopSSLocal() StopPrivoxy() - ProxyConfHelper.disableProxy("hi") + ProxyConfHelper.disableProxy() } } diff --git a/ShadowsocksX-NG/Base.lproj/AdvPreferencesWindowController.xib b/ShadowsocksX-NG/Base.lproj/AdvPreferencesWindowController.xib index 35784f1..9e90f71 100644 --- a/ShadowsocksX-NG/Base.lproj/AdvPreferencesWindowController.xib +++ b/ShadowsocksX-NG/Base.lproj/AdvPreferencesWindowController.xib @@ -14,30 +14,19 @@ - + - + - + - - - - - - - - - - - - + - + @@ -53,7 +42,7 @@ - + @@ -61,10 +50,10 @@ - + - + @@ -72,7 +61,7 @@ - + @@ -80,7 +69,7 @@ - + @@ -95,7 +84,7 @@ - + @@ -103,7 +92,7 @@ - + @@ -119,7 +108,7 @@ - + - + @@ -148,10 +137,7 @@ - - - - + @@ -168,18 +154,16 @@ - - - + + - - - + + @@ -194,22 +178,12 @@ - - - - - - - - - - - - - - - - + + + + + + @@ -217,51 +191,57 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + diff --git a/ShadowsocksX-NG/ProxyConfHelper.h b/ShadowsocksX-NG/ProxyConfHelper.h index c00ade2..0f0dfa0 100644 --- a/ShadowsocksX-NG/ProxyConfHelper.h +++ b/ShadowsocksX-NG/ProxyConfHelper.h @@ -14,14 +14,14 @@ + (void)install; -+ (void)enablePACProxy:(NSString*) PACFilePath; ++ (void)enablePACProxy; + (void)enableGlobalProxy; -+ (void)disableProxy:(NSString*) PACFilePath; ++ (void)disableProxy; -+ (NSString*)startPACServer:(NSString*) PACFilePath; - -+ (void)stopPACServer; +//+ (void)startPACServer:(NSString*) PACFilePath; +// +//+ (void)stopPACServer; @end diff --git a/ShadowsocksX-NG/ProxyConfHelper.m b/ShadowsocksX-NG/ProxyConfHelper.m index 6089ae0..dbe0128 100644 --- a/ShadowsocksX-NG/ProxyConfHelper.m +++ b/ShadowsocksX-NG/ProxyConfHelper.m @@ -114,14 +114,14 @@ GCDWebServer *webServer =nil; } } -+ (void)enablePACProxy:(NSString*) PACFilePath { ++ (void)enablePACProxy { //start server here and then using the string next line //next two lines can open gcdwebserver and work around pac file - NSString *PACURLString = [self startPACServer: PACFilePath];//hi 可以切换成定制pac文件路径来达成使用定制文件路径 - NSURL* url = [NSURL URLWithString: PACURLString]; -// NSString* urlString = [NSString stringWithFormat:@"%@/.ShadowsocksX-NG/gfwlist.js", NSHomeDirectory()]; -// NSURL* url = [NSURL fileURLWithPath:urlString]; - + NSString* PACFilePath = [NSString stringWithFormat:@"%@/%@", NSHomeDirectory(), @".ShadowsocksX-NG/gfwlist.js"]; + [self startPACServer: PACFilePath]; + + NSURL* url = [NSURL URLWithString: [self getHttpPACUrl]]; + NSMutableArray* args = [@[@"--mode", @"auto", @"--pac-url", [url absoluteString]]mutableCopy]; [self addArguments4ManualSpecifyNetworkServices:args]; @@ -146,12 +146,9 @@ GCDWebServer *webServer =nil; [self stopPACServer]; } -+ (void)disableProxy:(NSString*) PACFilePath { -// 带上所有参数是为了判断是否原有代理设置是否由ssx-ng设置的。如果是用户手工设置的其他配置,则不进行清空。 -// NSString* urlString = [NSString stringWithFormat:@"%@/.ShadowsocksX-NG/gfwlist.js", NSHomeDirectory()]; -// NSURL* url = [NSURL fileURLWithPath:urlString]; - NSString *PACURLString = [self startPACServer: PACFilePath];//hi 可以切换成定制pac文件路径来达成使用定制文件路径 - NSURL* url = [NSURL URLWithString: PACURLString]; ++ (void)disableProxy { + // 带上所有参数是为了判断是否原有代理设置是否由ssx-ng设置的。如果是用户手工设置的其他配置,则不进行清空。 + NSURL* url = [NSURL URLWithString: [self getHttpPACUrl]]; NSUInteger port = [[NSUserDefaults standardUserDefaults]integerForKey:@"LocalSocks5.ListenPort"]; NSMutableArray* args = [@[@"--mode", @"off" @@ -163,28 +160,43 @@ GCDWebServer *webServer =nil; [self stopPACServer]; } -+ (NSString*)startPACServer:(NSString*) PACFilePath { - //接受参数为以后使用定制PAC文件 - NSData * originalPACData; ++ (NSString*)getHttpPACUrl { NSString * routerPath = @"/proxy.pac"; - if ([PACFilePath isEqual: @"hi"]) {//用默认路径来代替 - PACFilePath = [NSString stringWithFormat:@"%@/%@", NSHomeDirectory(), @".ShadowsocksX-NG/gfwlist.js"]; - originalPACData = [NSData dataWithContentsOfFile: [NSString stringWithFormat:@"%@/%@", NSHomeDirectory(), @".ShadowsocksX-NG/gfwlist.js"]]; - }else{//用定制路径来代替 - originalPACData = [NSData dataWithContentsOfFile: [NSString stringWithFormat:@"%@/%@/%@", NSHomeDirectory(), @".ShadowsocksX-NG", PACFilePath]]; - routerPath = [NSString stringWithFormat:@"/%@",PACFilePath]; - } + + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + + NSString * address = @"127.0.0.1"; + int port = (short)[defaults integerForKey:@"PacServer.ListenPort"]; + + return [NSString stringWithFormat:@"%@%@:%d%@",@"http://",address,port,routerPath]; +} + ++ (void)startPACServer:(NSString*) PACFilePath { + //接受参数为以后使用定制PAC文件 + + NSString * routerPath = @"/proxy.pac"; + [self stopPACServer]; webServer = [[GCDWebServer alloc] init]; - [webServer addHandlerForMethod:@"GET" path:routerPath requestClass:[GCDWebServerRequest class] processBlock:^GCDWebServerResponse *(GCDWebServerRequest *request) { - return [GCDWebServerDataResponse responseWithData: originalPACData contentType:@"application/x-ns-proxy-autoconfig"]; + [webServer addHandlerForMethod:@"GET" + path:routerPath + requestClass:[GCDWebServerRequest class] + processBlock:^GCDWebServerResponse *(GCDWebServerRequest *request) + { + NSLog(@"get proxy.pac"); + NSData* originalPACData = [NSData dataWithContentsOfFile:PACFilePath]; + GCDWebServerDataResponse* resp = [GCDWebServerDataResponse responseWithData:originalPACData + contentType:@"application/x-ns-proxy-autoconfig"]; + resp.cacheControlMaxAge = 0; + return resp; } ]; + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; - NSString * address = [defaults stringForKey:@"PacServer.ListenAddress"]; + int port = (short)[defaults integerForKey:@"PacServer.ListenPort"]; + [webServer startWithOptions:@{@"BindToLocalhost":@YES, @"Port":@(port)} error:nil]; - return [NSString stringWithFormat:@"%@%@:%d%@",@"http://",address,port,routerPath]; } + (void)stopPACServer { diff --git a/ShadowsocksX-NG/ProxyPreferencesController.swift b/ShadowsocksX-NG/ProxyPreferencesController.swift index 4c215d6..82bab46 100644 --- a/ShadowsocksX-NG/ProxyPreferencesController.swift +++ b/ShadowsocksX-NG/ProxyPreferencesController.swift @@ -37,7 +37,7 @@ class ProxyPreferencesController: NSWindowController, NSTableViewDataSource, NST } @IBAction func ok(_ sender: NSObject){ - ProxyConfHelper.disableProxy("hi") + ProxyConfHelper.disableProxy() let defaults = UserDefaults.standard defaults.setValue(selectedNetworkServices.allObjects, forKeyPath: "Proxy4NetworkServices")