From: <bra...@us...> - 2007-12-12 03:06:08
|
Revision: 2111 http://archive-access.svn.sourceforge.net/archive-access/?rev=2111&view=rev Author: bradtofel Date: 2007-12-11 19:06:10 -0800 (Tue, 11 Dec 2007) Log Message: ----------- BUGFIX: now rewriting Location and Content-Base headers in non HTML documents FEATURE: Added Server-Side rendering capability to normal ArchivalUrl mode. Now JS inserts are all handled through .jsp inserts, which include page specific variables, and reference to the common .js file which uses those variables. Modified Paths: -------------- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlReplayDispatcher.java trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlReplayRenderer.java Added Paths: ----------- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlTransparentReplayRenderer.java Modified: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlReplayDispatcher.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlReplayDispatcher.java 2007-12-12 02:19:12 UTC (rev 2110) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlReplayDispatcher.java 2007-12-12 03:06:10 UTC (rev 2111) @@ -33,7 +33,6 @@ import org.archive.wayback.core.WaybackRequest; import org.archive.wayback.replay.BaseReplayDispatcher; import org.archive.wayback.replay.DateRedirectReplayRenderer; -import org.archive.wayback.replay.TransparentReplayRenderer; /** * @@ -54,7 +53,9 @@ // TODO: make this configurable private final static long MAX_HTML_MARKUP_LENGTH = 1024 * 1024 * 5; - private ReplayRenderer transparent = new TransparentReplayRenderer(); + private ReplayRenderer transparent = + new ArchivalUrlTransparentReplayRenderer(); + private ReplayRenderer redirect = new DateRedirectReplayRenderer(); private ArchivalUrlReplayRenderer archivalHTML = new ArchivalUrlReplayRenderer(); @@ -75,6 +76,8 @@ return redirect; } + // TODO: handle .css docs -- embedded URLs there need to be fixed + // HTML and XHTML docs smaller than some size get marked up as HTML if (resource.getRecordLength() < MAX_HTML_MARKUP_LENGTH) { @@ -123,4 +126,20 @@ public void setJspInserts(List<String> jspInserts) { archivalHTML.setJspInserts(jspInserts); } + + /** + * @return + * @see org.archive.wayback.archivalurl.ArchivalUrlReplayRenderer#isServerSideRendering() + */ + public boolean isServerSideRendering() { + return archivalHTML.isServerSideRendering(); + } + + /** + * @param isServerSideRendering + * @see org.archive.wayback.archivalurl.ArchivalUrlReplayRenderer#setServerSideRendering(boolean) + */ + public void setServerSideRendering(boolean isServerSideRendering) { + archivalHTML.setServerSideRendering(isServerSideRendering); + } } Modified: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlReplayRenderer.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlReplayRenderer.java 2007-12-12 02:19:12 UTC (rev 2110) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlReplayRenderer.java 2007-12-12 03:06:10 UTC (rev 2111) @@ -25,7 +25,6 @@ package org.archive.wayback.archivalurl; import java.io.IOException; -import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -36,17 +35,14 @@ import org.archive.wayback.ReplayRenderer; import org.archive.wayback.ResultURIConverter; -import org.archive.wayback.WaybackConstants; import org.archive.wayback.core.Resource; import org.archive.wayback.core.SearchResult; import org.archive.wayback.core.SearchResults; -import org.archive.wayback.core.Timestamp; import org.archive.wayback.core.WaybackRequest; import org.archive.wayback.exception.BadContentException; import org.archive.wayback.replay.HTMLPage; import org.archive.wayback.replay.HttpHeaderProcessor; import org.archive.wayback.replay.HttpHeaderOperation; -import org.archive.wayback.util.StringFormatter; import org.archive.wayback.util.UrlCanonicalizer; /** @@ -61,20 +57,10 @@ */ public class ArchivalUrlReplayRenderer implements ReplayRenderer, HttpHeaderProcessor { - private final static String HTTP_LENGTH_HEADER = "Content-Length"; - private final static String HTTP_LENGTH_HEADER_UP = - HTTP_LENGTH_HEADER.toUpperCase(); - private final static String HTTP_LOCATION_HEADER = "Location"; - private final static String HTTP_LOCATION_HEADER_UP = - HTTP_LOCATION_HEADER.toUpperCase(); - - private final static String HTTP_CONTENT_BASE_HEADER = "Content-Length"; - private final static String HTTP_CONTENT_BASE_HEADER_UP = - HTTP_CONTENT_BASE_HEADER.toUpperCase(); - private List<String> jsInserts = null; private List<String> jspInserts = null; + private boolean serverSideRendering = false; /* (non-Javadoc) * @see org.archive.wayback.ReplayRenderer#renderResource(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, org.archive.wayback.core.WaybackRequest, org.archive.wayback.core.SearchResult, org.archive.wayback.core.Resource, org.archive.wayback.ResultURIConverter, org.archive.wayback.core.SearchResults) @@ -85,41 +71,23 @@ ResultURIConverter uriConverter, SearchResults results) throws ServletException, IOException, BadContentException { - resource.parseHeaders(); - + StringBuilder toInsert = new StringBuilder(300); + HttpHeaderOperation.copyHTTPMessageHeader(resource, httpResponse); - + Map<String,String> headers = HttpHeaderOperation.processHeaders( resource, result, uriConverter, this); + // Load content into an HTML page, and resolve load-time URLs: HTMLPage page = new HTMLPage(resource,result,uriConverter); page.readFully(); - page.resolvePageUrls(); - // generate JS insert: - StringFormatter fmt = wbRequest.getFormatter(); - - String resourceTS = result.getCaptureDate(); - String resourceUrl = result.get(WaybackConstants.RESULT_URL); - Timestamp captureTS = Timestamp.parseBefore(resourceTS); - Date captureDate = captureTS.getDate(); - String contextPath = uriConverter.makeReplayURI(resourceTS, ""); - - - StringBuilder toInsert = new StringBuilder(300); - - toInsert.append("<script type=\"text/javascript\">\n\n"); - toInsert.append(fmt.format("ReplayView.javaScriptComment", captureDate, - new Date())); - String wmNotice = fmt.format("ReplayView.banner", resourceUrl, - captureDate); - String wmHideNotice = fmt.format("ReplayView.bannerHideLink"); - toInsert.append("var sWayBackCGI = \"" + contextPath + "\";\n"); - toInsert.append("var wmNotice = \"" + wmNotice + "\";\n"); - toInsert.append("var wmHideNotice = \"" + wmHideNotice + "\";\n"); - toInsert.append("</script>\n"); - + if(serverSideRendering) { + page.resolveAllPageUrls(); + } else { + page.resolvePageUrls(); + } if(jsInserts != null) { Iterator<String> itr = jsInserts.iterator(); while(itr.hasNext()) { @@ -134,16 +102,20 @@ } } - // add the javascript, and dump the result out to the client: - page.insertAtEndOfBody(toInsert.toString()); + // insert the new content: + if(serverSideRendering) { + page.insertAtStartOfBody(toInsert.toString()); + } else { + page.insertAtEndOfBody(toInsert.toString()); + } + + // set the corrected length: + int bytes = page.getBytes().length; + headers.put(HTTP_LENGTH_HEADER, String.valueOf(bytes)); // send back the headers: HttpHeaderOperation.sendHeaders(headers, httpResponse); - // plus the corrected length: - int bytes = page.getBytes().length; - headers.put(HTTP_LENGTH_HEADER, String.valueOf(bytes)); - page.writeToOutputStream(httpResponse.getOutputStream()); } @@ -205,4 +177,18 @@ public void setJspInserts(List<String> jspInserts) { this.jspInserts = jspInserts; } + + /** + * @return the isServerSideRendering + */ + public boolean isServerSideRendering() { + return serverSideRendering; + } + + /** + * @param isServerSideRendering the isServerSideRendering to set + */ + public void setServerSideRendering(boolean serverSideRendering) { + this.serverSideRendering = serverSideRendering; + } } Added: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlTransparentReplayRenderer.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlTransparentReplayRenderer.java (rev 0) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlTransparentReplayRenderer.java 2007-12-12 03:06:10 UTC (rev 2111) @@ -0,0 +1,45 @@ +package org.archive.wayback.archivalurl; + +import java.util.Map; + +import org.archive.wayback.ResultURIConverter; +import org.archive.wayback.core.SearchResult; +import org.archive.wayback.replay.TransparentReplayRenderer; +import org.archive.wayback.util.UrlCanonicalizer; + +/** + * Slight extension to TransparentReplayRenderer, which rewrites Location and + * Content-Base HTTP headers as they go out. + * + * @author brad + * @version $Date$, $Revision$ + */ +public class ArchivalUrlTransparentReplayRenderer +extends TransparentReplayRenderer { + + /* (non-Javadoc) + * @see org.archive.wayback.replay.HeaderFilter#filter(java.util.Map, java.lang.String, java.lang.String, org.archive.wayback.ResultURIConverter, org.archive.wayback.core.SearchResult) + */ + public void filter(Map<String, String> output, String key, String value, + ResultURIConverter uriConverter, SearchResult result) { + + String keyUp = key.toUpperCase(); + + // rewrite Location header URLs + if (keyUp.startsWith(HTTP_LOCATION_HEADER_UP) || + keyUp.startsWith(HTTP_CONTENT_BASE_HEADER_UP)) { + + String baseUrl = result.getAbsoluteUrl(); + String cd = result.getCaptureDate(); + // by the spec, these should be absolute already, but just in case: + String u = UrlCanonicalizer.resolveUrl(baseUrl, value); + + output.put(key, uriConverter.makeReplayURI(cd,u)); + + } else { + // others go out as-is: + + output.put(key, value); + } + } +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |