While developing Web Raveler, we encountered difficulties which took 
considerable effort to overcome. First, since we are implementing 
Web Raveler as a proxy server, we had to find a way to associate
the first connection a user makes to the proxy, where there is no
proxy-authorization header and thus no user information, with
the user's subsequent connections.  If we want to allow logging 
out of the Web Raveler system, we need a way to change 

Next, we faced the problem of letting the user see what a page
would look like with Web Raveler's modifications turned off, a 
feature we call "unraveling" a page.  Unraveling a page presents
a problem due to the fact that
 
Our third main problem in implementing Web Raveler arose when we 
made the decision to use frames to separate the Web Raveler banner,
which allows Web Raveler configuration, from the Web content requested
by the user.  Using frames requires that Web Raveler make all URLs 
contained within HTML pages absolute, as relative URLs will otherwise
be evaluated with respect to internal Web Raveler virtual URLs, in 
which case the user will be unable to fetch the linked content in 
question.  Our solution to the problems associated with using 
framed pages involved using two mechanisms for fetching content 
from the Web.  When an HTML document is first requested, we 
wrap it in a page with two frames, one containing a virtual URL
pointing to the Web Raveler banner and the other containing a 
virtual URL telling Web Raveler to fetch the original document
and execute the user's active plugins on it. 
