Ben Copsey

Trim whitespace and quotes from urls, prevent download data urls

@@ -20,6 +20,7 @@ static NSMutableArray *requestsUsingXMLParser = nil; @@ -20,6 +20,7 @@ static NSMutableArray *requestsUsingXMLParser = nil;
20 - (void)updateResourceURLs; 20 - (void)updateResourceURLs;
21 - (void)parseAsHTML; 21 - (void)parseAsHTML;
22 - (void)parseAsCSS; 22 - (void)parseAsCSS;
  23 +- (void)addURLToFetch:(NSString *)newURL;
23 + (NSArray *)CSSURLsFromString:(NSString *)string; 24 + (NSArray *)CSSURLsFromString:(NSString *)string;
24 @property (retain, nonatomic) ASINetworkQueue *externalResourceQueue; 25 @property (retain, nonatomic) ASINetworkQueue *externalResourceQueue;
25 @property (retain, nonatomic) NSMutableDictionary *resourceList; 26 @property (retain, nonatomic) NSMutableDictionary *resourceList;
@@ -68,15 +69,11 @@ static NSMutableArray *requestsUsingXMLParser = nil; @@ -68,15 +69,11 @@ static NSMutableArray *requestsUsingXMLParser = nil;
68 [self setResourceList:[NSMutableDictionary dictionary]]; 69 [self setResourceList:[NSMutableDictionary dictionary]];
69 70
70 for (NSString *theURL in urls) { 71 for (NSString *theURL in urls) {
71 - if (([[theURL substringToIndex:1] isEqualToString:@"'"] && [[theURL substringFromIndex:[theURL length]-1] isEqualToString:@"'"]) ||([[theURL substringToIndex:1] isEqualToString:@"\""] && [[theURL substringFromIndex:[theURL length]-1] isEqualToString:@"\""])) {  
72 - theURL = [theURL substringWithRange:NSMakeRange(1,[theURL length]-2)];  
73 - }  
74 NSURL *newURL = [NSURL URLWithString:theURL relativeToURL:[self url]]; 72 NSURL *newURL = [NSURL URLWithString:theURL relativeToURL:[self url]];
75 if (newURL) { 73 if (newURL) {
76 - [[self resourceList] setObject:[NSMutableDictionary dictionary] forKey:theURL]; 74 + [self addURLToFetch:theURL];
77 } 75 }
78 } 76 }
79 -  
80 if (![[self resourceList] count]) { 77 if (![[self resourceList] count]) {
81 [super requestFinished]; 78 [super requestFinished];
82 [super markAsFinished]; 79 [super markAsFinished];
@@ -95,6 +92,7 @@ static NSMutableArray *requestsUsingXMLParser = nil; @@ -95,6 +92,7 @@ static NSMutableArray *requestsUsingXMLParser = nil;
95 ASIWebPageRequest *externalResourceRequest = [ASIWebPageRequest requestWithURL:[NSURL URLWithString:theURL relativeToURL:[self url]]]; 92 ASIWebPageRequest *externalResourceRequest = [ASIWebPageRequest requestWithURL:[NSURL URLWithString:theURL relativeToURL:[self url]]];
96 [externalResourceRequest setRequestHeaders:[self requestHeaders]]; 93 [externalResourceRequest setRequestHeaders:[self requestHeaders]];
97 [externalResourceRequest setDownloadCache:[self downloadCache]]; 94 [externalResourceRequest setDownloadCache:[self downloadCache]];
  95 + [externalResourceRequest setCachePolicy:[self cachePolicy]];
98 [externalResourceRequest setUserInfo:[NSDictionary dictionaryWithObject:theURL forKey:@"Path"]]; 96 [externalResourceRequest setUserInfo:[NSDictionary dictionaryWithObject:theURL forKey:@"Path"]];
99 [[self externalResourceQueue] addOperation:externalResourceRequest]; 97 [[self externalResourceQueue] addOperation:externalResourceRequest];
100 } 98 }
@@ -168,6 +166,7 @@ static NSMutableArray *requestsUsingXMLParser = nil; @@ -168,6 +166,7 @@ static NSMutableArray *requestsUsingXMLParser = nil;
168 ASIWebPageRequest *externalResourceRequest = [ASIWebPageRequest requestWithURL:[NSURL URLWithString:theURL relativeToURL:[self url]]]; 166 ASIWebPageRequest *externalResourceRequest = [ASIWebPageRequest requestWithURL:[NSURL URLWithString:theURL relativeToURL:[self url]]];
169 [externalResourceRequest setRequestHeaders:[self requestHeaders]]; 167 [externalResourceRequest setRequestHeaders:[self requestHeaders]];
170 [externalResourceRequest setDownloadCache:[self downloadCache]]; 168 [externalResourceRequest setDownloadCache:[self downloadCache]];
  169 + [externalResourceRequest setCachePolicy:[self cachePolicy]];
171 [externalResourceRequest setUserInfo:[NSDictionary dictionaryWithObject:theURL forKey:@"Path"]]; 170 [externalResourceRequest setUserInfo:[NSDictionary dictionaryWithObject:theURL forKey:@"Path"]];
172 [[self externalResourceQueue] addOperation:externalResourceRequest]; 171 [[self externalResourceQueue] addOperation:externalResourceRequest];
173 } 172 }
@@ -238,6 +237,7 @@ static NSMutableArray *requestsUsingXMLParser = nil; @@ -238,6 +237,7 @@ static NSMutableArray *requestsUsingXMLParser = nil;
238 [self setResponseHeaders:newHeaders]; 237 [self setResponseHeaders:newHeaders];
239 238
240 [super requestFinished]; 239 [super requestFinished];
  240 + [[self downloadCache] storeResponseForRequest:self maxAge:[self secondsToCache]];
241 [super markAsFinished]; 241 [super markAsFinished];
242 } 242 }
243 243
@@ -271,10 +271,10 @@ static NSMutableArray *requestsUsingXMLParser = nil; @@ -271,10 +271,10 @@ static NSMutableArray *requestsUsingXMLParser = nil;
271 if ([[nodeName lowercaseString] isEqualToString:@"style"]) { 271 if ([[nodeName lowercaseString] isEqualToString:@"style"]) {
272 NSArray *externalResources = [[self class] CSSURLsFromString:value]; 272 NSArray *externalResources = [[self class] CSSURLsFromString:value];
273 for (NSString *theURL in externalResources) { 273 for (NSString *theURL in externalResources) {
274 - [resourceList setObject:[NSMutableDictionary dictionary] forKey:theURL]; 274 + [self addURLToFetch:theURL];
275 } 275 }
276 } else { 276 } else {
277 - [resourceList setObject:[NSMutableDictionary dictionary] forKey:value]; 277 + [self addURLToFetch:value];
278 } 278 }
279 if (nodes->nodeTab[i]->type != XML_NAMESPACE_DECL) { 279 if (nodes->nodeTab[i]->type != XML_NAMESPACE_DECL) {
280 nodes->nodeTab[i] = NULL; 280 nodes->nodeTab[i] = NULL;
@@ -285,6 +285,16 @@ static NSMutableArray *requestsUsingXMLParser = nil; @@ -285,6 +285,16 @@ static NSMutableArray *requestsUsingXMLParser = nil;
285 xmlXPathFreeContext(xpathCtx); 285 xmlXPathFreeContext(xpathCtx);
286 } 286 }
287 287
  288 +- (void)addURLToFetch:(NSString *)newURL
  289 +{
  290 + // Get rid of any surrounding whitespace
  291 + newURL = [newURL stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
  292 + // Don't attempt to fetch data URIs
  293 + if (![[[newURL substringToIndex:5] lowercaseString] isEqualToString:@"data:"]) {
  294 + [[self resourceList] setObject:[NSMutableDictionary dictionary] forKey:newURL];
  295 + }
  296 +}
  297 +
288 298
289 - (void)updateResourceURLs 299 - (void)updateResourceURLs
290 { 300 {
@@ -409,7 +419,8 @@ static NSMutableArray *requestsUsingXMLParser = nil; @@ -409,7 +419,8 @@ static NSMutableArray *requestsUsingXMLParser = nil;
409 if (!theURL) { 419 if (!theURL) {
410 break; 420 break;
411 } 421 }
412 - [urls addObject:theURL]; 422 + // Remove any quotes around the url
  423 + [urls addObject:[theURL stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"\"'"]]];
413 } 424 }
414 return urls; 425 return urls;
415 } 426 }