Ben Copsey

Start work on new concurrent ASIHTTPRequest :)

... ... @@ -312,6 +312,8 @@ extern unsigned long const ASIWWANBandwidthThrottleAmount;
// This only affects credentials stored in the session cache when useSessionPersistance is YES. Credentials from the keychain are never presented unless the server asks for them
// Default is YES
BOOL shouldPresentCredentialsBeforeChallenge;
BOOL isSynchronous;
}
#pragma mark init / dealloc
... ... @@ -353,14 +355,17 @@ extern unsigned long const ASIWWANBandwidthThrottleAmount;
#pragma mark running a request
// Run a request asynchronously by adding it to the global queue
// (Use [request start] for a synchronous request)
- (void)startAsynchronous;
// For an asynchronous request in the current thread, use [request start]
// Run a request asynchronously in the background by adding it to the global queue, where it will run in its own thread
- (void)startInBackgroundThread;
// Run a request synchronously in the current thread
- (void)startSynchronous;
#pragma mark request logic
// Main request loop is in here
- (void)loadRequest;
#pragma mark request logic
// Start the read stream. Called by loadRequest, and again to restart the request when authentication is needed
- (void)startRequest;
... ... @@ -639,4 +644,7 @@ extern unsigned long const ASIWWANBandwidthThrottleAmount;
@property (assign, readonly) int proxyAuthenticationRetryCount;
@property (assign) BOOL haveBuiltRequestHeaders;
@property (assign, nonatomic) BOOL haveBuiltPostBody;
@property (assign, readonly) BOOL isSynchronous;
@end
... ...
This diff is collapsed. Click to expand it.
... ... @@ -39,7 +39,7 @@
[request setPostValue:d forKey:@"post_var2"];
[request setPostValue:v forKey:@"post_var3"];
[request setFile:path forKey:@"file"];
[request start];
[request startSynchronous];
BOOL success = ([[request responseString] isEqualToString:[NSString stringWithFormat:@"post_var: %@\r\npost_var2: %@\r\npost_var3: %@\r\nfile_name: %@\r\nfile_size: %hu\r\ncontent_type: %@",@"foo",d,v,@"bigfile",size,@"application/octet-stream"]]);
GHAssertTrue(success,@"Failed to upload the correct data (using local file)");
... ... @@ -50,7 +50,7 @@
[request setPostValue:d forKey:@"post_var2"];
[request setPostValue:v forKey:@"post_var3"];
[request setData:data forKey:@"file"];
[request start];
[request startSynchronous];
success = ([[request responseString] isEqualToString:[NSString stringWithFormat:@"post_var: %@\r\npost_var2: %@\r\npost_var3: %@\r\nfile_name: %@\r\nfile_size: %hu\r\ncontent_type: %@",@"foo",d,v,@"file",size,@"application/octet-stream"]]);
GHAssertTrue(success,@"Failed to upload the correct data (using NSData)");
... ... @@ -61,7 +61,7 @@
[request setPostValue:d forKey:@"post_var2"];
[request setPostValue:v forKey:@"post_var3"];
[request setFile:path withFileName:@"myfile" andContentType:@"text/plain" forKey:@"file"];
[request start];
[request startSynchronous];
success = ([[request responseString] isEqualToString:[NSString stringWithFormat:@"post_var: %@\r\npost_var2: %@\r\npost_var3: %@\r\nfile_name: %@\r\nfile_size: %hu\r\ncontent_type: %@",@"foo",d,v,@"myfile",size,@"text/plain"]]);
GHAssertTrue(success,@"Failed to send the correct content-type / file name");
... ... @@ -72,7 +72,7 @@
[request setPostValue:d forKey:@"post_var2"];
[request setPostValue:v forKey:@"post_var3"];
[request setData:data withFileName:@"myfile" andContentType:@"text/plain" forKey:@"file"];
[request start];
[request startSynchronous];
success = ([[request responseString] isEqualToString:[NSString stringWithFormat:@"post_var: %@\r\npost_var2: %@\r\npost_var3: %@\r\nfile_name: %@\r\nfile_size: %hu\r\ncontent_type: %@",@"foo",d,v,@"myfile",size,@"text/plain"]]);
GHAssertTrue(success,@"Failed to send the correct content-type / file name");
... ... @@ -88,7 +88,7 @@
[request setPostValue:@"there" forKey:@"xxx_non_empty_string"];
[request setShouldStreamPostDataFromDisk:YES];
[request buildPostBody];
[request start];
[request startSynchronous];
BOOL success = ([[request responseString] isEqualToString:@"a_non_empty_string: hello\r\nzzz_empty_string: \r\nxxx_non_empty_string: there"]);
GHAssertTrue(success,@"Failed to send the correct post data");
... ... @@ -114,7 +114,7 @@
[request setShouldStreamPostDataFromDisk:YES];
[request setPostFormat:ASIURLEncodedPostFormat];
[request start];
[request startSynchronous];
BOOL success = ([[request responseString] isEqualToString:@"value1: value1\r\nvalue2: (%20 ? =)\r\nvalue3: £100.00\r\nvalue4: \r\nteskey&aa: &??aaa=//ciaoèèè"]);
... ... @@ -130,7 +130,7 @@
NSString *charset = @"utf-8";
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
[request setPostValue:testString forKey:@"value"];
[request start];
[request startSynchronous];
BOOL success = ([[request responseString] isEqualToString:[NSString stringWithFormat:@"Got data in %@: %@",charset,testString]]);
GHAssertTrue(success,@"Failed to correctly encode the data");
... ... @@ -138,7 +138,7 @@
request = [ASIFormDataRequest requestWithURL:url];
[request setPostValue:testString forKey:@"value"];
[request setPostFormat:ASIMultipartFormDataPostFormat];
[request start];
[request startSynchronous];
success = ([[request responseString] isEqualToString:[NSString stringWithFormat:@"Got data in %@: %@",charset,testString]]);
GHAssertTrue(success,@"Failed to correctly encode the data");
... ... @@ -148,7 +148,7 @@
request = [ASIFormDataRequest requestWithURL:url];
[request setPostValue:testString forKey:@"value"];
[request setStringEncoding:NSISOLatin1StringEncoding];
[request start];
[request startSynchronous];
success = ([[request responseString] isEqualToString:[NSString stringWithFormat:@"Got data in %@: %@",charset,testString]]);
GHAssertTrue(success,@"Failed to correctly encode the data");
... ... @@ -157,7 +157,7 @@
[request setPostValue:testString forKey:@"value"];
[request setPostFormat:ASIMultipartFormDataPostFormat];
[request setStringEncoding:NSISOLatin1StringEncoding];
[request start];
[request startSynchronous];
success = ([[request responseString] isEqualToString:[NSString stringWithFormat:@"Got data in %@: %@",charset,testString]]);
GHAssertTrue(success,@"Failed to correctly encode the data");
... ... @@ -166,7 +166,7 @@
request = [ASIFormDataRequest requestWithURL:url];
[request setPostValue:testString forKey:@"value"];
[request setStringEncoding:NSWindowsCP1252StringEncoding];
[request start];
[request startSynchronous];
success = ([[request responseString] isEqualToString:[NSString stringWithFormat:@"Got data in %@: %@",charset,testString]]);
GHAssertTrue(success,@"Failed to correctly encode the data");
... ... @@ -174,7 +174,7 @@
[request setPostValue:testString forKey:@"value"];
[request setPostFormat:ASIMultipartFormDataPostFormat];
[request setStringEncoding:NSWindowsCP1252StringEncoding];
[request start];
[request startSynchronous];
success = ([[request responseString] isEqualToString:[NSString stringWithFormat:@"Got data in %@: %@",charset,testString]]);
GHAssertTrue(success,@"Failed to correctly encode the data");
... ...
This diff is collapsed. Click to expand it.
... ... @@ -118,7 +118,7 @@ static NSString *bucket = @"";
[request setDateString:dateString];
[request setSecretAccessKey:exampleSecretAccessKey];
[request setAccessKey:exampleAccessKey];
[request start];
[request startSynchronous];
GHAssertNotNil([request error],@"Failed to generate an error when the request was not correctly signed");
BOOL success = ([[request error] code] == ASIS3ResponseErrorType);
... ... @@ -147,7 +147,7 @@ static NSString *bucket = @"";
ASIS3Request *request = [ASIS3Request PUTRequestForFile:filePath withBucket:bucket path:path];
[request setSecretAccessKey:secretAccessKey];
[request setAccessKey:accessKey];
[request start];
[request startSynchronous];
success = [[request responseString] isEqualToString:@""];
GHAssertTrue(success,@"Failed to PUT a file to S3");
... ... @@ -155,7 +155,7 @@ static NSString *bucket = @"";
request = [ASIS3Request requestWithBucket:bucket path:path];
[request setSecretAccessKey:secretAccessKey];
[request setAccessKey:accessKey];
[request start];
[request startSynchronous];
success = [[request responseString] isEqualToString:@"This is my content"];
GHAssertTrue(success,@"Failed to GET the correct data from S3");
... ... @@ -163,14 +163,14 @@ static NSString *bucket = @"";
request = [ASIS3Request COPYRequestFromBucket:bucket path:path toBucket:bucket path:@"/test-copy"];
[request setSecretAccessKey:secretAccessKey];
[request setAccessKey:accessKey];
[request start];
[request startSynchronous];
GHAssertNil([request error],@"Failed to COPY a file");
// GET the copy
request = [ASIS3Request requestWithBucket:bucket path:@"/test-copy"];
[request setSecretAccessKey:secretAccessKey];
[request setAccessKey:accessKey];
[request start];
[request startSynchronous];
success = [[request responseString] isEqualToString:@"This is my content"];
GHAssertTrue(success,@"Failed to GET the correct data from S3");
... ... @@ -179,7 +179,7 @@ static NSString *bucket = @"";
request = [ASIS3Request HEADRequestWithBucket:bucket path:@"/test-copy"];
[request setSecretAccessKey:secretAccessKey];
[request setAccessKey:accessKey];
[request start];
[request startSynchronous];
success = [[request responseString] isEqualToString:@""];
GHAssertTrue(success,@"Got a response body for a HEAD request");
... ... @@ -188,7 +188,7 @@ static NSString *bucket = @"";
[listRequest setPrefix:@"test"];
[listRequest setSecretAccessKey:secretAccessKey];
[listRequest setAccessKey:accessKey];
[listRequest start];
[listRequest startSynchronous];
GHAssertNil([listRequest error],@"Failed to download a list from S3");
success = [[listRequest bucketObjects] count];
GHAssertTrue(success,@"The file didn't show up in the list");
... ... @@ -198,7 +198,7 @@ static NSString *bucket = @"";
[request setSecretAccessKey:secretAccessKey];
[request setRequestMethod:@"DELETE"];
[request setAccessKey:accessKey];
[request start];
[request startSynchronous];
success = [[request responseString] isEqualToString:@""];
GHAssertTrue(success,@"Failed to DELETE the file from S3");
... ... @@ -207,7 +207,7 @@ static NSString *bucket = @"";
[request setSecretAccessKey:secretAccessKey];
[request setRequestMethod:@"DELETE"];
[request setAccessKey:accessKey];
[request start];
[request startSynchronous];
success = [[request responseString] isEqualToString:@""];
GHAssertTrue(success,@"Failed to DELETE the copy from S3");
... ... @@ -215,7 +215,7 @@ static NSString *bucket = @"";
request = [ASIS3Request COPYRequestFromBucket:bucket path:path toBucket:bucket path:@"/test-copy"];
[request setSecretAccessKey:secretAccessKey];
[request setAccessKey:accessKey];
[request start];
[request startSynchronous];
GHAssertNotNil([request error],@"Failed generate an error for what should have been a failed COPY");
success = [[[request error] localizedDescription] isEqualToString:@"The specified key does not exist."];
... ... @@ -243,7 +243,7 @@ static NSString *bucket = @"";
[request setAccessKey:accessKey];
[request setShouldCompressRequestBody:YES];
[request setAccessPolicy:ASIS3AccessPolicyPublicRead]; // We'll make it public
[request start];
[request startSynchronous];
success = [[request responseString] isEqualToString:@""];
GHAssertTrue(success,@"Failed to PUT the gzipped file");
... ... @@ -251,7 +251,7 @@ static NSString *bucket = @"";
request = [ASIS3Request requestWithBucket:bucket path:path];
[request setSecretAccessKey:secretAccessKey];
[request setAccessKey:accessKey];
[request start];
[request startSynchronous];
success = [[request responseString] isEqualToString:text];
GHAssertTrue(success,@"Failed to GET the correct data from S3");
... ... @@ -283,7 +283,7 @@ static NSString *bucket = @"";
ASIS3Request *request = [ASIS3Request PUTRequestForFile:filePath withBucket:bucket path:path];
[request setSecretAccessKey:secretAccessKey];
[request setAccessKey:accessKey];
[request start];
[request startSynchronous];
GHAssertNil([request error],@"Give up on list request test - failed to upload a file");
}
... ... @@ -292,7 +292,7 @@ static NSString *bucket = @"";
[listRequest setPrefix:@"test-file"];
[listRequest setSecretAccessKey:secretAccessKey];
[listRequest setAccessKey:accessKey];
[listRequest start];
[listRequest startSynchronous];
GHAssertNil([listRequest error],@"Failed to download a list from S3");
success = ([[listRequest bucketObjects] count] == 5);
GHAssertTrue(success,@"List did not contain all files");
... ... @@ -354,7 +354,7 @@ static NSString *bucket = @"";
[listRequest setPrefix:@"test-file"];
[listRequest setSecretAccessKey:secretAccessKey];
[listRequest setAccessKey:accessKey];
[listRequest start];
[listRequest startSynchronous];
GHAssertNil([listRequest error],@"Failed to download a list from S3");
success = ([[listRequest bucketObjects] count] == 0);
GHAssertTrue(success,@"List contained files that should have been deleted");
... ...
... ... @@ -52,7 +52,7 @@ IMPORTANT
[[self cancelRequest] setDownloadProgressDelegate:self];
[[self cancelRequest] setShowAccurateProgress:YES];
NSLog(@"Stress test: Start request %@",[self cancelRequest]);
[[self cancelRequest] startAsynchronous];
[[self cancelRequest] startInBackgroundThread];
}
}
... ... @@ -77,7 +77,7 @@ IMPORTANT
[self setCancelRequest:[ASIHTTPRequest requestWithURL:[NSURL URLWithString:@"http://127.0.0.1/ASIHTTPRequest/tests/one_infinite_loop"]]];
if ([[self cancelStartDate] timeIntervalSinceNow] > 0) {
NSLog(@"Redirect stress test: Start request %@",[self cancelRequest]);
[[self cancelRequest] startAsynchronous];
[[self cancelRequest] startInBackgroundThread];
[self performSelector:@selector(cancelRedirectRequest) withObject:nil afterDelay:0.2];
}
[createRequestLock unlock];
... ... @@ -114,7 +114,7 @@ IMPORTANT
[[self cancelRequest] setDelegate:delegate];
[[self cancelRequest] setShowAccurateProgress:YES];
NSLog(@"Set delegate stress test: Start request %@",[self cancelRequest]);
[[self cancelRequest] startAsynchronous];
[[self cancelRequest] startInBackgroundThread];
[self performSelectorInBackground:@selector(cancelSetDelegateRequest) withObject:nil];
}
[createRequestLock unlock];
... ...
... ... @@ -37,6 +37,8 @@
IBOutlet NSButton *resumeButton;
IBOutlet NSTextField *bandwidthUsed;
ASIHTTPRequest *bigFetchRequest;
}
- (IBAction)simpleURLFetch:(id)sender;
... ... @@ -54,4 +56,5 @@
- (IBAction)throttleBandwidth:(id)sender;
@property (assign, nonatomic) ASIHTTPRequest *bigFetchRequest;
@end
... ...
... ... @@ -30,11 +30,12 @@
- (IBAction)simpleURLFetch:(id)sender
{
ASIHTTPRequest *request = [[[ASIHTTPRequest alloc] initWithURL:[NSURL URLWithString:@"http://allseeing-i.com/"]] autorelease];
ASIHTTPRequest *request = [[[ASIHTTPRequest alloc] initWithURL:[NSURL URLWithString:@"http://allseeing-i.com/ASIHTTPRequest/tests/the_great_american_novel_%28abridged%29.txt"]] autorelease];
//Customise our user agent, for no real reason
[request addRequestHeader:@"User-Agent" value:@"ASIHTTPRequest"];
[request start];
[request setDelegate:self];
[request startSynchronous];
if ([request error]) {
[htmlSource setString:[[request error] localizedDescription]];
} else if ([request responseString]) {
... ... @@ -42,6 +43,11 @@
}
}
- (void)requestFinished:(ASIHTTPRequest *)request
{
[htmlSource setString:[request responseString]];
}
- (IBAction)URLFetchWithProgress:(id)sender
{
... ... @@ -61,7 +67,8 @@
{
[startButton setTitle:@"Start"];
[startButton setAction:@selector(URLFetchWithProgress:)];
[networkQueue cancelAllOperations];
[[self bigFetchRequest] cancel];
[self setBigFetchRequest:nil];
[resumeButton setEnabled:YES];
}
... ... @@ -71,18 +78,16 @@
[startButton setTitle:@"Stop"];
[startButton setAction:@selector(stopURLFetchWithProgress:)];
// Stop any other requests
[networkQueue cancelAllOperations];
[networkQueue setShowAccurateProgress:YES];
[networkQueue setDownloadProgressDelegate:progressIndicator];
[networkQueue setDelegate:self];
[networkQueue setRequestDidFinishSelector:@selector(URLFetchWithProgressComplete:)];
ASIHTTPRequest *request = [[[ASIHTTPRequest alloc] initWithURL:[NSURL URLWithString:@"http://trails-network.net/Downloads/MemexTrails_1.0b1.zip"]] autorelease];
[request setDownloadDestinationPath:[[[[NSBundle mainBundle] bundlePath] stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"MemexTrails_1.0b1.zip"]];
[request setTemporaryFileDownloadPath:[[[[NSBundle mainBundle] bundlePath] stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"MemexTrails_1.0b1.zip.download"]];
[request setAllowResumeForFileDownloads:YES];
[networkQueue addOperation:request];
[networkQueue go];
[self setBigFetchRequest:[[[ASIHTTPRequest alloc] initWithURL:[NSURL URLWithString:@"http://trails-network.net/Downloads/MemexTrails_1.0b1.zip"]] autorelease]];
[[self bigFetchRequest] setDownloadDestinationPath:[[[[NSBundle mainBundle] bundlePath] stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"MemexTrails_1.0b1.zip"]];
[[self bigFetchRequest] setTemporaryFileDownloadPath:[[[[NSBundle mainBundle] bundlePath] stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"MemexTrails_1.0b1.zip.download"]];
[[self bigFetchRequest] setAllowResumeForFileDownloads:YES];
[[self bigFetchRequest] setDidFinishSelector:@selector(URLFetchWithProgressComplete:)];
[[self bigFetchRequest] setDownloadProgressDelegate:progressIndicator];
[[self bigFetchRequest] start];
}
- (void)URLFetchWithProgressComplete:(ASIHTTPRequest *)request
... ... @@ -279,5 +284,5 @@
}
@synthesize bigFetchRequest;
@end
... ...