Fixed <rdar://problem/4040321> Exception: Someone's trying to encode a WebDataReques...
authorrjw <rjw@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 11 Mar 2005 01:43:15 +0000 (01:43 +0000)
committerrjw <rjw@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 11 Mar 2005 01:43:15 +0000 (01:43 +0000)
        Reviewed by Darin.

If a delegate returns a mutated applewebdata: request in it's willSendRequest:
method, we don't load using the WebDataRequest.  Instead we do a normal load.
Unfortunately, if the request they return is mutated *copy* of the applewebdata:
request it will hold the applewebdata: special properties.  These properties
will be encoded into the cache.   They should not be.  So, to fix, we sanitize the
request, by removing the special properties from the request.

Note that we had to dig into the private guts of NSURLRequest because there is
no public mechanism to remove properties from a request, see 4046775.

        * WebView.subproj/WebBaseResourceHandleDelegate.m:
        (-[WebBaseResourceHandleDelegate willSendRequest:redirectResponse:]):
        * WebView.subproj/WebDataProtocol.h:
        * WebView.subproj/WebDataProtocol.m:
        (-[NSURLRequest _webDataRequestExternalRequest]):
        (-[NSURLRequest _webDataRequestSanitize]):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@8858 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebKit/ChangeLog
WebKit/WebView.subproj/WebBaseResourceHandleDelegate.m
WebKit/WebView.subproj/WebDataProtocol.h
WebKit/WebView.subproj/WebDataProtocol.m
WebKit/WebView.subproj/WebLoader.m

index c75c735f88b2fc203c0e6c2cb432519829e037c1..0aec92eed7c40f6f06148872bae8ea481469e2ba 100644 (file)
@@ -1,3 +1,26 @@
+2005-03-10  Richard Williamson   <rjw@apple.com>
+
+       Fixed <rdar://problem/4040321> Exception: Someone's trying to encode a WebDataRequestParameters instance 
+
+        Reviewed by Darin.
+
+       If a delegate returns a mutated applewebdata: request in it's willSendRequest:
+       method, we don't load using the WebDataRequest.  Instead we do a normal load.
+       Unfortunately, if the request they return is mutated *copy* of the applewebdata: 
+       request it will hold the applewebdata: special properties.  These properties 
+       will be encoded into the cache.   They should not be.  So, to fix, we sanitize the
+       request, by removing the special properties from the request.
+
+       Note that we had to dig into the private guts of NSURLRequest because there is
+       no public mechanism to remove properties from a request, see 4046775.
+
+        * WebView.subproj/WebBaseResourceHandleDelegate.m:
+        (-[WebBaseResourceHandleDelegate willSendRequest:redirectResponse:]):
+        * WebView.subproj/WebDataProtocol.h:
+        * WebView.subproj/WebDataProtocol.m:
+        (-[NSURLRequest _webDataRequestExternalRequest]):
+        (-[NSURLRequest _webDataRequestSanitize]):
+
 2005-03-10  Maciej Stachowiak  <mjs@apple.com>
 
         Reviewed by Vicki.
index 91f24b1453171c4416b61f316a84f99028adbf23..11b22922b30507c8ebde86036257655ac8bd92e5 100644 (file)
@@ -347,10 +347,12 @@ static BOOL NSURLConnectionSupportsBufferedData;
     newRequest = [mutableRequest autorelease];
 
     clientRequest = [newRequest _webDataRequestExternalRequest];
-    if(!clientRequest)
+    if(!clientRequest) {
         clientRequest = newRequest;
-    else
+    }
+    else {
         haveDataSchemeRequest = YES;
+    }
     
     if (identifier == nil) {
         // The identifier is released after the last callback, rather than in dealloc
@@ -373,8 +375,12 @@ static BOOL NSURLConnectionSupportsBufferedData;
         // If the delegate modified the request use that instead of
         // our applewebdata request, otherwise use the original
         // applewebdata request.
-        if (![updatedRequest isEqual:clientRequest])
+        if (![updatedRequest isEqual:clientRequest]) {
             newRequest = updatedRequest;
+            // Sanitize the request, so that the WebDataRequest properties
+            // don't end up getting cached.
+            [newRequest _webDataRequestSanitize];
+        }
     }
 
     // Store a copy of the request.
index caf43299c16a2a5cec55db9136d23eaf27915124..275ab0b16f21cf34935ff1961e549ccdc9859da0 100644 (file)
@@ -30,6 +30,7 @@
 - (NSString *)_webDataRequestEncoding;
 - (NSString *)_webDataRequestMIMEType;
 - (NSMutableURLRequest *)_webDataRequestExternalRequest;
+- (void)_webDataRequestSanitize;
 @end
 
 @interface NSMutableURLRequest (WebDataRequest)
index d1e6e5c63469c00d633d2cea3c8ab98db5d5fb02..c966b48a2f665627f667b4c277419facd7a19590 100644 (file)
@@ -76,6 +76,20 @@ static NSString *WebDataRequestPropertyKey = @"WebDataRequest";
 
 @end
 
+// This private interface declaration is need because NSURLProtocol
+// has no mechanism to remove a property from a NSURLRequest.
+// See 4046775.
+@interface _NSURLRequestInternal : NSObject
+{
+    @public
+    NSURL *URL;
+    NSURLRequestCachePolicy cachePolicy;
+    NSTimeInterval timeoutInterval;
+    NSURL *mainDocumentURL;
+    NSMutableDictionary *properties;
+}
+@end
+
 
 @implementation NSURLRequest (WebDataRequest)
 
@@ -140,6 +154,12 @@ static NSString *WebDataRequestPropertyKey = @"WebDataRequest";
     return newRequest;
 }
 
+- (void)_webDataRequestSanitize
+{
+    _NSURLRequestInternal *internal = (_NSURLRequestInternal *)_internal;
+    [internal->properties removeObjectForKey:WebDataRequestPropertyKey];
+}
+
 @end
 
 @implementation NSMutableURLRequest (WebDataRequest)
index 91f24b1453171c4416b61f316a84f99028adbf23..11b22922b30507c8ebde86036257655ac8bd92e5 100644 (file)
@@ -347,10 +347,12 @@ static BOOL NSURLConnectionSupportsBufferedData;
     newRequest = [mutableRequest autorelease];
 
     clientRequest = [newRequest _webDataRequestExternalRequest];
-    if(!clientRequest)
+    if(!clientRequest) {
         clientRequest = newRequest;
-    else
+    }
+    else {
         haveDataSchemeRequest = YES;
+    }
     
     if (identifier == nil) {
         // The identifier is released after the last callback, rather than in dealloc
@@ -373,8 +375,12 @@ static BOOL NSURLConnectionSupportsBufferedData;
         // If the delegate modified the request use that instead of
         // our applewebdata request, otherwise use the original
         // applewebdata request.
-        if (![updatedRequest isEqual:clientRequest])
+        if (![updatedRequest isEqual:clientRequest]) {
             newRequest = updatedRequest;
+            // Sanitize the request, so that the WebDataRequest properties
+            // don't end up getting cached.
+            [newRequest _webDataRequestSanitize];
+        }
     }
 
     // Store a copy of the request.