Make gzipped file downloads work
Fix iphone sample to work with renamed properties
Showing
7 changed files
with
188 additions
and
23 deletions
@@ -15,7 +15,7 @@ | @@ -15,7 +15,7 @@ | ||
15 | #if TARGET_OS_IPHONE | 15 | #if TARGET_OS_IPHONE |
16 | #import <CFNetwork/CFNetwork.h> | 16 | #import <CFNetwork/CFNetwork.h> |
17 | #endif | 17 | #endif |
18 | -#import <zlib.h> | 18 | +#import <stdio.h> |
19 | 19 | ||
20 | typedef enum _ASINetworkErrorType { | 20 | typedef enum _ASINetworkErrorType { |
21 | ASIConnectionFailureErrorType = 1, | 21 | ASIConnectionFailureErrorType = 1, |
@@ -24,7 +24,8 @@ typedef enum _ASINetworkErrorType { | @@ -24,7 +24,8 @@ typedef enum _ASINetworkErrorType { | ||
24 | ASIRequestCancelledErrorType = 4, | 24 | ASIRequestCancelledErrorType = 4, |
25 | ASIUnableToCreateRequestErrorType = 5, | 25 | ASIUnableToCreateRequestErrorType = 5, |
26 | ASIInternalErrorWhileBuildingRequestType = 6, | 26 | ASIInternalErrorWhileBuildingRequestType = 6, |
27 | - ASIInternalErrorWhileApplyingCredentialsType = 7 | 27 | + ASIInternalErrorWhileApplyingCredentialsType = 7, |
28 | + ASIFileManagementError = 8 | ||
28 | 29 | ||
29 | } ASINetworkErrorType; | 30 | } ASINetworkErrorType; |
30 | 31 | ||
@@ -70,6 +71,9 @@ typedef enum _ASINetworkErrorType { | @@ -70,6 +71,9 @@ typedef enum _ASINetworkErrorType { | ||
70 | // If downloadDestinationPath is not set, download data will be stored in memory | 71 | // If downloadDestinationPath is not set, download data will be stored in memory |
71 | NSString *downloadDestinationPath; | 72 | NSString *downloadDestinationPath; |
72 | 73 | ||
74 | + //The location that files will be downloaded to. Once a download is complete, files will be decompressed (if necessary) and moved to downloadDestinationPath | ||
75 | + NSString *temporaryFileDownloadPath; | ||
76 | + | ||
73 | // Used for writing data to a file when downloadDestinationPath is set | 77 | // Used for writing data to a file when downloadDestinationPath is set |
74 | NSOutputStream *outputStream; | 78 | NSOutputStream *outputStream; |
75 | 79 | ||
@@ -195,6 +199,9 @@ typedef enum _ASINetworkErrorType { | @@ -195,6 +199,9 @@ typedef enum _ASINetworkErrorType { | ||
195 | // Response data, automatically uncompressed where appropriate | 199 | // Response data, automatically uncompressed where appropriate |
196 | - (NSData *)responseData; | 200 | - (NSData *)responseData; |
197 | 201 | ||
202 | +// Returns true if the response was gzip compressed | ||
203 | +- (BOOL)isResponseCompressed; | ||
204 | + | ||
198 | #pragma mark request logic | 205 | #pragma mark request logic |
199 | 206 | ||
200 | // Start loading the request | 207 | // Start loading the request |
@@ -284,6 +291,9 @@ typedef enum _ASINetworkErrorType { | @@ -284,6 +291,9 @@ typedef enum _ASINetworkErrorType { | ||
284 | // Uncompress gzipped data with zlib | 291 | // Uncompress gzipped data with zlib |
285 | + (NSData *)uncompressZippedData:(NSData*)compressedData; | 292 | + (NSData *)uncompressZippedData:(NSData*)compressedData; |
286 | 293 | ||
294 | +// Uncompress gzipped data from a file into another file, used when downloading to a file | ||
295 | ++ (int)uncompressZippedDataFromFile:(NSString *)sourcePath toFile:(NSString *)destinationPath; | ||
296 | ++ (int)uncompressZippedDataFromSource:(FILE *)source toDestination:(FILE *)dest; | ||
287 | 297 | ||
288 | @property (retain) NSString *username; | 298 | @property (retain) NSString *username; |
289 | @property (retain) NSString *password; | 299 | @property (retain) NSString *password; |
@@ -296,6 +306,7 @@ typedef enum _ASINetworkErrorType { | @@ -296,6 +306,7 @@ typedef enum _ASINetworkErrorType { | ||
296 | @property (assign) BOOL useKeychainPersistance; | 306 | @property (assign) BOOL useKeychainPersistance; |
297 | @property (assign) BOOL useSessionPersistance; | 307 | @property (assign) BOOL useSessionPersistance; |
298 | @property (retain) NSString *downloadDestinationPath; | 308 | @property (retain) NSString *downloadDestinationPath; |
309 | +@property (retain,readonly) NSString *temporaryFileDownloadPath; | ||
299 | @property (assign) SEL didFinishSelector; | 310 | @property (assign) SEL didFinishSelector; |
300 | @property (assign) SEL didFailSelector; | 311 | @property (assign) SEL didFailSelector; |
301 | @property (retain,readonly) NSString *authenticationRealm; | 312 | @property (retain,readonly) NSString *authenticationRealm; |
@@ -12,6 +12,7 @@ | @@ -12,6 +12,7 @@ | ||
12 | 12 | ||
13 | #import "ASIHTTPRequest.h" | 13 | #import "ASIHTTPRequest.h" |
14 | #import "NSHTTPCookieAdditions.h" | 14 | #import "NSHTTPCookieAdditions.h" |
15 | +#import <zlib.h> | ||
15 | 16 | ||
16 | // We use our own custom run loop mode as CoreAnimation seems to want to hijack our threads otherwise | 17 | // We use our own custom run loop mode as CoreAnimation seems to want to hijack our threads otherwise |
17 | static CFStringRef ASIHTTPRequestRunMode = CFSTR("ASIHTTPRequest"); | 18 | static CFStringRef ASIHTTPRequestRunMode = CFSTR("ASIHTTPRequest"); |
@@ -105,6 +106,7 @@ static NSError *ASIUnableToCreateRequestError; | @@ -105,6 +106,7 @@ static NSError *ASIUnableToCreateRequestError; | ||
105 | [requestHeaders release]; | 106 | [requestHeaders release]; |
106 | [requestCookies release]; | 107 | [requestCookies release]; |
107 | [downloadDestinationPath release]; | 108 | [downloadDestinationPath release]; |
109 | + [temporaryFileDownloadPath release]; | ||
108 | [outputStream release]; | 110 | [outputStream release]; |
109 | [username release]; | 111 | [username release]; |
110 | [password release]; | 112 | [password release]; |
@@ -178,11 +180,15 @@ static NSError *ASIUnableToCreateRequestError; | @@ -178,11 +180,15 @@ static NSError *ASIUnableToCreateRequestError; | ||
178 | return [[[NSString alloc] initWithBytes:[data bytes] length:[data length] encoding:[self responseEncoding]] autorelease]; | 180 | return [[[NSString alloc] initWithBytes:[data bytes] length:[data length] encoding:[self responseEncoding]] autorelease]; |
179 | } | 181 | } |
180 | 182 | ||
183 | +- (BOOL)isResponseCompressed | ||
184 | +{ | ||
185 | + NSString *encoding = [[self responseHeaders] objectForKey:@"Content-Encoding"]; | ||
186 | + return encoding && [encoding rangeOfString:@"gzip"].location != NSNotFound; | ||
187 | +} | ||
181 | 188 | ||
182 | - (NSData *)responseData | 189 | - (NSData *)responseData |
183 | { | 190 | { |
184 | - NSString *encoding = [[self responseHeaders] objectForKey:@"Content-Encoding"]; | 191 | + if ([self isResponseCompressed]) { |
185 | - if(encoding && [encoding rangeOfString:@"gzip"].location != NSNotFound) { | ||
186 | return [ASIHTTPRequest uncompressZippedData:[self rawResponseData]]; | 192 | return [ASIHTTPRequest uncompressZippedData:[self rawResponseData]]; |
187 | } else { | 193 | } else { |
188 | return [self rawResponseData]; | 194 | return [self rawResponseData]; |
@@ -417,9 +423,9 @@ static NSError *ASIUnableToCreateRequestError; | @@ -417,9 +423,9 @@ static NSError *ASIUnableToCreateRequestError; | ||
417 | [self setRawResponseData:nil]; | 423 | [self setRawResponseData:nil]; |
418 | 424 | ||
419 | // If we were downloading to a file, let's remove it | 425 | // If we were downloading to a file, let's remove it |
420 | - } else if (downloadDestinationPath) { | 426 | + } else if (temporaryFileDownloadPath) { |
421 | [outputStream close]; | 427 | [outputStream close]; |
422 | - [[NSFileManager defaultManager] removeItemAtPath:downloadDestinationPath error:NULL]; | 428 | + [[NSFileManager defaultManager] removeItemAtPath:temporaryFileDownloadPath error:NULL]; |
423 | } | 429 | } |
424 | 430 | ||
425 | [self setResponseHeaders:nil]; | 431 | [self setResponseHeaders:nil]; |
@@ -1036,7 +1042,9 @@ static NSError *ASIUnableToCreateRequestError; | @@ -1036,7 +1042,9 @@ static NSError *ASIUnableToCreateRequestError; | ||
1036 | // Are we downloading to a file? | 1042 | // Are we downloading to a file? |
1037 | if (downloadDestinationPath) { | 1043 | if (downloadDestinationPath) { |
1038 | if (!outputStream) { | 1044 | if (!outputStream) { |
1039 | - outputStream = [[NSOutputStream alloc] initToFileAtPath:downloadDestinationPath append:NO]; | 1045 | + [temporaryFileDownloadPath release]; |
1046 | + temporaryFileDownloadPath = [[NSTemporaryDirectory() stringByAppendingPathComponent:[[NSProcessInfo processInfo] globallyUniqueString]] retain]; | ||
1047 | + outputStream = [[NSOutputStream alloc] initToFileAtPath:temporaryFileDownloadPath append:NO]; | ||
1040 | [outputStream open]; | 1048 | [outputStream open]; |
1041 | } | 1049 | } |
1042 | [outputStream write:buffer maxLength:bytesRead]; | 1050 | [outputStream write:buffer maxLength:bytesRead]; |
@@ -1046,15 +1054,10 @@ static NSError *ASIUnableToCreateRequestError; | @@ -1046,15 +1054,10 @@ static NSError *ASIUnableToCreateRequestError; | ||
1046 | [rawResponseData appendBytes:buffer length:bytesRead]; | 1054 | [rawResponseData appendBytes:buffer length:bytesRead]; |
1047 | } | 1055 | } |
1048 | } | 1056 | } |
1049 | - | ||
1050 | - | ||
1051 | } | 1057 | } |
1052 | 1058 | ||
1053 | - | ||
1054 | - (void)handleStreamComplete | 1059 | - (void)handleStreamComplete |
1055 | { | 1060 | { |
1056 | - | ||
1057 | - | ||
1058 | //Try to read the headers (if this is a HEAD request handleBytesAvailable available may not be called) | 1061 | //Try to read the headers (if this is a HEAD request handleBytesAvailable available may not be called) |
1059 | if (!responseHeaders) { | 1062 | if (!responseHeaders) { |
1060 | if ([self readResponseHeadersReturningAuthenticationFailure]) { | 1063 | if ([self readResponseHeadersReturningAuthenticationFailure]) { |
@@ -1074,13 +1077,51 @@ static NSError *ASIUnableToCreateRequestError; | @@ -1074,13 +1077,51 @@ static NSError *ASIUnableToCreateRequestError; | ||
1074 | readStream = NULL; | 1077 | readStream = NULL; |
1075 | } | 1078 | } |
1076 | 1079 | ||
1080 | + NSError *fileError = nil; | ||
1081 | + | ||
1077 | // Close the output stream as we're done writing to the file | 1082 | // Close the output stream as we're done writing to the file |
1078 | - if (downloadDestinationPath) { | 1083 | + if (temporaryFileDownloadPath) { |
1079 | [outputStream close]; | 1084 | [outputStream close]; |
1085 | + | ||
1086 | + // Decompress the file (if necessary) directly to the destination path | ||
1087 | + if ([self isResponseCompressed]) { | ||
1088 | + int decompressionStatus = [ASIHTTPRequest uncompressZippedDataFromFile:temporaryFileDownloadPath toFile:downloadDestinationPath]; | ||
1089 | + if (decompressionStatus != Z_OK) { | ||
1090 | + fileError = [NSError errorWithDomain:NetworkRequestErrorDomain code:ASIFileManagementError userInfo:[NSDictionary dictionaryWithObjectsAndKeys:[NSString stringWithFormat:@"Decompression of %@ failed with code %hi",temporaryFileDownloadPath,decompressionStatus],NSLocalizedDescriptionKey,nil]]; | ||
1091 | + } | ||
1092 | + | ||
1093 | + //Remove the temporary file | ||
1094 | + NSError *removeError = nil; | ||
1095 | + [[NSFileManager defaultManager] removeItemAtPath:temporaryFileDownloadPath error:&removeError]; | ||
1096 | + if (removeError) { | ||
1097 | + fileError = [NSError errorWithDomain:NetworkRequestErrorDomain code:ASIFileManagementError userInfo:[NSDictionary dictionaryWithObjectsAndKeys:[NSString stringWithFormat:@"Failed to delete file at %@ with error: %@",temporaryFileDownloadPath,removeError],NSLocalizedDescriptionKey,removeError,NSUnderlyingErrorKey,nil]]; | ||
1098 | + } | ||
1099 | + } else { | ||
1100 | + | ||
1101 | + //Remove any file at the destination path | ||
1102 | + NSError *moveError = nil; | ||
1103 | + if ([[NSFileManager defaultManager] fileExistsAtPath:downloadDestinationPath]) { | ||
1104 | + [[NSFileManager defaultManager] removeItemAtPath:downloadDestinationPath error:&moveError]; | ||
1105 | + if (moveError) { | ||
1106 | + fileError = [NSError errorWithDomain:NetworkRequestErrorDomain code:ASIFileManagementError userInfo:[NSDictionary dictionaryWithObjectsAndKeys:[NSString stringWithFormat:@"Unable to remove file at path '%@'",downloadDestinationPath],NSLocalizedDescriptionKey,moveError,NSUnderlyingErrorKey,nil]]; | ||
1107 | + } | ||
1108 | + } | ||
1109 | + | ||
1110 | + //Move the temporary file to the destination path | ||
1111 | + if (!fileError) { | ||
1112 | + [[NSFileManager defaultManager] moveItemAtPath:temporaryFileDownloadPath toPath:downloadDestinationPath error:&moveError]; | ||
1113 | + if (moveError) { | ||
1114 | + fileError = [NSError errorWithDomain:NetworkRequestErrorDomain code:ASIFileManagementError userInfo:[NSDictionary dictionaryWithObjectsAndKeys:[NSString stringWithFormat:@"Failed to move file from '%@' to '%@'",temporaryFileDownloadPath,downloadDestinationPath],NSLocalizedDescriptionKey,moveError,NSUnderlyingErrorKey,nil]]; | ||
1115 | + } | ||
1116 | + } | ||
1117 | + } | ||
1080 | } | 1118 | } |
1081 | [progressLock unlock]; | 1119 | [progressLock unlock]; |
1082 | - [self requestFinished]; | 1120 | + if (fileError) { |
1083 | - | 1121 | + [self failWithError:fileError]; |
1122 | + } else { | ||
1123 | + [self requestFinished]; | ||
1124 | + } | ||
1084 | } | 1125 | } |
1085 | 1126 | ||
1086 | 1127 | ||
@@ -1235,6 +1276,91 @@ static NSError *ASIUnableToCreateRequestError; | @@ -1235,6 +1276,91 @@ static NSError *ASIUnableToCreateRequestError; | ||
1235 | } | 1276 | } |
1236 | } | 1277 | } |
1237 | 1278 | ||
1279 | + | ||
1280 | ++ (int)uncompressZippedDataFromFile:(NSString *)sourcePath toFile:(NSString *)destinationPath | ||
1281 | +{ | ||
1282 | + // Get a FILE struct for the source file | ||
1283 | + FILE *source = fdopen([[NSFileHandle fileHandleForReadingAtPath:sourcePath] fileDescriptor], "r"); | ||
1284 | + | ||
1285 | + // Create an empty file at the destination path | ||
1286 | + [[NSFileManager defaultManager] createFileAtPath:destinationPath contents:[NSData data] attributes:nil]; | ||
1287 | + | ||
1288 | + // Get a FILE struct for the destination path | ||
1289 | + FILE *dest = fdopen([[NSFileHandle fileHandleForWritingAtPath:destinationPath] fileDescriptor], "w"); | ||
1290 | + | ||
1291 | + // Uncompress data in source and save in destination | ||
1292 | + int status = [ASIHTTPRequest uncompressZippedDataFromSource:source toDestination:dest]; | ||
1293 | + | ||
1294 | + // Close the files | ||
1295 | + fclose(source); | ||
1296 | + fclose(dest); | ||
1297 | + return status; | ||
1298 | +} | ||
1299 | + | ||
1300 | +// | ||
1301 | +// From the zlib sample code by Mark Adler, code here: | ||
1302 | +// http://www.zlib.net/zpipe.c | ||
1303 | +// | ||
1304 | +#define CHUNK 16384 | ||
1305 | ++ (int)uncompressZippedDataFromSource:(FILE *)source toDestination:(FILE *)dest | ||
1306 | +{ | ||
1307 | + int ret; | ||
1308 | + unsigned have; | ||
1309 | + z_stream strm; | ||
1310 | + unsigned char in[CHUNK]; | ||
1311 | + unsigned char out[CHUNK]; | ||
1312 | + | ||
1313 | + /* allocate inflate state */ | ||
1314 | + strm.zalloc = Z_NULL; | ||
1315 | + strm.zfree = Z_NULL; | ||
1316 | + strm.opaque = Z_NULL; | ||
1317 | + strm.avail_in = 0; | ||
1318 | + strm.next_in = Z_NULL; | ||
1319 | + ret = inflateInit2(&strm, (15+32)); | ||
1320 | + if (ret != Z_OK) | ||
1321 | + return ret; | ||
1322 | + | ||
1323 | + /* decompress until deflate stream ends or end of file */ | ||
1324 | + do { | ||
1325 | + strm.avail_in = fread(in, 1, CHUNK, source); | ||
1326 | + if (ferror(source)) { | ||
1327 | + (void)inflateEnd(&strm); | ||
1328 | + return Z_ERRNO; | ||
1329 | + } | ||
1330 | + if (strm.avail_in == 0) | ||
1331 | + break; | ||
1332 | + strm.next_in = in; | ||
1333 | + | ||
1334 | + /* run inflate() on input until output buffer not full */ | ||
1335 | + do { | ||
1336 | + strm.avail_out = CHUNK; | ||
1337 | + strm.next_out = out; | ||
1338 | + ret = inflate(&strm, Z_NO_FLUSH); | ||
1339 | + assert(ret != Z_STREAM_ERROR); /* state not clobbered */ | ||
1340 | + switch (ret) { | ||
1341 | + case Z_NEED_DICT: | ||
1342 | + ret = Z_DATA_ERROR; /* and fall through */ | ||
1343 | + case Z_DATA_ERROR: | ||
1344 | + case Z_MEM_ERROR: | ||
1345 | + (void)inflateEnd(&strm); | ||
1346 | + return ret; | ||
1347 | + } | ||
1348 | + have = CHUNK - strm.avail_out; | ||
1349 | + if (fwrite(&out, 1, have, dest) != have || ferror(dest)) { | ||
1350 | + (void)inflateEnd(&strm); | ||
1351 | + return Z_ERRNO; | ||
1352 | + } | ||
1353 | + } while (strm.avail_out == 0); | ||
1354 | + | ||
1355 | + /* done when inflate() says it's done */ | ||
1356 | + } while (ret != Z_STREAM_END); | ||
1357 | + | ||
1358 | + /* clean up and return */ | ||
1359 | + (void)inflateEnd(&strm); | ||
1360 | + return ret == Z_STREAM_END ? Z_OK : Z_DATA_ERROR; | ||
1361 | +} | ||
1362 | + | ||
1363 | + | ||
1238 | @synthesize username; | 1364 | @synthesize username; |
1239 | @synthesize password; | 1365 | @synthesize password; |
1240 | @synthesize domain; | 1366 | @synthesize domain; |
@@ -1246,6 +1372,7 @@ static NSError *ASIUnableToCreateRequestError; | @@ -1246,6 +1372,7 @@ static NSError *ASIUnableToCreateRequestError; | ||
1246 | @synthesize useSessionPersistance; | 1372 | @synthesize useSessionPersistance; |
1247 | @synthesize useCookiePersistance; | 1373 | @synthesize useCookiePersistance; |
1248 | @synthesize downloadDestinationPath; | 1374 | @synthesize downloadDestinationPath; |
1375 | +@synthesize temporaryFileDownloadPath; | ||
1249 | @synthesize didFinishSelector; | 1376 | @synthesize didFinishSelector; |
1250 | @synthesize didFailSelector; | 1377 | @synthesize didFailSelector; |
1251 | @synthesize authenticationRealm; | 1378 | @synthesize authenticationRealm; |
@@ -26,5 +26,5 @@ | @@ -26,5 +26,5 @@ | ||
26 | - (void)testDigestAuthentication; | 26 | - (void)testDigestAuthentication; |
27 | - (void)testCharacterEncoding; | 27 | - (void)testCharacterEncoding; |
28 | - (void)testCompressedResponse; | 28 | - (void)testCompressedResponse; |
29 | - | 29 | +- (void)testCompressedResponseDownloadToFile; |
30 | @end | 30 | @end |
@@ -126,16 +126,42 @@ | @@ -126,16 +126,42 @@ | ||
126 | 126 | ||
127 | - (void)testFileDownload | 127 | - (void)testFileDownload |
128 | { | 128 | { |
129 | + NSString *path = [[[[NSBundle mainBundle] bundlePath] stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"testimage.png"]; | ||
130 | + | ||
131 | + NSURL *url = [[[NSURL alloc] initWithString:@"http://allseeing-i.com/i/logo.png"] autorelease]; | ||
132 | + ASIHTTPRequest *request = [[[ASIHTTPRequest alloc] initWithURL:url] autorelease]; | ||
133 | + [request setDownloadDestinationPath:path]; | ||
134 | + [request start]; | ||
135 | + | ||
136 | + NSString *tempPath = [request temporaryFileDownloadPath]; | ||
137 | + STAssertNotNil(tempPath,@"Failed to download file to temporary location"); | ||
138 | + | ||
139 | + //BOOL success = (![[NSFileManager defaultManager] fileExistsAtPath:tempPath]); | ||
140 | + //STAssertTrue(success,@"Failed to remove file from temporary location"); | ||
141 | + | ||
142 | + NSImage *image = [[[NSImage alloc] initWithContentsOfFile:path] autorelease]; | ||
143 | + STAssertNotNil(image,@"Failed to download data to a file"); | ||
144 | +} | ||
145 | + | ||
146 | +- (void)testCompressedResponseDownloadToFile | ||
147 | +{ | ||
129 | NSString *path = [[[[NSBundle mainBundle] bundlePath] stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"testfile"]; | 148 | NSString *path = [[[[NSBundle mainBundle] bundlePath] stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"testfile"]; |
130 | 149 | ||
131 | NSURL *url = [[[NSURL alloc] initWithString:@"http://allseeing-i.com/ASIHTTPRequest/tests/first"] autorelease]; | 150 | NSURL *url = [[[NSURL alloc] initWithString:@"http://allseeing-i.com/ASIHTTPRequest/tests/first"] autorelease]; |
132 | - ASIHTTPRequest *request1 = [[[ASIHTTPRequest alloc] initWithURL:url] autorelease]; | 151 | + ASIHTTPRequest *request = [[[ASIHTTPRequest alloc] initWithURL:url] autorelease]; |
133 | - [request1 setDownloadDestinationPath:path]; | 152 | + [request setDownloadDestinationPath:path]; |
134 | - [request1 start]; | 153 | + [request start]; |
154 | + | ||
155 | + NSString *tempPath = [request temporaryFileDownloadPath]; | ||
156 | + STAssertNotNil(tempPath,@"Failed to download file to temporary location"); | ||
157 | + | ||
158 | + //BOOL success = (![[NSFileManager defaultManager] fileExistsAtPath:tempPath]); | ||
159 | + //STAssertTrue(success,@"Failed to remove file from temporary location"); | ||
135 | 160 | ||
136 | - NSString *s = [NSString stringWithContentsOfURL:[NSURL fileURLWithPath:path]]; | ||
137 | BOOL success = [[NSString stringWithContentsOfURL:[NSURL fileURLWithPath:path]] isEqualToString:@"This is the expected content for the first string"]; | 161 | BOOL success = [[NSString stringWithContentsOfURL:[NSURL fileURLWithPath:path]] isEqualToString:@"This is the expected content for the first string"]; |
138 | STAssertTrue(success,@"Failed to download data to a file"); | 162 | STAssertTrue(success,@"Failed to download data to a file"); |
163 | + | ||
164 | + | ||
139 | } | 165 | } |
140 | 166 | ||
141 | 167 | ||
@@ -425,4 +451,5 @@ | @@ -425,4 +451,5 @@ | ||
425 | } | 451 | } |
426 | 452 | ||
427 | 453 | ||
454 | + | ||
428 | @end | 455 | @end |
@@ -46,7 +46,7 @@ | @@ -46,7 +46,7 @@ | ||
46 | 46 | ||
47 | - (void)imageFetchComplete:(ASIHTTPRequest *)request | 47 | - (void)imageFetchComplete:(ASIHTTPRequest *)request |
48 | { | 48 | { |
49 | - UIImage *img = [UIImage imageWithData:[request receivedData]]; | 49 | + UIImage *img = [UIImage imageWithData:[request responseData]]; |
50 | if (img) { | 50 | if (img) { |
51 | if ([imageView1 image]) { | 51 | if ([imageView1 image]) { |
52 | if ([imageView2 image]) { | 52 | if ([imageView2 image]) { |
@@ -19,8 +19,8 @@ | @@ -19,8 +19,8 @@ | ||
19 | [request addRequestHeader:@"User-Agent" value:@"ASIHTTPRequest"]; | 19 | [request addRequestHeader:@"User-Agent" value:@"ASIHTTPRequest"]; |
20 | 20 | ||
21 | [request start]; | 21 | [request start]; |
22 | - if ([request dataString]) { | 22 | + if ([request responseString]) { |
23 | - [htmlSource setText:[request dataString]]; | 23 | + [htmlSource setText:[request responseString]]; |
24 | } | 24 | } |
25 | } | 25 | } |
26 | 26 |
This diff was suppressed by a .gitattributes entry.
-
Please register or login to post a comment