/** * */ package org.archive.wayback.archivalurl; import java.io.IOException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import junit.framework.TestCase; import org.archive.io.warc.TestWARCReader; import org.archive.io.warc.TestWARCRecordInfo; import org.archive.io.warc.WARCRecord; import org.archive.io.warc.WARCRecordInfo; import org.archive.wayback.ResultURIConverter; import org.archive.wayback.core.CaptureSearchResult; import org.archive.wayback.core.Resource; import org.archive.wayback.core.WaybackRequest; import org.archive.wayback.proxy.ProxyHttpsResultURIConverter; import org.archive.wayback.replay.HttpHeaderProcessor; import org.archive.wayback.replay.IdentityHttpHeaderProcessor; import org.archive.wayback.replay.RedirectRewritingHttpHeaderProcessor; import org.archive.wayback.replay.TransparentReplayRendererTest.TestServletOutputStream; import org.archive.wayback.replay.html.ContextResultURIConverterFactory; import org.archive.wayback.replay.html.IdentityResultURIConverterFactory; import org.archive.wayback.replay.html.ReplayParseContext; import org.archive.wayback.replay.html.StringTransformer; import org.archive.wayback.replay.html.transformer.JSStringTransformer; import org.archive.wayback.resourcestore.resourcefile.WarcResource; import org.archive.wayback.webapp.AccessPoint; import org.easymock.EasyMock; /** * Test case for {@link ArchivalURLJSStringTransformerReplayRenderer}. * * @author kenji * */ public class ArchivalURLJSStringTransformerReplayRendererTest extends TestCase { /* (non-Javadoc) * @see junit.framework.TestCase#setUp() */ protected void setUp() throws Exception { super.setUp(); } public static Resource createTestJSResource(byte[] payloadBytes) throws IOException { WARCRecordInfo recinfo = TestWARCRecordInfo.createHttpResponse("text/javascript", payloadBytes); TestWARCReader ar = new TestWARCReader(recinfo); WARCRecord rec = ar.get(0); WarcResource resource = new WarcResource(rec, ar); resource.parseHeaders(); return resource; } /** * Rewrite directive shall be passed from {@link AccessPoint#getRewriteDirective(CaptureSearchResult)} * to {@link ReplayParseContext}. * @throws Exception */ public void testRewriteDirectiveIsPassedToParseContext() throws Exception { HttpHeaderProcessor httpHeaderProcessor = new IdentityHttpHeaderProcessor(); ArchivalURLJSStringTransformerReplayRenderer renderer = new ArchivalURLJSStringTransformerReplayRenderer(httpHeaderProcessor); final String rewriteDirective = "rewrite-it"; StringTransformer transformer = new StringTransformer() { @Override public String transform(ReplayParseContext context, String input) { String directive = context.getOraclePolicy(); assertEquals(rewriteDirective, directive); return input; } }; renderer.setTransformer(transformer); AccessPoint accessPoint = new AccessPoint() { public String getRewriteDirective(CaptureSearchResult capture) { return rewriteDirective; } }; WaybackRequest wbRequest = WaybackRequest.createReplayRequest( "http://example.com/", "20140101000000", null, null); wbRequest.setAccessPoint(accessPoint); Resource payloadResource = createTestJSResource("aaa".getBytes("UTF-8")); // ResultURIConverter argument is passed down from AccessPoint#getUriConverter(). // it is typically ProxyHttpsResultURIConverter(), the same class for converterFactory // (but a separate instance) - we reuse proxyURIConverter above. HttpServletResponse response = EasyMock.createNiceMock(HttpServletResponse.class); TestServletOutputStream servletOutput = new TestServletOutputStream(); EasyMock.expect(response.getOutputStream()).andStubReturn(servletOutput); HttpServletRequest request = null; // assuming unused CaptureSearchResult result = new CaptureSearchResult(); result.setOriginalUrl("http://example.com/"); ResultURIConverter uriConverter = new ArchivalUrlResultURIConverter(); EasyMock.replay(response); renderer.renderResource(request, response, wbRequest, result, payloadResource, uriConverter, null); } /** * multi-component test with typical usage pattern: * rewriting {@code https://} to {@code http://} in proxy-mode. * (ArchivalURLJSStringTransformerReplayRenderer is also used in * proxy-mode despite its name.) * * @see org.archive.wayback.replay.html.transformer.JSStringTransformerTest */ public void testProxyHttpsTranslation() throws Exception { HttpHeaderProcessor httpHeaderProcessor = new RedirectRewritingHttpHeaderProcessor(); ArchivalURLJSStringTransformerReplayRenderer renderer = new ArchivalURLJSStringTransformerReplayRenderer( httpHeaderProcessor); // not testing jspInserts - TODO // in production transformer is a MultiRegexReplaceStringTransformer // running other rewrites besides JSStringTransformer. We are // only testing JSStringTransformer here. JSStringTransformer transformer = new JSStringTransformer(); renderer.setTransformer(transformer); ResultURIConverter proxyURIConverter = new ProxyHttpsResultURIConverter(); ContextResultURIConverterFactory converterFactory = new IdentityResultURIConverterFactory(proxyURIConverter); renderer.setConverterFactory(converterFactory); renderer.setRewriteHttpsOnly(true); final String payload = "var img1 = 'https://home.archive.org/~hstern/ARI-3745/happy_face.jpg';\n" + "var el1 = document.createElement('img');\n" + "el1.src = img;\n" + "document.getElementById('imgdiv').appendChild(el1)\n"; final String expected = "var img1 = 'http://home.archive.org/~hstern/ARI-3745/happy_face.jpg';\n" + "var el1 = document.createElement('img');\n" + "el1.src = img;\n" + "document.getElementById('imgdiv').appendChild(el1)\n"; final byte[] payloadBytes = payload.getBytes("UTF-8"); Resource payloadResource = createTestJSResource(payloadBytes); // ResultURIConverter argument is passed down from AccessPoint#getUriConverter(). // it is typically ProxyHttpsResultURIConverter(), the same class for converterFactory // (but a separate instance) - we reuse proxyURIConverter above. HttpServletResponse response = EasyMock.createNiceMock(HttpServletResponse.class); TestServletOutputStream servletOutput = new TestServletOutputStream(); EasyMock.expect(response.getOutputStream()).andStubReturn(servletOutput); HttpServletRequest request = null; // assuming unused WaybackRequest wbRequest = new WaybackRequest(); CaptureSearchResult result = new CaptureSearchResult(); result.setOriginalUrl("http://home.archive.org/~hstern/ARI-3745/"); EasyMock.replay(response); renderer.renderResource(request, response, wbRequest, result, payloadResource, payloadResource, proxyURIConverter, null); String out = servletOutput.getString(); assertEquals("servlet output", expected, out); } }