Ben Copsey

Added timeout support

@@ -122,7 +122,10 @@ @@ -122,7 +122,10 @@
122 //Called on the delegate when the request fails 122 //Called on the delegate when the request fails
123 SEL didFailSelector; 123 SEL didFailSelector;
124 124
  125 + //Used for recording when something last happened during the request, we will compare this value with the current date to time out requests when appropriate
  126 + NSDate *lastActivityTime;
125 127
  128 + NSTimeInterval timeOutSeconds;
126 } 129 }
127 130
128 #pragma mark init / dealloc 131 #pragma mark init / dealloc
@@ -254,5 +257,6 @@ @@ -254,5 +257,6 @@
254 @property (retain) NSDictionary *requestCredentials; 257 @property (retain) NSDictionary *requestCredentials;
255 @property (assign) int responseStatusCode; 258 @property (assign) int responseStatusCode;
256 @property (retain) NSMutableData *receivedData; 259 @property (retain) NSMutableData *receivedData;
257 - 260 +@property (retain) NSDate *lastActivityTime;
  261 +@property (assign) NSTimeInterval timeOutSeconds;
258 @end 262 @end
@@ -51,6 +51,7 @@ static void ReadStreamClientCallBack(CFReadStreamRef readStream, CFStreamEventTy @@ -51,6 +51,7 @@ static void ReadStreamClientCallBack(CFReadStreamRef readStream, CFStreamEventTy
51 //credentials = NULL; 51 //credentials = NULL;
52 request = NULL; 52 request = NULL;
53 responseHeaders = nil; 53 responseHeaders = nil;
  54 + [self setTimeOutSeconds:30];
54 [self setUseKeychainPersistance:NO]; 55 [self setUseKeychainPersistance:NO];
55 [self setUseSessionPersistance:YES]; 56 [self setUseSessionPersistance:YES];
56 [self setUseCookiePersistance:YES]; 57 [self setUseCookiePersistance:YES];
@@ -83,6 +84,7 @@ static void ReadStreamClientCallBack(CFReadStreamRef readStream, CFStreamEventTy @@ -83,6 +84,7 @@ static void ReadStreamClientCallBack(CFReadStreamRef readStream, CFStreamEventTy
83 [authenticationRealm release]; 84 [authenticationRealm release];
84 [url release]; 85 [url release];
85 [authenticationLock release]; 86 [authenticationLock release];
  87 + [lastActivityTime release];
86 [super dealloc]; 88 [super dealloc];
87 } 89 }
88 90
@@ -304,11 +306,23 @@ static void ReadStreamClientCallBack(CFReadStreamRef readStream, CFStreamEventTy @@ -304,11 +306,23 @@ static void ReadStreamClientCallBack(CFReadStreamRef readStream, CFStreamEventTy
304 [self performSelectorOnMainThread:@selector(resetUploadProgress:) withObject:[NSNumber numberWithDouble:postLength] waitUntilDone:YES]; 306 [self performSelectorOnMainThread:@selector(resetUploadProgress:) withObject:[NSNumber numberWithDouble:postLength] waitUntilDone:YES];
305 } 307 }
306 308
  309 + //Record when the request started, so we can timeout if nothing happens
  310 + [self setLastActivityTime:[[NSDate new] autorelease]];
307 311
308 // Wait for the request to finish 312 // Wait for the request to finish
309 NSDate* endDate = [NSDate distantFuture]; 313 NSDate* endDate = [NSDate distantFuture];
310 while (!complete) { 314 while (!complete) {
311 315
  316 + //See if we need to timeout
  317 + if (lastActivityTime && timeOutSeconds > 0) {
  318 + if ([[[NSDate new] autorelease] timeIntervalSinceDate:lastActivityTime] > timeOutSeconds) {
  319 + [self failWithProblem:@"Request timed out"];
  320 + [self cancelLoad];
  321 + complete = YES;
  322 + break;
  323 + }
  324 + }
  325 +
312 // See if our NSOperationQueue told us to cancel 326 // See if our NSOperationQueue told us to cancel
313 if ([self isCancelled]) { 327 if ([self isCancelled]) {
314 [self failWithProblem:@"The request was cancelled"]; 328 [self failWithProblem:@"The request was cancelled"];
@@ -366,6 +380,8 @@ static void ReadStreamClientCallBack(CFReadStreamRef readStream, CFStreamEventTy @@ -366,6 +380,8 @@ static void ReadStreamClientCallBack(CFReadStreamRef readStream, CFStreamEventTy
366 380
367 - (void)updateUploadProgress 381 - (void)updateUploadProgress
368 { 382 {
  383 + [self setLastActivityTime:[[NSDate new] autorelease]];
  384 +
369 double byteCount = [[(NSNumber *)CFReadStreamCopyProperty (readStream, kCFStreamPropertyHTTPRequestBytesWrittenCount) autorelease] doubleValue]; 385 double byteCount = [[(NSNumber *)CFReadStreamCopyProperty (readStream, kCFStreamPropertyHTTPRequestBytesWrittenCount) autorelease] doubleValue];
370 if (uploadProgressDelegate) { 386 if (uploadProgressDelegate) {
371 [uploadProgressDelegate incrementBy:byteCount-lastBytesSent]; 387 [uploadProgressDelegate incrementBy:byteCount-lastBytesSent];
@@ -385,6 +401,8 @@ static void ReadStreamClientCallBack(CFReadStreamRef readStream, CFStreamEventTy @@ -385,6 +401,8 @@ static void ReadStreamClientCallBack(CFReadStreamRef readStream, CFStreamEventTy
385 401
386 - (void)updateDownloadProgress 402 - (void)updateDownloadProgress
387 { 403 {
  404 + [self setLastActivityTime:[[NSDate new] autorelease]];
  405 +
388 //We won't update downlaod progress until we've examined the headers, since we might need to authenticate 406 //We won't update downlaod progress until we've examined the headers, since we might need to authenticate
389 if (downloadProgressDelegate && responseHeaders) { 407 if (downloadProgressDelegate && responseHeaders) {
390 [downloadProgressDelegate incrementBy:totalBytesRead-lastBytesRead]; 408 [downloadProgressDelegate incrementBy:totalBytesRead-lastBytesRead];
@@ -586,6 +604,7 @@ static void ReadStreamClientCallBack(CFReadStreamRef readStream, CFStreamEventTy @@ -586,6 +604,7 @@ static void ReadStreamClientCallBack(CFReadStreamRef readStream, CFStreamEventTy
586 // check for bad credentials, so we can give the delegate a chance to replace them 604 // check for bad credentials, so we can give the delegate a chance to replace them
587 if (err.domain == kCFStreamErrorDomainHTTP && (err.error == kCFStreamErrorHTTPAuthenticationBadUserName || err.error == kCFStreamErrorHTTPAuthenticationBadPassword)) { 605 if (err.domain == kCFStreamErrorDomainHTTP && (err.error == kCFStreamErrorHTTPAuthenticationBadUserName || err.error == kCFStreamErrorHTTPAuthenticationBadPassword)) {
588 ignoreError = YES; 606 ignoreError = YES;
  607 + [self setLastActivityTime:nil];
589 if ([delegate respondsToSelector:@selector(authorizationNeededForRequest:)]) { 608 if ([delegate respondsToSelector:@selector(authorizationNeededForRequest:)]) {
590 [delegate performSelectorOnMainThread:@selector(authorizationNeededForRequest:) withObject:self waitUntilDone:YES]; 609 [delegate performSelectorOnMainThread:@selector(authorizationNeededForRequest:) withObject:self waitUntilDone:YES];
591 [authenticationLock lockWhenCondition:2]; 610 [authenticationLock lockWhenCondition:2];
@@ -863,4 +882,6 @@ static void ReadStreamClientCallBack(CFReadStreamRef readStream, CFStreamEventTy @@ -863,4 +882,6 @@ static void ReadStreamClientCallBack(CFReadStreamRef readStream, CFStreamEventTy
863 @synthesize requestCredentials; 882 @synthesize requestCredentials;
864 @synthesize responseStatusCode; 883 @synthesize responseStatusCode;
865 @synthesize receivedData; 884 @synthesize receivedData;
  885 +@synthesize lastActivityTime;
  886 +@synthesize timeOutSeconds;
866 @end 887 @end
@@ -13,6 +13,7 @@ @@ -13,6 +13,7 @@
13 } 13 }
14 14
15 - (void)testBasicDownload; 15 - (void)testBasicDownload;
  16 +- (void)testTimeOut;
16 - (void)testOperationQueue; 17 - (void)testOperationQueue;
17 - (void)testCookies; 18 - (void)testCookies;
18 @end 19 @end
@@ -58,6 +58,20 @@ More tests needed for: @@ -58,6 +58,20 @@ More tests needed for:
58 STAssertNotNil(error,@"Failed to generate an error for a bad host - this test may fail when your DNS server redirects you to another page when it can't find a domain name (eg OpenDNS)"); 58 STAssertNotNil(error,@"Failed to generate an error for a bad host - this test may fail when your DNS server redirects you to another page when it can't find a domain name (eg OpenDNS)");
59 } 59 }
60 60
  61 +- (void)testTimeOut
  62 +{
  63 + //Grab data
  64 + NSURL *url = [[[NSURL alloc] initWithString:@"http://allseeing-i.com"] autorelease];
  65 + ASIHTTPRequest *request = [[[ASIHTTPRequest alloc] initWithURL:url] autorelease];
  66 + [request setTimeOutSeconds:0.0001]; //It's pretty unlikely we will be able to grab the data this quickly, so the request should timeout
  67 + [request start];
  68 + NSError *error = [request error];
  69 + STAssertNotNil(error,@"Request didn't timeout");
  70 + BOOL success = [[[error userInfo] valueForKey:@"Description"] isEqualToString:@"Request timed out"];
  71 + STAssertTrue(success,@"Timeout didn't generate the correct error");
  72 +
  73 +}
  74 +
61 - (void)testOperationQueue 75 - (void)testOperationQueue
62 { 76 {
63 NSOperationQueue *queue = [[[NSOperationQueue alloc] init] autorelease]; 77 NSOperationQueue *queue = [[[NSOperationQueue alloc] init] autorelease];
@@ -40,4 +40,5 @@ @@ -40,4 +40,5 @@
40 - (IBAction)fetchTopSecretInformation:(id)sender; 40 - (IBAction)fetchTopSecretInformation:(id)sender;
41 41
42 - (IBAction)postWithProgress:(id)sender; 42 - (IBAction)postWithProgress:(id)sender;
  43 +
43 @end 44 @end
@@ -304,7 +304,7 @@ @@ -304,7 +304,7 @@
304 <real>312</real> 304 <real>312</real>
305 </array> 305 </array>
306 <key>RubberWindowFrame</key> 306 <key>RubberWindowFrame</key>
307 - <string>268 202 1432 976 0 0 1920 1178 </string> 307 + <string>227 156 1432 976 0 0 1920 1178 </string>
308 </dict> 308 </dict>
309 <key>Module</key> 309 <key>Module</key>
310 <string>PBXSmartGroupTreeModule</string> 310 <string>PBXSmartGroupTreeModule</string>
@@ -334,7 +334,7 @@ @@ -334,7 +334,7 @@
334 <key>_historyCapacity</key> 334 <key>_historyCapacity</key>
335 <integer>0</integer> 335 <integer>0</integer>
336 <key>bookmark</key> 336 <key>bookmark</key>
337 - <string>B5CF37A50E7A97750050CBA7</string> 337 + <string>B5B297070E7BCA3D000B04CD</string>
338 <key>history</key> 338 <key>history</key>
339 <array> 339 <array>
340 <string>B5731B8B0E4310180008024F</string> 340 <string>B5731B8B0E4310180008024F</string>
@@ -346,15 +346,15 @@ @@ -346,15 +346,15 @@
346 <string>B567EF5D0E4EE4FC001E238F</string> 346 <string>B567EF5D0E4EE4FC001E238F</string>
347 <string>B500B54C0E635A3200744D82</string> 347 <string>B500B54C0E635A3200744D82</string>
348 <string>B5CF35640E7A7B2C0050CBA7</string> 348 <string>B5CF35640E7A7B2C0050CBA7</string>
349 - <string>B5CF36FC0E7A8C380050CBA7</string> 349 + <string>B5B2969F0E7BC6C7000B04CD</string>
350 - <string>B5CF36FE0E7A8C380050CBA7</string> 350 + <string>B5B296A10E7BC6C7000B04CD</string>
351 - <string>B5CF36FF0E7A8C380050CBA7</string> 351 + <string>B5B296BB0E7BC7E3000B04CD</string>
352 - <string>B5CF37000E7A8C380050CBA7</string> 352 + <string>B5B296BC0E7BC7E3000B04CD</string>
353 - <string>B5CF37010E7A8C380050CBA7</string> 353 + <string>B5B296CC0E7BC846000B04CD</string>
354 - <string>B5CF37120E7A8C7F0050CBA7</string> 354 + <string>B5B296FF0E7BCA3D000B04CD</string>
355 - <string>B5CF379A0E7A974D0050CBA7</string> 355 + <string>B5B297000E7BCA3D000B04CD</string>
356 - <string>B5CF379B0E7A974D0050CBA7</string> 356 + <string>B5B297010E7BCA3D000B04CD</string>
357 - <string>B5CF37850E7A96B90050CBA7</string> 357 + <string>B5B297020E7BCA3D000B04CD</string>
358 </array> 358 </array>
359 <key>prevStack</key> 359 <key>prevStack</key>
360 <array> 360 <array>
@@ -375,101 +375,43 @@ @@ -375,101 +375,43 @@
375 <string>B567EF630E4EE4FC001E238F</string> 375 <string>B567EF630E4EE4FC001E238F</string>
376 <string>B5B3BC690E62DA0E0071D39F</string> 376 <string>B5B3BC690E62DA0E0071D39F</string>
377 <string>B5B3BC6C0E62DA0E0071D39F</string> 377 <string>B5B3BC6C0E62DA0E0071D39F</string>
378 - <string>B5CF35450E7A73EC0050CBA7</string>  
379 - <string>B5CF35460E7A73EC0050CBA7</string>  
380 - <string>B5CF35470E7A73EC0050CBA7</string>  
381 - <string>B5CF35680E7A7B2C0050CBA7</string>  
382 - <string>B5CF35690E7A7B2C0050CBA7</string>  
383 - <string>B5CF356A0E7A7B2C0050CBA7</string>  
384 - <string>B5CF356B0E7A7B2C0050CBA7</string>  
385 - <string>B5CF356C0E7A7B2C0050CBA7</string>  
386 <string>B5CF356D0E7A7B2C0050CBA7</string> 378 <string>B5CF356D0E7A7B2C0050CBA7</string>
387 - <string>B5CF356F0E7A7B2C0050CBA7</string> 379 + <string>B5B296A40E7BC6C7000B04CD</string>
388 - <string>B5CF35700E7A7B2C0050CBA7</string> 380 + <string>B5B296A50E7BC6C7000B04CD</string>
389 - <string>B5CF357D0E7A7C790050CBA7</string> 381 + <string>B5B296A60E7BC6C7000B04CD</string>
390 - <string>B5CF358E0E7A7F470050CBA7</string> 382 + <string>B5B296A70E7BC6C7000B04CD</string>
391 - <string>B5CF35A90E7A84A00050CBA7</string> 383 + <string>B5B296A80E7BC6C7000B04CD</string>
392 - <string>B5CF35AA0E7A84A00050CBA7</string> 384 + <string>B5B296A90E7BC6C7000B04CD</string>
393 - <string>B5CF35AB0E7A84A00050CBA7</string> 385 + <string>B5B296AA0E7BC6C7000B04CD</string>
394 - <string>B5CF35AC0E7A84A00050CBA7</string> 386 + <string>B5B296AB0E7BC6C7000B04CD</string>
395 - <string>B5CF35AD0E7A84A00050CBA7</string> 387 + <string>B5B296AC0E7BC6C7000B04CD</string>
396 - <string>B5CF35AE0E7A84A00050CBA7</string> 388 + <string>B5B296AD0E7BC6C7000B04CD</string>
397 - <string>B5CF35AF0E7A84A00050CBA7</string> 389 + <string>B5B296AE0E7BC6C7000B04CD</string>
398 - <string>B5CF35B00E7A84A00050CBA7</string> 390 + <string>B5B296AF0E7BC6C7000B04CD</string>
399 - <string>B5CF35B10E7A84A00050CBA7</string> 391 + <string>B5B296B00E7BC6C7000B04CD</string>
400 - <string>B5CF35B20E7A84A00050CBA7</string> 392 + <string>B5B296B10E7BC6C7000B04CD</string>
401 - <string>B5CF35B30E7A84A00050CBA7</string> 393 + <string>B5B296B20E7BC6C7000B04CD</string>
402 - <string>B5CF35B40E7A84A00050CBA7</string> 394 + <string>B5B296BF0E7BC7E3000B04CD</string>
403 - <string>B5CF35B50E7A84A00050CBA7</string> 395 + <string>B5B296C00E7BC7E3000B04CD</string>
404 - <string>B5CF35B60E7A84A00050CBA7</string> 396 + <string>B5B296C10E7BC7E3000B04CD</string>
405 - <string>B5CF35B70E7A84A00050CBA7</string> 397 + <string>B5B296C20E7BC7E3000B04CD</string>
406 - <string>B5CF35B80E7A84A00050CBA7</string> 398 + <string>B5B296C30E7BC7E3000B04CD</string>
407 - <string>B5CF35B90E7A84A00050CBA7</string> 399 + <string>B5B296C40E7BC7E3000B04CD</string>
408 - <string>B5CF35CC0E7A85360050CBA7</string> 400 + <string>B5B296CF0E7BC846000B04CD</string>
409 - <string>B5CF35CD0E7A85360050CBA7</string> 401 + <string>B5B296D00E7BC846000B04CD</string>
410 - <string>B5CF35CE0E7A85360050CBA7</string> 402 + <string>B5B296D10E7BC846000B04CD</string>
411 - <string>B5CF35E20E7A85A50050CBA7</string> 403 + <string>B5B296D20E7BC846000B04CD</string>
412 - <string>B5CF35EC0E7A85E00050CBA7</string> 404 + <string>B5B296E00E7BC8BA000B04CD</string>
413 - <string>B5CF36770E7A88A60050CBA7</string> 405 + <string>B5B296E10E7BC8BA000B04CD</string>
414 - <string>B5CF36780E7A88A60050CBA7</string> 406 + <string>B5B296E20E7BC8BA000B04CD</string>
415 - <string>B5CF36790E7A88A60050CBA7</string> 407 + <string>B5B296E30E7BC8BA000B04CD</string>
416 - <string>B5CF367A0E7A88A60050CBA7</string> 408 + <string>B5B296E40E7BC8BA000B04CD</string>
417 - <string>B5CF367B0E7A88A60050CBA7</string> 409 + <string>B5B296EC0E7BC92D000B04CD</string>
418 - <string>B5CF367C0E7A88A60050CBA7</string> 410 + <string>B5B296ED0E7BC92D000B04CD</string>
419 - <string>B5CF367D0E7A88A60050CBA7</string> 411 + <string>B5B297030E7BCA3D000B04CD</string>
420 - <string>B5CF367E0E7A88A60050CBA7</string> 412 + <string>B5B297040E7BCA3D000B04CD</string>
421 - <string>B5CF367F0E7A88A60050CBA7</string> 413 + <string>B5B297050E7BCA3D000B04CD</string>
422 - <string>B5CF36800E7A88A60050CBA7</string> 414 + <string>B5B297060E7BCA3D000B04CD</string>
423 - <string>B5CF36810E7A88A60050CBA7</string>  
424 - <string>B5CF36820E7A88A60050CBA7</string>  
425 - <string>B5CF36830E7A88A60050CBA7</string>  
426 - <string>B5CF36840E7A88A60050CBA7</string>  
427 - <string>B5CF36850E7A88A60050CBA7</string>  
428 - <string>B5CF36860E7A88A60050CBA7</string>  
429 - <string>B5CF36870E7A88A60050CBA7</string>  
430 - <string>B5CF36880E7A88A60050CBA7</string>  
431 - <string>B5CF36890E7A88A60050CBA7</string>  
432 - <string>B5CF368A0E7A88A60050CBA7</string>  
433 - <string>B5CF368B0E7A88A60050CBA7</string>  
434 - <string>B5CF368C0E7A88A60050CBA7</string>  
435 - <string>B5CF368D0E7A88A60050CBA7</string>  
436 - <string>B5CF368E0E7A88A60050CBA7</string>  
437 - <string>B5CF368F0E7A88A60050CBA7</string>  
438 - <string>B5CF36900E7A88A60050CBA7</string>  
439 - <string>B5CF36910E7A88A60050CBA7</string>  
440 - <string>B5CF36BE0E7A89F10050CBA7</string>  
441 - <string>B5CF36BF0E7A89F10050CBA7</string>  
442 - <string>B5CF36C80E7A8A610050CBA7</string>  
443 - <string>B5CF36EC0E7A8B440050CBA7</string>  
444 - <string>B5CF37030E7A8C380050CBA7</string>  
445 - <string>B5CF37040E7A8C380050CBA7</string>  
446 - <string>B5CF37050E7A8C380050CBA7</string>  
447 - <string>B5CF37060E7A8C380050CBA7</string>  
448 - <string>B5CF37070E7A8C380050CBA7</string>  
449 - <string>B5CF37080E7A8C380050CBA7</string>  
450 - <string>B5CF37090E7A8C380050CBA7</string>  
451 - <string>B5CF370A0E7A8C380050CBA7</string>  
452 - <string>B5CF370B0E7A8C380050CBA7</string>  
453 - <string>B5CF370C0E7A8C380050CBA7</string>  
454 - <string>B5CF370D0E7A8C380050CBA7</string>  
455 - <string>B5CF370E0E7A8C380050CBA7</string>  
456 - <string>B5CF37130E7A8C7F0050CBA7</string>  
457 - <string>B5CF37140E7A8C7F0050CBA7</string>  
458 - <string>B5CF37150E7A8C7F0050CBA7</string>  
459 - <string>B5CF37430E7A90E10050CBA7</string>  
460 - <string>B5CF374F0E7A93560050CBA7</string>  
461 - <string>B5CF37500E7A93560050CBA7</string>  
462 - <string>B5CF37510E7A93560050CBA7</string>  
463 - <string>B5CF37520E7A93560050CBA7</string>  
464 - <string>B5CF37530E7A93560050CBA7</string>  
465 - <string>B5CF377B0E7A95600050CBA7</string>  
466 - <string>B5CF377C0E7A95600050CBA7</string>  
467 - <string>B5CF377D0E7A95600050CBA7</string>  
468 - <string>B5CF37870E7A96B90050CBA7</string>  
469 - <string>B5CF37880E7A96B90050CBA7</string>  
470 - <string>B5CF379C0E7A974D0050CBA7</string>  
471 - <string>B5CF379D0E7A974D0050CBA7</string>  
472 - <string>B5CF379E0E7A974D0050CBA7</string>  
473 </array> 415 </array>
474 </dict> 416 </dict>
475 <key>SplitCount</key> 417 <key>SplitCount</key>
@@ -483,7 +425,7 @@ @@ -483,7 +425,7 @@
483 <key>Frame</key> 425 <key>Frame</key>
484 <string>{{0, 0}, {1098, 836}}</string> 426 <string>{{0, 0}, {1098, 836}}</string>
485 <key>RubberWindowFrame</key> 427 <key>RubberWindowFrame</key>
486 - <string>268 202 1432 976 0 0 1920 1178 </string> 428 + <string>227 156 1432 976 0 0 1920 1178 </string>
487 </dict> 429 </dict>
488 <key>Module</key> 430 <key>Module</key>
489 <string>PBXNavigatorGroup</string> 431 <string>PBXNavigatorGroup</string>
@@ -503,7 +445,7 @@ @@ -503,7 +445,7 @@
503 <key>Frame</key> 445 <key>Frame</key>
504 <string>{{0, 841}, {1098, 94}}</string> 446 <string>{{0, 841}, {1098, 94}}</string>
505 <key>RubberWindowFrame</key> 447 <key>RubberWindowFrame</key>
506 - <string>268 202 1432 976 0 0 1920 1178 </string> 448 + <string>227 156 1432 976 0 0 1920 1178 </string>
507 </dict> 449 </dict>
508 <key>Module</key> 450 <key>Module</key>
509 <string>XCDetailModule</string> 451 <string>XCDetailModule</string>
@@ -527,9 +469,9 @@ @@ -527,9 +469,9 @@
527 </array> 469 </array>
528 <key>TableOfContents</key> 470 <key>TableOfContents</key>
529 <array> 471 <array>
530 - <string>B5CF35490E7A73EC0050CBA7</string> 472 + <string>B5B296B40E7BC6C7000B04CD</string>
531 <string>1CE0B1FE06471DED0097A5F4</string> 473 <string>1CE0B1FE06471DED0097A5F4</string>
532 - <string>B5CF354A0E7A73EC0050CBA7</string> 474 + <string>B5B296B50E7BC6C7000B04CD</string>
533 <string>1CE0B20306471E060097A5F4</string> 475 <string>1CE0B20306471E060097A5F4</string>
534 <string>1CE0B20506471E060097A5F4</string> 476 <string>1CE0B20506471E060097A5F4</string>
535 </array> 477 </array>
@@ -663,16 +605,15 @@ @@ -663,16 +605,15 @@
663 <integer>5</integer> 605 <integer>5</integer>
664 <key>WindowOrderList</key> 606 <key>WindowOrderList</key>
665 <array> 607 <array>
666 - <string>1C530D57069F1CE1000CFCEE</string> 608 + <string>B5B296C70E7BC7E3000B04CD</string>
667 - <string>B5CF35540E7A73EC0050CBA7</string> 609 + <string>B5B296C80E7BC7E3000B04CD</string>
668 - <string>B5CF35550E7A73EC0050CBA7</string>  
669 <string>B5ABC8410E24CDE70072F422</string> 610 <string>B5ABC8410E24CDE70072F422</string>
670 <string>1CD10A99069EF8BA00B06720</string> 611 <string>1CD10A99069EF8BA00B06720</string>
671 - <string>1C78EAAD065D492600B07095</string>  
672 <string>/Users/ben/asi-http-request/asi-http-request.xcodeproj</string> 612 <string>/Users/ben/asi-http-request/asi-http-request.xcodeproj</string>
  613 + <string>1C78EAAD065D492600B07095</string>
673 </array> 614 </array>
674 <key>WindowString</key> 615 <key>WindowString</key>
675 - <string>268 202 1432 976 0 0 1920 1178 </string> 616 + <string>227 156 1432 976 0 0 1920 1178 </string>
676 <key>WindowToolsV3</key> 617 <key>WindowToolsV3</key>
677 <array> 618 <array>
678 <dict> 619 <dict>
@@ -688,8 +629,6 @@ @@ -688,8 +629,6 @@
688 <key>Dock</key> 629 <key>Dock</key>
689 <array> 630 <array>
690 <dict> 631 <dict>
691 - <key>BecomeActive</key>  
692 - <true/>  
693 <key>ContentConfiguration</key> 632 <key>ContentConfiguration</key>
694 <dict> 633 <dict>
695 <key>PBXProjectModuleGUID</key> 634 <key>PBXProjectModuleGUID</key>
@@ -704,7 +643,7 @@ @@ -704,7 +643,7 @@
704 <key>Frame</key> 643 <key>Frame</key>
705 <string>{{0, 0}, {1279, 533}}</string> 644 <string>{{0, 0}, {1279, 533}}</string>
706 <key>RubberWindowFrame</key> 645 <key>RubberWindowFrame</key>
707 - <string>329 218 1279 815 0 0 1920 1178 </string> 646 + <string>205 95 1279 815 0 0 1920 1178 </string>
708 </dict> 647 </dict>
709 <key>Module</key> 648 <key>Module</key>
710 <string>PBXNavigatorGroup</string> 649 <string>PBXNavigatorGroup</string>
@@ -712,6 +651,8 @@ @@ -712,6 +651,8 @@
712 <string>533pt</string> 651 <string>533pt</string>
713 </dict> 652 </dict>
714 <dict> 653 <dict>
  654 + <key>BecomeActive</key>
  655 + <true/>
715 <key>ContentConfiguration</key> 656 <key>ContentConfiguration</key>
716 <dict> 657 <dict>
717 <key>PBXProjectModuleGUID</key> 658 <key>PBXProjectModuleGUID</key>
@@ -728,7 +669,7 @@ @@ -728,7 +669,7 @@
728 <key>Frame</key> 669 <key>Frame</key>
729 <string>{{0, 538}, {1279, 236}}</string> 670 <string>{{0, 538}, {1279, 236}}</string>
730 <key>RubberWindowFrame</key> 671 <key>RubberWindowFrame</key>
731 - <string>329 218 1279 815 0 0 1920 1178 </string> 672 + <string>205 95 1279 815 0 0 1920 1178 </string>
732 </dict> 673 </dict>
733 <key>Module</key> 674 <key>Module</key>
734 <string>PBXBuildResultsModule</string> 675 <string>PBXBuildResultsModule</string>
@@ -751,18 +692,18 @@ @@ -751,18 +692,18 @@
751 <key>TableOfContents</key> 692 <key>TableOfContents</key>
752 <array> 693 <array>
753 <string>B5ABC8410E24CDE70072F422</string> 694 <string>B5ABC8410E24CDE70072F422</string>
754 - <string>B5CF354B0E7A73EC0050CBA7</string> 695 + <string>B5B2969B0E7BC6B2000B04CD</string>
755 <string>1CD0528F0623707200166675</string> 696 <string>1CD0528F0623707200166675</string>
756 <string>XCMainBuildResultsModuleGUID</string> 697 <string>XCMainBuildResultsModuleGUID</string>
757 </array> 698 </array>
758 <key>ToolbarConfiguration</key> 699 <key>ToolbarConfiguration</key>
759 <string>xcode.toolbar.config.buildV3</string> 700 <string>xcode.toolbar.config.buildV3</string>
760 <key>WindowString</key> 701 <key>WindowString</key>
761 - <string>329 218 1279 815 0 0 1920 1178 </string> 702 + <string>205 95 1279 815 0 0 1920 1178 </string>
762 <key>WindowToolGUID</key> 703 <key>WindowToolGUID</key>
763 <string>B5ABC8410E24CDE70072F422</string> 704 <string>B5ABC8410E24CDE70072F422</string>
764 <key>WindowToolIsVisible</key> 705 <key>WindowToolIsVisible</key>
765 - <false/> 706 + <true/>
766 </dict> 707 </dict>
767 <dict> 708 <dict>
768 <key>FirstTimeWindowDisplayed</key> 709 <key>FirstTimeWindowDisplayed</key>
@@ -793,8 +734,8 @@ @@ -793,8 +734,8 @@
793 <string>yes</string> 734 <string>yes</string>
794 <key>sizes</key> 735 <key>sizes</key>
795 <array> 736 <array>
796 - <string>{{0, 0}, {684, 398}}</string> 737 + <string>{{0, 0}, {684, 397}}</string>
797 - <string>{{684, 0}, {817, 398}}</string> 738 + <string>{{684, 0}, {817, 397}}</string>
798 </array> 739 </array>
799 </dict> 740 </dict>
800 <key>VerticalSplitView</key> 741 <key>VerticalSplitView</key>
@@ -809,8 +750,8 @@ @@ -809,8 +750,8 @@
809 <string>yes</string> 750 <string>yes</string>
810 <key>sizes</key> 751 <key>sizes</key>
811 <array> 752 <array>
812 - <string>{{0, 0}, {1501, 398}}</string> 753 + <string>{{0, 0}, {1501, 397}}</string>
813 - <string>{{0, 398}, {1501, 347}}</string> 754 + <string>{{0, 397}, {1501, 348}}</string>
814 </array> 755 </array>
815 </dict> 756 </dict>
816 </dict> 757 </dict>
@@ -837,20 +778,18 @@ @@ -837,20 +778,18 @@
837 <array> 778 <array>
838 <string>Name</string> 779 <string>Name</string>
839 <real>151</real> 780 <real>151</real>
840 - <string>Type</string>  
841 - <real>84</real>  
842 <string>Value</string> 781 <string>Value</string>
843 <real>85</real> 782 <real>85</real>
844 <string>Summary</string> 783 <string>Summary</string>
845 <real>590</real> 784 <real>590</real>
846 </array> 785 </array>
847 <key>Frame</key> 786 <key>Frame</key>
848 - <string>{{684, 0}, {817, 398}}</string> 787 + <string>{{684, 0}, {817, 397}}</string>
849 <key>RubberWindowFrame</key> 788 <key>RubberWindowFrame</key>
850 - <string>283 223 1501 786 0 0 1920 1178 </string> 789 + <string>63 130 1501 786 0 0 1920 1178 </string>
851 </dict> 790 </dict>
852 <key>RubberWindowFrame</key> 791 <key>RubberWindowFrame</key>
853 - <string>283 223 1501 786 0 0 1920 1178 </string> 792 + <string>63 130 1501 786 0 0 1920 1178 </string>
854 </dict> 793 </dict>
855 <key>Module</key> 794 <key>Module</key>
856 <string>PBXDebugSessionModule</string> 795 <string>PBXDebugSessionModule</string>
@@ -873,18 +812,18 @@ @@ -873,18 +812,18 @@
873 <key>TableOfContents</key> 812 <key>TableOfContents</key>
874 <array> 813 <array>
875 <string>1CD10A99069EF8BA00B06720</string> 814 <string>1CD10A99069EF8BA00B06720</string>
876 - <string>B5CF354C0E7A73EC0050CBA7</string> 815 + <string>B5B2968F0E7BC60E000B04CD</string>
877 <string>1C162984064C10D400B95A72</string> 816 <string>1C162984064C10D400B95A72</string>
878 - <string>B5CF354D0E7A73EC0050CBA7</string> 817 + <string>B5B296900E7BC60E000B04CD</string>
879 - <string>B5CF354E0E7A73EC0050CBA7</string> 818 + <string>B5B296910E7BC60E000B04CD</string>
880 - <string>B5CF354F0E7A73EC0050CBA7</string> 819 + <string>B5B296920E7BC60E000B04CD</string>
881 - <string>B5CF35500E7A73EC0050CBA7</string> 820 + <string>B5B296930E7BC60E000B04CD</string>
882 - <string>B5CF35510E7A73EC0050CBA7</string> 821 + <string>B5B296940E7BC60E000B04CD</string>
883 </array> 822 </array>
884 <key>ToolbarConfiguration</key> 823 <key>ToolbarConfiguration</key>
885 <string>xcode.toolbar.config.debugV3</string> 824 <string>xcode.toolbar.config.debugV3</string>
886 <key>WindowString</key> 825 <key>WindowString</key>
887 - <string>283 223 1501 786 0 0 1920 1178 </string> 826 + <string>63 130 1501 786 0 0 1920 1178 </string>
888 <key>WindowToolGUID</key> 827 <key>WindowToolGUID</key>
889 <string>1CD10A99069EF8BA00B06720</string> 828 <string>1CD10A99069EF8BA00B06720</string>
890 <key>WindowToolIsVisible</key> 829 <key>WindowToolIsVisible</key>
@@ -1035,7 +974,7 @@ @@ -1035,7 +974,7 @@
1035 <key>TableOfContents</key> 974 <key>TableOfContents</key>
1036 <array> 975 <array>
1037 <string>1C78EAAD065D492600B07095</string> 976 <string>1C78EAAD065D492600B07095</string>
1038 - <string>B5CF35520E7A73EC0050CBA7</string> 977 + <string>B5B296B60E7BC6C7000B04CD</string>
1039 <string>1C78EAAC065D492600B07095</string> 978 <string>1C78EAAC065D492600B07095</string>
1040 </array> 979 </array>
1041 <key>ToolbarConfiguration</key> 980 <key>ToolbarConfiguration</key>
This diff could not be displayed because it is too large.