diff --git a/Limelight/Network/DiscoveryManager.m b/Limelight/Network/DiscoveryManager.m index cec4fac1..5f275f1c 100644 --- a/Limelight/Network/DiscoveryManager.m +++ b/Limelight/Network/DiscoveryManager.m @@ -50,7 +50,7 @@ - (void) discoverHost:(NSString *)hostAddress withCallback:(void (^)(TemporaryHost *, NSString*))callback { HttpManager* hMan = [[HttpManager alloc] initWithHost:hostAddress uniqueId:_uniqueId deviceName:deviceName cert:_cert]; ServerInfoResponse* serverInfoResponse = [[ServerInfoResponse alloc] init]; - [hMan executeRequestSynchronously:[HttpRequest requestForResponse:serverInfoResponse withUrlRequest:[hMan newServerInfoRequest] fallbackError:401 fallbackRequest:[hMan newHttpServerInfoRequest]]]; + [hMan executeRequestSynchronously:[HttpRequest requestForResponse:serverInfoResponse withUrlRequest:[hMan newServerInfoRequest:false] fallbackError:401 fallbackRequest:[hMan newHttpServerInfoRequest]]]; TemporaryHost* host = nil; if ([serverInfoResponse isStatusOk]) { diff --git a/Limelight/Network/DiscoveryWorker.m b/Limelight/Network/DiscoveryWorker.m index 696584d2..9c4e5e9f 100644 --- a/Limelight/Network/DiscoveryWorker.m +++ b/Limelight/Network/DiscoveryWorker.m @@ -48,12 +48,12 @@ static const float POLL_RATE = 2.0f; // Poll every 2 seconds if (_host.localAddress != nil) { [array addObject:_host.localAddress]; } - if (_host.externalAddress != nil) { - [array addObject:_host.externalAddress]; - } if (_host.address != nil) { [array addObject:_host.address]; } + if (_host.externalAddress != nil) { + [array addObject:_host.externalAddress]; + } // Remove duplicate addresses from the list. // This is done using an array rather than a set @@ -88,8 +88,8 @@ static const float POLL_RATE = 2.0f; // Poll every 2 seconds Log(LOG_D, @"%@ has %d unique addresses", _host.name, [addresses count]); - // Give the PC 3 tries to respond before declaring it offline - for (int i = 0; i < 3; i++) { + // Give the PC 2 tries to respond before declaring it offline + for (int i = 0; i < 2; i++) { for (NSString *address in addresses) { if (self.cancelled) { // Get out without updating the status because @@ -134,7 +134,7 @@ static const float POLL_RATE = 2.0f; // Poll every 2 seconds cert:_cert]; ServerInfoResponse* response = [[ServerInfoResponse alloc] init]; [hMan executeRequestSynchronously:[HttpRequest requestForResponse:response - withUrlRequest:[hMan newServerInfoRequest] + withUrlRequest:[hMan newServerInfoRequest:true] fallbackError:401 fallbackRequest:[hMan newHttpServerInfoRequest]]]; return response; } diff --git a/Limelight/Network/HttpManager.h b/Limelight/Network/HttpManager.h index 873db767..3299c38f 100644 --- a/Limelight/Network/HttpManager.h +++ b/Limelight/Network/HttpManager.h @@ -20,7 +20,7 @@ - (NSURLRequest*) newClientSecretRespRequest:(NSString*)clientPairSecret; - (NSURLRequest*) newPairChallenge; - (NSURLRequest*) newAppListRequest; -- (NSURLRequest*) newServerInfoRequest; +- (NSURLRequest*) newServerInfoRequest:(bool)fastFail; - (NSURLRequest*) newHttpServerInfoRequest; - (NSURLRequest*) newLaunchRequest:(StreamConfiguration*)config; - (NSURLRequest*) newResumeRequest:(StreamConfiguration*)config; diff --git a/Limelight/Network/HttpManager.m b/Limelight/Network/HttpManager.m index 630e2423..eca83873 100644 --- a/Limelight/Network/HttpManager.m +++ b/Limelight/Network/HttpManager.m @@ -14,6 +14,11 @@ #include #include +#define SHORT_TIMEOUT_SEC 2 +#define NORMAL_TIMEOUT_SEC 5 +#define LONG_TIMEOUT_SEC 60 +#define EXTRA_LONG_TIMEOUT_SEC 180 + @implementation HttpManager { NSURLSession* _urlSession; NSString* _baseHTTPURL; @@ -104,17 +109,10 @@ static const NSString* HTTPS_PORT = @"47984"; _errorOccurred = false; } -- (NSURLRequest*) createRequestFromString:(NSString*) urlString enableTimeout:(BOOL)normalTimeout { +- (NSURLRequest*) createRequestFromString:(NSString*) urlString timeout:(int)timeout { NSURL* url = [[NSURL alloc] initWithString:urlString]; NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:url]; - if (normalTimeout) { - // Timeout the request after 4 seconds - [request setTimeoutInterval:4]; - } - else { - // Timeout the request after 60 seconds - [request setTimeoutInterval:60]; - } + [request setTimeoutInterval:timeout]; return request; } @@ -122,49 +120,49 @@ static const NSString* HTTPS_PORT = @"47984"; NSString* urlString = [NSString stringWithFormat:@"%@/pair?uniqueid=%@&devicename=%@&updateState=1&phrase=getservercert&salt=%@&clientcert=%@", _baseHTTPSURL, _uniqueId, _deviceName, [self bytesToHex:salt], [self bytesToHex:_cert]]; // This call blocks while waiting for the user to input the PIN on the PC - return [self createRequestFromString:urlString enableTimeout:FALSE]; + return [self createRequestFromString:urlString timeout:EXTRA_LONG_TIMEOUT_SEC]; } - (NSURLRequest*) newUnpairRequest { NSString* urlString = [NSString stringWithFormat:@"%@/unpair?uniqueid=%@", _baseHTTPSURL, _uniqueId]; - return [self createRequestFromString:urlString enableTimeout:TRUE]; + return [self createRequestFromString:urlString timeout:NORMAL_TIMEOUT_SEC]; } - (NSURLRequest*) newChallengeRequest:(NSData*)challenge { NSString* urlString = [NSString stringWithFormat:@"%@/pair?uniqueid=%@&devicename=%@&updateState=1&clientchallenge=%@", _baseHTTPSURL, _uniqueId, _deviceName, [self bytesToHex:challenge]]; - return [self createRequestFromString:urlString enableTimeout:TRUE]; + return [self createRequestFromString:urlString timeout:NORMAL_TIMEOUT_SEC]; } - (NSURLRequest*) newChallengeRespRequest:(NSData*)challengeResp { NSString* urlString = [NSString stringWithFormat:@"%@/pair?uniqueid=%@&devicename=%@&updateState=1&serverchallengeresp=%@", _baseHTTPSURL, _uniqueId, _deviceName, [self bytesToHex:challengeResp]]; - return [self createRequestFromString:urlString enableTimeout:TRUE]; + return [self createRequestFromString:urlString timeout:NORMAL_TIMEOUT_SEC]; } - (NSURLRequest*) newClientSecretRespRequest:(NSString*)clientPairSecret { NSString* urlString = [NSString stringWithFormat:@"%@/pair?uniqueid=%@&devicename=%@&updateState=1&clientpairingsecret=%@", _baseHTTPSURL, _uniqueId, _deviceName, clientPairSecret]; - return [self createRequestFromString:urlString enableTimeout:TRUE]; + return [self createRequestFromString:urlString timeout:NORMAL_TIMEOUT_SEC]; } - (NSURLRequest*) newPairChallenge { NSString* urlString = [NSString stringWithFormat:@"%@/pair?uniqueid=%@&devicename=%@&updateState=1&phrase=pairchallenge", _baseHTTPSURL, _uniqueId, _deviceName]; - return [self createRequestFromString:urlString enableTimeout:TRUE]; + return [self createRequestFromString:urlString timeout:NORMAL_TIMEOUT_SEC]; } - (NSURLRequest *)newAppListRequest { NSString* urlString = [NSString stringWithFormat:@"%@/applist?uniqueid=%@", _baseHTTPSURL, _uniqueId]; - return [self createRequestFromString:urlString enableTimeout:TRUE]; + return [self createRequestFromString:urlString timeout:NORMAL_TIMEOUT_SEC]; } -- (NSURLRequest *)newServerInfoRequest { +- (NSURLRequest *)newServerInfoRequest:(bool)fastFail { NSString* urlString = [NSString stringWithFormat:@"%@/serverinfo?uniqueid=%@", _baseHTTPSURL, _uniqueId]; - return [self createRequestFromString:urlString enableTimeout:TRUE]; + return [self createRequestFromString:urlString timeout:(fastFail ? SHORT_TIMEOUT_SEC : NORMAL_TIMEOUT_SEC)]; } - (NSURLRequest *)newHttpServerInfoRequest { NSString* urlString = [NSString stringWithFormat:@"%@/serverinfo", _baseHTTPURL]; - return [self createRequestFromString:urlString enableTimeout:TRUE]; + return [self createRequestFromString:urlString timeout:NORMAL_TIMEOUT_SEC]; } - (NSURLRequest*) newLaunchRequest:(StreamConfiguration*)config { @@ -180,7 +178,7 @@ static const NSString* HTTPS_PORT = @"47984"; config.gamepadMask, config.gamepadMask]; Log(LOG_I, @"Requesting: %@", urlString); // This blocks while the app is launching - return [self createRequestFromString:urlString enableTimeout:FALSE]; + return [self createRequestFromString:urlString timeout:LONG_TIMEOUT_SEC]; } - (NSURLRequest*) newResumeRequest:(StreamConfiguration*)config { @@ -190,17 +188,17 @@ static const NSString* HTTPS_PORT = @"47984"; (config.audioChannelMask << 16) | config.audioChannelCount]; Log(LOG_I, @"Requesting: %@", urlString); // This blocks while the app is resuming - return [self createRequestFromString:urlString enableTimeout:FALSE]; + return [self createRequestFromString:urlString timeout:LONG_TIMEOUT_SEC]; } - (NSURLRequest*) newQuitAppRequest { NSString* urlString = [NSString stringWithFormat:@"%@/cancel?uniqueid=%@", _baseHTTPSURL, _uniqueId]; - return [self createRequestFromString:urlString enableTimeout:FALSE]; + return [self createRequestFromString:urlString timeout:LONG_TIMEOUT_SEC]; } - (NSURLRequest*) newAppAssetRequestWithAppId:(NSString *)appId { NSString* urlString = [NSString stringWithFormat:@"%@/appasset?uniqueid=%@&appid=%@&AssetType=2&AssetIdx=0", _baseHTTPSURL, _uniqueId, appId]; - return [self createRequestFromString:urlString enableTimeout:FALSE]; + return [self createRequestFromString:urlString timeout:NORMAL_TIMEOUT_SEC]; } - (NSString*) bytesToHex:(NSData*)data { diff --git a/Limelight/Network/PairManager.m b/Limelight/Network/PairManager.m index 13193a6b..6a55a26d 100644 --- a/Limelight/Network/PairManager.m +++ b/Limelight/Network/PairManager.m @@ -31,7 +31,7 @@ - (void) main { ServerInfoResponse* serverInfoResp = [[ServerInfoResponse alloc] init]; - [_httpManager executeRequestSynchronously:[HttpRequest requestForResponse:serverInfoResp withUrlRequest:[_httpManager newServerInfoRequest] + [_httpManager executeRequestSynchronously:[HttpRequest requestForResponse:serverInfoResp withUrlRequest:[_httpManager newServerInfoRequest:false] fallbackError:401 fallbackRequest:[_httpManager newHttpServerInfoRequest]]]; if (serverInfoResp == nil) { [_callback pairFailed:@"Unable to connect to PC"]; diff --git a/Limelight/Stream/StreamManager.m b/Limelight/Stream/StreamManager.m index b28a45d0..48f14acc 100644 --- a/Limelight/Stream/StreamManager.m +++ b/Limelight/Stream/StreamManager.m @@ -46,7 +46,7 @@ cert:cert]; ServerInfoResponse* serverInfoResp = [[ServerInfoResponse alloc] init]; - [hMan executeRequestSynchronously:[HttpRequest requestForResponse:serverInfoResp withUrlRequest:[hMan newServerInfoRequest] + [hMan executeRequestSynchronously:[HttpRequest requestForResponse:serverInfoResp withUrlRequest:[hMan newServerInfoRequest:false] fallbackError:401 fallbackRequest:[hMan newHttpServerInfoRequest]]]; NSString* pairStatus = [serverInfoResp getStringTag:@"PairStatus"]; NSString* appversion = [serverInfoResp getStringTag:@"appversion"]; diff --git a/Limelight/ViewControllers/MainFrameViewController.m b/Limelight/ViewControllers/MainFrameViewController.m index ddff762b..a2a5cb16 100644 --- a/Limelight/ViewControllers/MainFrameViewController.m +++ b/Limelight/ViewControllers/MainFrameViewController.m @@ -309,7 +309,7 @@ static NSMutableSet* hostList; // Exempt this host from discovery while handling the serverinfo request [self->_discMan removeHostFromDiscovery:host]; - [hMan executeRequestSynchronously:[HttpRequest requestForResponse:serverInfoResp withUrlRequest:[hMan newServerInfoRequest] + [hMan executeRequestSynchronously:[HttpRequest requestForResponse:serverInfoResp withUrlRequest:[hMan newServerInfoRequest:false] fallbackError:401 fallbackRequest:[hMan newHttpServerInfoRequest]]]; [self->_discMan addHostToDiscovery:host]; @@ -536,7 +536,7 @@ static NSMutableSet* hostList; [hMan executeRequestSynchronously:quitRequest]; if (quitResponse.statusCode == 200) { ServerInfoResponse* serverInfoResp = [[ServerInfoResponse alloc] init]; - [hMan executeRequestSynchronously:[HttpRequest requestForResponse:serverInfoResp withUrlRequest:[hMan newServerInfoRequest] + [hMan executeRequestSynchronously:[HttpRequest requestForResponse:serverInfoResp withUrlRequest:[hMan newServerInfoRequest:false] fallbackError:401 fallbackRequest:[hMan newHttpServerInfoRequest]]]; if (![serverInfoResp isStatusOk] || [[serverInfoResp getStringTag:@"state"] hasSuffix:@"_SERVER_BUSY"]) { // On newer GFE versions, the quit request succeeds even though the app doesn't