Add Http server to host socks.pac file.

This commit is contained in:
Ricky Zhang 2015-08-12 20:45:27 -04:00
parent 98e6535bc3
commit 5b14721623
No known key found for this signature in database
GPG Key ID: 681AFAEF6CDEDB4C
7 changed files with 67 additions and 36 deletions

View File

@ -373,7 +373,7 @@
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = SocksProxy_Prefix.pch;
INFOPLIST_FILE = Resources/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 8.1;
IPHONEOS_DEPLOYMENT_TARGET = 8.4;
OTHER_CFLAGS = "-DDEBUG";
PRODUCT_NAME = Tethering;
PROVISIONING_PROFILE = "";
@ -393,7 +393,7 @@
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = SocksProxy_Prefix.pch;
INFOPLIST_FILE = Resources/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 8.1;
IPHONEOS_DEPLOYMENT_TARGET = 8.4;
ONLY_ACTIVE_ARCH = YES;
OTHER_CFLAGS = "";
PRODUCT_NAME = Tethering;

View File

@ -22,7 +22,7 @@
#import <UIKit/UIKit.h>
#import "SocksProxy.h"
#import "HTTPServer.h"
#include "ttdnsd.h"
//Max concurrent coonections
#define MAX_CONNECTIONS 100
@ -51,6 +51,7 @@
NSInteger currentOpenConnections;
NSInteger currentConnectionCount;
DNSServer * _DNSServer;
HTTPServer * _HTTPServer;
}

View File

@ -465,16 +465,26 @@ static void AcceptCallback(CFSocketRef s, CFSocketCallBackType type, CFDataRef a
[self _stopServer:nil];
_DNSServer = DNSServer::getInstance();
_DNSServer->stopDNSServer();
_HTTPServer = [HTTPServer sharedHTTPServerWithSocksProxyPort:currentPort];
[_HTTPServer stop];
} else {
if(self.currentAddress == nil)
self.currentAddress = [UIDevice localWiFiIPAddress];
if(currentAddress != nil){
//start socks proxy server
[self _startServer];
//start DNS server
_DNSServer = DNSServer::getInstance();
const char * ipv4Addr = [currentAddress cStringUsingEncoding:NSASCIIStringEncoding];
_DNSServer->startDNSServer(0, ipv4Addr);
//start HTTP server that advertise socks.pac
_HTTPServer = [HTTPServer sharedHTTPServerWithSocksProxyPort:currentPort];
HTTPServerState currentHTTPServerState = [_HTTPServer state] ;
if (currentHTTPServerState == SERVER_STATE_IDLE ||
currentHTTPServerState == SERVER_STATE_STOPPING)
[_HTTPServer start];
}else{
[self _updateStatus:@"Please connect to wifi."];

View File

@ -160,11 +160,11 @@ static NSMutableArray *registeredHandlers = nil;
server:(HTTPServer *)aServer
{
NSDictionary *requestHeaderFields =
(__bridge NSDictionary *)CFHTTPMessageCopyAllHeaderFields(aRequest);
(__bridge_transfer NSDictionary *)CFHTTPMessageCopyAllHeaderFields(aRequest);
NSURL *requestURL =
(__bridge NSURL *)CFHTTPMessageCopyRequestURL(aRequest);
(__bridge_transfer NSURL *)CFHTTPMessageCopyRequestURL(aRequest);
NSString *method =
(__bridge NSString *)CFHTTPMessageCopyRequestMethod(aRequest);
(__bridge_transfer NSString *)CFHTTPMessageCopyRequestMethod(aRequest);
Class classForRequest =
[self handlerClassForRequest:aRequest
@ -211,7 +211,7 @@ static NSMutableArray *registeredHandlers = nil;
self = [super init];
if (self != nil)
{
request = aRequest;
request = (CFHTTPMessageRef)CFRetain(aRequest);
requestMethod = method;
url = requestURL;
headerFields = requestHeaderFields;
@ -281,16 +281,7 @@ static NSMutableArray *registeredHandlers = nil;
- (NSString *)serverIPForRequest
{
int socket = [fileHandle fileDescriptor];
struct sockaddr_in address;
socklen_t address_len;
NSString *result = nil;
address_len = sizeof(address);
if (getsockname(socket, (struct sockaddr *)&address, &address_len) == 0) {
result = [NSString stringWithFormat:@"%s", inet_ntoa(address.sin_addr)];
}
return result;
return [UIDevice localWiFiIPAddress];
}
//
@ -320,7 +311,6 @@ static NSMutableArray *registeredHandlers = nil;
[fileHandle closeFile];
fileHandle = nil;
}
server = nil;
}
@ -379,7 +369,8 @@ static NSMutableArray *registeredHandlers = nil;
{
[self endResponse];
}
CFRelease(request);
request = nil;
requestMethod = nil;

View File

@ -43,9 +43,11 @@ static const int HTTP_SERVER_PORT = 8080;
@property (nonatomic, readonly, retain) NSError *lastError;
@property (readonly, assign) HTTPServerState state;
@property (readonly) UInt32 httpServerPort;
@property (nonatomic, readonly) UInt32 httpServerPort;
@property (nonatomic) NSInteger socksProxyPort;
+ (HTTPServer *)sharedHTTPServer;
+ (HTTPServer *)sharedHTTPServerWithSocksProxyPort: (NSInteger) socksProxyPort;
- (void)start;
- (void)stop;

View File

@ -12,10 +12,9 @@
// appreciated but not required.
//
// 08-11-2015 Remove ARC singleton template
// 08-11-2015 Add ARC support and remove singleton template
//
#import "HTTPServer.h"
#import "SynthesizeSingleton.h"
#import <sys/socket.h>
#import <netinet/in.h>
#if TARGET_OS_IPHONE
@ -53,6 +52,20 @@ NSString * const HTTPServerNotificationStateChanged = @"ServerNotificationStateC
return sharedHTTPServer;
}
+ (HTTPServer *)sharedHTTPServerWithSocksProxyPort: (NSInteger) socksProxyPort
{
static HTTPServer* sharedHTTPServerWithSocksProxyPort = nil;
@synchronized(self)
{
if (sharedHTTPServerWithSocksProxyPort == nil)
{
sharedHTTPServerWithSocksProxyPort = [[HTTPServer alloc] initWithSocksProxyPort:socksProxyPort];
}
}
return sharedHTTPServerWithSocksProxyPort;
}
//
// init
//
@ -73,9 +86,22 @@ NSString * const HTTPServerNotificationStateChanged = @"ServerNotificationStateC
return self;
}
- (id)initWithSocksProxyPort: (NSInteger)socksProxyPort
{
self = [super init];
if (self != nil)
{
self.state = SERVER_STATE_IDLE;
self.socksProxyPort = socksProxyPort;
responseHandlers = [[NSMutableSet alloc] init];
incomingRequests =[NSMutableDictionary dictionary];
}
return self;
}
-(void)startBonjourServices
{
netService = [[NSNetService alloc] initWithDomain:@"" type:@"_iproxyhttpserver._tcp." name:@"" port:self.httpServerPort];
netService = [[NSNetService alloc] initWithDomain:@"" type:@"_tetheringhttpserver._tcp." name:@"" port:self.httpServerPort];
netService.delegate = self;
[netService publish];
}
@ -178,6 +204,7 @@ NSString * const HTTPServerNotificationStateChanged = @"ServerNotificationStateC
(void *)&reuse, sizeof(int)) != 0)
{
[self errorWithName:@"Unable to set socket options."];
//TODO: log error with NSLogger
return;
}
@ -193,6 +220,8 @@ NSString * const HTTPServerNotificationStateChanged = @"ServerNotificationStateC
if (CFSocketSetAddress(socket, addressData) != kCFSocketSuccess)
{
[self errorWithName:@"Unable to bind socket to address."];
CFRelease(addressData);
//TODO: log error with NSLogger
return;
}
@ -209,6 +238,8 @@ NSString * const HTTPServerNotificationStateChanged = @"ServerNotificationStateC
self.state = SERVER_STATE_RUNNING;
[self startBonjourServices];
CFRelease(addressData);
}
//
@ -271,7 +302,9 @@ NSString * const HTTPServerNotificationStateChanged = @"ServerNotificationStateC
}
self.state = SERVER_STATE_IDLE;
[self stopBonjourServices];
}
//
@ -292,8 +325,8 @@ NSString * const HTTPServerNotificationStateChanged = @"ServerNotificationStateC
if(incomingFileHandle)
{
[incomingRequests setObject:(__bridge id)CFHTTPMessageCreateEmpty(kCFAllocatorDefault, TRUE)
forKey:incomingFileHandle];
[incomingRequests setObject:(__bridge_transfer id)CFHTTPMessageCreateEmpty(kCFAllocatorDefault, TRUE)
forKey:(id)incomingFileHandle];
[[NSNotificationCenter defaultCenter]
addObserver:self

View File

@ -64,16 +64,10 @@
NSString *requestPath = [url path];
if ([@"/http.pac" isEqualToString:requestPath] && currentIP) {
fileData = [[NSString stringWithFormat:
@"function FindProxyForURL(url, host) { return \"PROXY %@:%d\"; }",
currentIP, HTTP_PROXY_PORT] dataUsingEncoding:NSUTF8StringEncoding];
}
if ([@"/socks.pac" isEqualToString:requestPath] && currentIP) {
fileData = [[NSString stringWithFormat:
@"function FindProxyForURL(url, host) { return \"SOCKS %@:%d\"; }",
currentIP, SOCKS_PROXY_PORT] dataUsingEncoding:NSUTF8StringEncoding];
@"function FindProxyForURL(url, host) { return \"SOCKS %@:%ld\"; }",
currentIP, (long)server.socksProxyPort] dataUsingEncoding:NSUTF8StringEncoding];
}
if (fileData) {
@ -90,13 +84,13 @@
(CFStringRef)@"close");
CFHTTPMessageSetHeaderFieldValue(response,
(CFStringRef)@"Content-Length",
(CFStringRef)[NSString stringWithFormat:@"%ld", [fileData length]]);
(__bridge CFStringRef)[NSString stringWithFormat:@"%ld", (unsigned long)[fileData length]]);
CFDataRef headerData = CFHTTPMessageCopySerializedMessage(response);
@try
{
[fileHandle writeData:(NSData *)headerData];
[fileHandle writeData:(__bridge NSData *)headerData];
[fileHandle writeData:fileData];
}
@catch (NSException *exception)
@ -119,7 +113,7 @@
@try
{
[fileHandle writeData:(NSData *)headerData];
[fileHandle writeData:(__bridge NSData *)headerData];
}
@catch (NSException *exception)
{