Ben Copsey

Made namespace work properly

Still need to add dtd for xhtml, or it will choke on html entities
@@ -10,7 +10,8 @@ @@ -10,7 +10,8 @@
10 #import "ASIWebPageRequest.h" 10 #import "ASIWebPageRequest.h"
11 #import "ASINetworkQueue.h" 11 #import "ASINetworkQueue.h"
12 12
13 -static xmlChar *xpathExpr = (xmlChar *)"//link/@href|//script/@src|//img/@src|//frame/@src|//iframe/@src|//*/@style"; 13 +static xmlChar *xpathExpr = (xmlChar *)"//xhtml:link/@href|//xhtml:script/@src|//xhtml:img/@src|//xhtml:frame/@src|//xhtml:iframe/@src|//*/@style";
  14 +
14 15
15 static NSLock *xmlParsingLock = nil; 16 static NSLock *xmlParsingLock = nil;
16 static NSMutableArray *requestsUsingXMLParser = nil; 17 static NSMutableArray *requestsUsingXMLParser = nil;
@@ -97,6 +98,7 @@ static NSMutableArray *requestsUsingXMLParser = nil; @@ -97,6 +98,7 @@ static NSMutableArray *requestsUsingXMLParser = nil;
97 [[self externalResourceQueue] addOperation:externalResourceRequest]; 98 [[self externalResourceQueue] addOperation:externalResourceRequest];
98 } 99 }
99 100
  101 + // Remove external resources
100 [[self externalResourceQueue] go]; 102 [[self externalResourceQueue] go];
101 103
102 } 104 }
@@ -128,9 +130,6 @@ static NSMutableArray *requestsUsingXMLParser = nil; @@ -128,9 +130,6 @@ static NSMutableArray *requestsUsingXMLParser = nil;
128 } 130 }
129 [requestsUsingXMLParser addObject:self]; 131 [requestsUsingXMLParser addObject:self];
130 132
131 - // Strip the namespace, because it makes the xpath query a pain  
132 - responseHTML = [responseHTML stringByReplacingOccurrencesOfString:@" xmlns=\"http://www.w3.org/1999/xhtml\"" withString:@""];  
133 -  
134 NSData *data = [responseHTML dataUsingEncoding:NSUTF8StringEncoding]; 133 NSData *data = [responseHTML dataUsingEncoding:NSUTF8StringEncoding];
135 134
136 /* Load XML document */ 135 /* Load XML document */
@@ -243,15 +242,21 @@ static NSMutableArray *requestsUsingXMLParser = nil; @@ -243,15 +242,21 @@ static NSMutableArray *requestsUsingXMLParser = nil;
243 242
244 - (void)readResourceURLs 243 - (void)readResourceURLs
245 { 244 {
246 - /* Create xpath evaluation context */ 245 + // Create xpath evaluation context
247 xmlXPathContextPtr xpathCtx = xmlXPathNewContext(doc); 246 xmlXPathContextPtr xpathCtx = xmlXPathNewContext(doc);
248 if(xpathCtx == NULL) { 247 if(xpathCtx == NULL) {
249 - xmlFreeDoc(doc);  
250 [self failWithError:[NSError errorWithDomain:NetworkRequestErrorDomain code:101 userInfo:[NSDictionary dictionaryWithObjectsAndKeys:@"Error: unable to create new XPath context",NSLocalizedDescriptionKey,nil]]]; 248 [self failWithError:[NSError errorWithDomain:NetworkRequestErrorDomain code:101 userInfo:[NSDictionary dictionaryWithObjectsAndKeys:@"Error: unable to create new XPath context",NSLocalizedDescriptionKey,nil]]];
251 return; 249 return;
252 } 250 }
253 251
254 - /* Evaluate xpath expression */ 252 + // Add the namespace
  253 + if (xmlXPathRegisterNs(xpathCtx,(xmlChar *)"xhtml",(xmlChar *)"http://www.w3.org/1999/xhtml") != 0) {
  254 + xmlXPathFreeContext(xpathCtx);
  255 + [self failWithError:[NSError errorWithDomain:NetworkRequestErrorDomain code:101 userInfo:[NSDictionary dictionaryWithObjectsAndKeys:@"Error: failed to register namespace for XPath",NSLocalizedDescriptionKey,nil]]];
  256 + return;
  257 + }
  258 +
  259 + // Evaluate xpath expression
255 xmlXPathObjectPtr xpathObj = xmlXPathEvalExpression(xpathExpr, xpathCtx); 260 xmlXPathObjectPtr xpathObj = xmlXPathEvalExpression(xpathExpr, xpathCtx);
256 if(xpathObj == NULL) { 261 if(xpathObj == NULL) {
257 xmlXPathFreeContext(xpathCtx); 262 xmlXPathFreeContext(xpathCtx);
@@ -260,6 +265,7 @@ static NSMutableArray *requestsUsingXMLParser = nil; @@ -260,6 +265,7 @@ static NSMutableArray *requestsUsingXMLParser = nil;
260 return; 265 return;
261 } 266 }
262 267
  268 + // Now loop through our matches
263 xmlNodeSetPtr nodes = xpathObj->nodesetval; 269 xmlNodeSetPtr nodes = xpathObj->nodesetval;
264 270
265 int size = (nodes) ? nodes->nodeNr : 0; 271 int size = (nodes) ? nodes->nodeNr : 0;
@@ -298,7 +304,7 @@ static NSMutableArray *requestsUsingXMLParser = nil; @@ -298,7 +304,7 @@ static NSMutableArray *requestsUsingXMLParser = nil;
298 304
299 - (void)updateResourceURLs 305 - (void)updateResourceURLs
300 { 306 {
301 - /* Create xpath evaluation context */ 307 + // Create xpath evaluation context
302 xmlXPathContextPtr xpathCtx = xmlXPathNewContext(doc); 308 xmlXPathContextPtr xpathCtx = xmlXPathNewContext(doc);
303 if(xpathCtx == NULL) { 309 if(xpathCtx == NULL) {
304 xmlFreeDoc(doc); 310 xmlFreeDoc(doc);
@@ -306,7 +312,14 @@ static NSMutableArray *requestsUsingXMLParser = nil; @@ -306,7 +312,14 @@ static NSMutableArray *requestsUsingXMLParser = nil;
306 return; 312 return;
307 } 313 }
308 314
309 - /* Evaluate xpath expression */ 315 + // <PAIN:xml namespaces="ibet://these/always/caused/more/problems/than/they/solved">
  316 + if (xmlXPathRegisterNs(xpathCtx,(xmlChar *)"xhtml",(xmlChar *)"http://www.w3.org/1999/xhtml") != 0) {
  317 + xmlXPathFreeContext(xpathCtx);
  318 + [self failWithError:[NSError errorWithDomain:NetworkRequestErrorDomain code:101 userInfo:[NSDictionary dictionaryWithObjectsAndKeys:@"Error: failed to register namespace for XPath",NSLocalizedDescriptionKey,nil]]];
  319 + return;
  320 + }
  321 +
  322 + // Evaluate xpath expression
310 xmlXPathObjectPtr xpathObj = xmlXPathEvalExpression(xpathExpr, xpathCtx); 323 xmlXPathObjectPtr xpathObj = xmlXPathEvalExpression(xpathExpr, xpathCtx);
311 if(xpathObj == NULL) { 324 if(xpathObj == NULL) {
312 xmlXPathFreeContext(xpathCtx); 325 xmlXPathFreeContext(xpathCtx);
@@ -419,8 +432,11 @@ static NSMutableArray *requestsUsingXMLParser = nil; @@ -419,8 +432,11 @@ static NSMutableArray *requestsUsingXMLParser = nil;
419 if (!theURL) { 432 if (!theURL) {
420 break; 433 break;
421 } 434 }
422 - // Remove any quotes around the url 435 + // Remove any quotes or whitespace around the url
423 - [urls addObject:[theURL stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"\"'"]]]; 436 + theURL = [theURL stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
  437 + theURL = [theURL stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"\"'"]];
  438 + theURL = [theURL stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
  439 + [urls addObject:theURL];
424 } 440 }
425 return urls; 441 return urls;
426 } 442 }