mirror of
https://github.com/rickyzhang82/tethering.git
synced 2024-10-06 01:37:18 +03:00
Add Http server to host socks.pac file.
This commit is contained in:
parent
98e6535bc3
commit
5b14721623
@ -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;
|
||||
|
@ -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;
|
||||
|
||||
}
|
||||
|
||||
|
@ -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."];
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user