=== modified file 'src/HttpRequest.cc'
--- src/HttpRequest.cc	2011-05-18 12:50:48 +0000
+++ src/HttpRequest.cc	2011-05-18 13:51:23 +0000
@@ -200,7 +200,7 @@
 
     copy->port = port;
     // urlPath handled in ctor
-    copy->canonical = canonical ? xstrdup(canonical) : NULL;
+    urlCanonical(copy); // does a re-build from the above copied details.
 
     // range handled in hdrCacheInit()
     copy->ims = ims;

=== modified file 'src/client_side_request.cc'
--- src/client_side_request.cc	2011-05-11 12:29:30 +0000
+++ src/client_side_request.cc	2011-05-18 14:15:58 +0000
@@ -1042,38 +1042,33 @@
                     debugs(85, DBG_CRITICAL, "ERROR: URL-rewrite produces invalid 303 redirect Location: " << result);
             }
         } else if (strcmp(result, http->uri)) {
-            if (!(new_request = HttpRequest::CreateFromUrlAndMethod(result, old_request->method)))
+            // XXX: validate the URL properly *without* generating a whole new request object right here.
+            // XXX: the clone() should be done only AFTER we know the new URL is valid.
+            if (!(new_request = urlParse(old_request->method, result, old_request->clone())))
                 debugs(85, DBG_CRITICAL, "ERROR: URL-rewrite produces invalid request: " <<
                        old_request->method << " " << result << " HTTP/1.1");
         }
     }
 
     if (new_request) {
-        safe_free(http->uri);
-        http->uri = xstrdup(urlCanonical(new_request));
-        new_request->http_ver = old_request->http_ver;
-        new_request->header.append(&old_request->header);
-        new_request->client_addr = old_request->client_addr;
-#if FOLLOW_X_FORWARDED_FOR
-        new_request->indirect_client_addr = old_request->indirect_client_addr;
-#endif /* FOLLOW_X_FORWARDED_FOR */
-        new_request->my_addr = old_request->my_addr;
-        new_request->flags = old_request->flags;
+        debugs(61,2, HERE << "URL-rewriter diverts URL from " << urlCanonical(old_request) << " to " << urlCanonical(new_request));
+
+        // XXX: why does this not get copied by clone()?
+        new_request->content_length = old_request->content_length;
+
+        // update the new request to flag the re-writing was done on it
         new_request->flags.redirected = 1;
-#if USE_AUTH
-        new_request->auth_user_request = old_request->auth_user_request;
-#endif
+
+        // unlink bodypipe from the old request. Not needed there any longer.
         if (old_request->body_pipe != NULL) {
-            new_request->body_pipe = old_request->body_pipe;
             old_request->body_pipe = NULL;
             debugs(61,2, HERE << "URL-rewriter diverts body_pipe " << new_request->body_pipe <<
                    " from request " << old_request << " to " << new_request);
         }
 
-        new_request->content_length = old_request->content_length;
-        new_request->extacl_user = old_request->extacl_user;
-        new_request->extacl_passwd = old_request->extacl_passwd;
-        new_request->flags.proxy_keepalive = old_request->flags.proxy_keepalive;
+        // update the current working ClientHttpRequest fields
+        safe_free(http->uri);
+        http->uri = xstrdup(urlCanonical(new_request));
         HTTPMSGUNLOCK(old_request);
         http->request = HTTPMSGLOCK(new_request);
     }

=== modified file 'src/url.cc'
--- src/url.cc	2011-04-10 02:00:38 +0000
+++ src/url.cc	2011-05-18 14:17:31 +0000
@@ -217,6 +217,9 @@
     char *dst;
     proto[0] = host[0] = urlpath[0] = login[0] = '\0';
 
+    if (request)
+        safe_free(request->canonical);
+
     if ((l = strlen(url)) + Config.appendDomainLen > (MAX_URL - 1)) {
         /* terminate so it doesn't overflow other buffers */
         *(url + (MAX_URL >> 1)) = '\0';


