From: <bra...@us...> - 2010-09-28 21:17:55
|
Revision: 3255 http://archive-access.svn.sourceforge.net/archive-access/?rev=3255&view=rev Author: bradtofel Date: 2010-09-28 21:17:49 +0000 (Tue, 28 Sep 2010) Log Message: ----------- Now only accepts GET & HEAD Dates are in GMT Changes format and content of Link headers Modified Paths: -------------- trunk/archive-access/projects/wayback/wayback-webapp/src/main/webapp/WEB-INF/query/Memento.jsp Modified: trunk/archive-access/projects/wayback/wayback-webapp/src/main/webapp/WEB-INF/query/Memento.jsp =================================================================== --- trunk/archive-access/projects/wayback/wayback-webapp/src/main/webapp/WEB-INF/query/Memento.jsp 2010-09-28 21:07:22 UTC (rev 3254) +++ trunk/archive-access/projects/wayback/wayback-webapp/src/main/webapp/WEB-INF/query/Memento.jsp 2010-09-28 21:17:49 UTC (rev 3255) @@ -11,75 +11,153 @@ <%@ page import="java.util.List" %> <%@ page import="java.util.ArrayList" %> <%@ page import="org.archive.wayback.ResultURIConverter" %> +<%@ page import="java.util.TimeZone" %> +<%@ page import="java.io.PrintWriter"%> <%@ page import="org.archive.wayback.archivalurl.ArchivalUrlResultURIConverter" %> <% + //timegate implementation + String method = request.getMethod(); + // may be there is better place to put this piece of code? + if( !(method.equals("GET")||method.equals("HEAD")) ) { + response.setStatus(405); + response.setHeader("Allow", "GET, HEAD"); + return; + } + response.setHeader("Vary", "negotiate,accept-datetime"); SimpleDateFormat httpformatterl = new SimpleDateFormat( "E, dd MMM yyyy HH:mm:ss z"); + TimeZone tzo = TimeZone.getTimeZone("GMT"); + httpformatterl.setTimeZone(tzo); + SimpleDateFormat formatterk = new SimpleDateFormat("yyyyMMddHHmmss"); + formatterk.setTimeZone(tzo); Date now = new Date(); UIResults results = UIResults.extractCaptureQuery(request);//nuzno potom perepisat' WaybackRequest wbRequest = results.getWbRequest(); - //String p_url = wbRequest.getContextPrefix(); String u = wbRequest.getRequestUrl(); - // String agguri = p_url.replace("memento","ore") +"timebundle/" + u; - // String ad = wbRequest.getStartTimestamp(); - // Date sdate = wbRequest.getStartDate(); - //Date pdate = wbRequest.getAnchorDate(); + String dtdate = wbRequest.get("dtconneg"); - Date dt = now; - if (dtdate != null) { - dt = httpformatterl.parse(dtdate); - } CaptureSearchResults cResults = results.getCaptureResults(); CaptureSearchResult res = cResults.getClosest(wbRequest, true); Date closestDate = res.getCaptureDate(); - //String url = res.getRedirectUrl(); + String agguri = results.getContextConfig("aggregationPrefix") + "timebundle/" + u; String timemap = " , <" + results.getContextConfig("aggregationPrefix") + "timemap/link/" + u + ">;rel=\"timemap\"; type=\"text/csv\""; + String origlink = ", <" + u + ">;rel=\"original\""; ArchivalUrlResultURIConverter uriconverter = (ArchivalUrlResultURIConverter) results .getURIConverter(); String uriPrefix = uriconverter.getReplayURIPrefix(); String replayUrl = results.resultToReplayUrl(res); - //alternates header - String qvalue = "1.0"; //just example + StringBuffer sb = new StringBuffer(); - // sb.append("{"); - //sb.append("\"" + u +"\" "+qvalue); - //sb.append(" {dt original}},"); - //calculate X-Archive-Interval - + + String memento = ",<" + replayUrl + + ">;rel=\"memento\";datetime=\"" + + httpformatterl.format(closestDate) + "\""; StringFormatter fmt = results.getWbRequest().getFormatter(); Date f = cResults.getFirstResultDate(); Date l = cResults.getLastResultDate(); - SimpleDateFormat formatterk = new SimpleDateFormat("yyyyMMddHHmmss"); - //sb.append("{\"" + uriPrefix +formatterk.format(f)+"/" +u +"\" " +qvalue); - //sb.append(" {dt " + "\""+httpformatterl.format(f) +"\" first}}"); - sb.append(", <" + uriPrefix + formatterk.format(f) + "/" + u + + String mfl = null; + if ( (closestDate.equals(f)) && closestDate.equals(l)) { + + mfl = ", <" + uriPrefix + formatterk.format(f) + "/" + u + + ">;rel=\"first-memento memento last-memento\"; datetime=\"" + + httpformatterl.format(f) + "\""; + + } else if (closestDate.equals(f)){ + + mfl = ", <" + uriPrefix + formatterk.format(f) + "/" + u + + ">;rel=\"first-memento memento\"; datetime=\"" + + httpformatterl.format(f) + "\"" + + ", <" + uriPrefix + formatterk.format(l) + "/" + u + + ">;rel=\"last-memento\"; datetime=\"" + + httpformatterl.format(l) + "\""; + + } else if (closestDate.equals(l)) { + + mfl = ", <" + uriPrefix + formatterk.format(l) + "/" + u + + ">;rel=\"last-memento memento\"; datetime=\"" + + httpformatterl.format(l) + "\"" + + ", <" + uriPrefix + formatterk.format(f) + "/" + u + ">;rel=\"first-memento\"; datetime=\"" - + httpformatterl.format(f) + "\""); - if (!f.equals(l)) { + + httpformatterl.format(f) + "\""; - // sb.append(","); - // sb.append("{\"" + uriPrefix +formatterk.format(l)+"/" +u +"\" " +qvalue); - // sb.append(" {dt " + "\""+httpformatterl.format(l) +"\" last}}"); - sb.append(", <" + uriPrefix + formatterk.format(f) + "/" + u - + ">;rel=\"last-memento\"; datetime=\"" - + httpformatterl.format(f) + "\""); + } else { + + mfl = memento + + ", <" + uriPrefix + formatterk.format(l) + "/" + u + + ">;rel=\"last-memento\"; datetime=\"" + + httpformatterl.format(l) + "\"" + + ", <" + uriPrefix + formatterk.format(f) + "/" + u + + ">;rel=\"first-memento\"; datetime=\"" + + httpformatterl.format(f) + "\""; } - - //response.setHeader("X-Archive-Interval","{"+httpformatterl.format(f)+"} - {"+httpformatterl.format(l)+"}"); - + + sb = new StringBuffer(mfl); + + if (dtdate==null) dtdate=""; + + + //special handling date unparsable case + if (dtdate.equals("unparsable")) { + String fl= null; + if (f.equals(l)) { + fl=", <" + uriPrefix + formatterk.format(f) + "/" + u + + ">;rel=\"last-memento first-memento\"; datetime=\"" + + httpformatterl.format(f) + "\""; + + } else { + fl = ", <" + uriPrefix + formatterk.format(l) + "/" + u + + ">;rel=\"last-memento\"; datetime=\"" + + httpformatterl.format(l) + "\""; + fl =fl +", <" + uriPrefix + formatterk.format(f) + "/" + u + + ">;rel=\"first-memento\"; datetime=\"" + + httpformatterl.format(f) + "\""; + } + response.setHeader("TCN", "list"); + response.setStatus(400); + response.setHeader("Link", "<" + agguri + + ">;rel=\"timebundle\"" + origlink + fl + + timemap); + + + + StringBuffer sberr = new StringBuffer(); + sberr.append("<html><head><title>400 Bad Request</title></head><body>" ); + sberr.append("<center><table width='800px'><tr><td><div style='background-color: #e0e0e0; padding: 10px;'><br/>"); + sberr.append("<center><b>Error: 400</b><center>" ); + sberr.append("<center><p>Bad Date Request.</p>" ); + sberr.append("However, we found archived resources available in the following time-range: " ); + sberr.append("<i><blockquote><ul> " ); + + sberr.append("<li>Very first available Memento "+ " at "+ uriPrefix + formatterk.format(f) + "/" + u +"</BR>\n" ); + sberr.append("<li>Most recent available Memento " + " at " + uriPrefix + formatterk.format(f) + "/" + u +"</BR>\n" ); + + + sberr.append("</ul> </blockquote></i>" ); + sberr.append("<br/></div></td></tr>"); + sberr.append("</table>"); + sberr.append("</body></html>"); + PrintWriter pw = response.getWriter(); + response.setContentType("text/html"); + pw.print(sberr.toString()); + pw.flush(); + pw.close(); + return; + } + + // calculate closest values for alternates - CaptureSearchResult closestleft = null; CaptureSearchResult closestright = null; long rclosestDistance = 0; @@ -88,16 +166,14 @@ String anchorDate = null; long maxWindow = -1; - //long wantTime = wbRequest.getReplayDate().getTime(); long wantTime = closestDate.getTime(); - + Iterator<CaptureSearchResult> itr = cResults.iterator(); while (itr.hasNext()) { cur = itr.next(); cur.getCaptureDate(); - //long curDistance = Math.abs(wantTime - cur.getCaptureDate().getTime()); - long curDistance = wantTime - cur.getCaptureDate().getTime(); - // == 0 propuskaem + long curDistance = cur.getCaptureDate().getTime()-wantTime; + // == 0 skip if (curDistance > 0) { if ((closestright == null) || (Math.abs(curDistance) < Math @@ -118,75 +194,38 @@ } - if ((dt.before(f)) || dt.after(now)) { - //if ((pdate.before(f))||pdate.after(now)) { - response.setHeader("TCN", "list"); - response.setStatus(406); - // response.setHeader("Link","<"+agguri+">;rel=\"aggregation\""); - // sb.append("}"); - // response.setHeader("Alternates",sb.toString()); - } else { - // SimpleDateFormat formatterk = new SimpleDateFormat("yyyyMMddHHmmss"); - - // StringBuffer sb = new StringBuffer(); - - // List list = new ArrayList(); - if (closestleft != null) { - if (!closestleft.getCaptureDate().equals(f)) { - // sb.append(","); - // sb.append("{\"" + uriPrefix +formatterk.format(closestleft.getCaptureDate())+"/" +u +"\" "+qvalue); - // sb.append(" {dt " +"\""+httpformatterl.format(closestleft.getCaptureDate()) +"\" prev} {type " + closestleft.getMimeType() +"}}"); - sb.append(", <" + uriPrefix + formatterk.format(f) - + "/" + u - + ">;rel=\"prev-memento\"; datetime=\"" - + httpformatterl.format(f) + "\""); - // list.add(closestleft); - } + + + if (closestleft != null) { + if (!(closestleft.getCaptureDate().equals(f))) { + sb.append(", <" + uriPrefix + formatterk.format(closestleft.getCaptureDate()) + + "/" + u + + ">;rel=\"prev-memento\"; datetime=\"" + + httpformatterl.format(closestleft.getCaptureDate()) + "\""); + } else { + int m_index = sb.lastIndexOf("\"first-memento\""); + sb.insert(m_index + 1, "prev-memento "); } - if (closestright != null) { - if (!closestright.getCaptureDate().equals(l)) { - // sb.append(","); - // sb.append("{\"" + uriPrefix +formatterk.format(closestright.getCaptureDate())+"/" +u +"\" " +qvalue); - //sb.append(" {dt " +"\""+httpformatterl.format(closestright.getCaptureDate()) +"\" next} {type " + closestright.getMimeType() +"}}"); - sb.append(", <" + uriPrefix + formatterk.format(f) - + "/" + u - + ">;rel=\"next-memento\"; datetime=\"" - + httpformatterl.format(f) + "\""); - } - - // list.add(closestright); + } + if (closestright != null) { + if (!(closestright.getCaptureDate().equals(l))) { + sb.append(", <" + uriPrefix + formatterk.format(closestright.getCaptureDate()) + + "/" + u + + ">;rel=\"next-memento\"; datetime=\"" + + httpformatterl.format(closestright.getCaptureDate()) + "\""); + } else { + int m_index = sb.lastIndexOf("\"last-memento\""); + sb.insert(m_index + 1, "next-memento "); } + } + + + response.setHeader("Link", "<" + agguri + + ">;rel=\"timebundle\"" + origlink + sb.toString() + + timemap); //added timemap + + response.setHeader("TCN", "choice"); + response.setHeader("Location", replayUrl); + response.sendError(302, "Found"); - // Iterator it = list.iterator(); - //int count=0; - //while (it.hasNext()) { - - // count++; - //CaptureSearchResult alt = (CaptureSearchResult) it.next(); - - // sb.append("{"); - //sb.append("\"" + uriPrefix +formatterk.format(alt.getCaptureDate())+"/" +u +"\" "); - //sb.append("{dt " + httpformatterl.format(alt.getCaptureDate()) +"} {type " + alt.getMimeType() +"}"); - - //sb.append("}"); - //if (count!=list.size()) { - // sb.append(","); } - - //} - - // sb.append("}"); - String origlink = ", <" + u + ">;rel=\"original\""; - String memento = ",<" + replayUrl - + ">;rel=\"memento\";datetime=\"" - + httpformatterl.format(closestDate) + "\""; - response.setHeader("Link", "<" + agguri - + ">;rel=\"timebundle\"" + origlink + sb.toString() - + memento + timemap); //added timemap - // response.setHeader("Alternates",sb.toString()); - response.setHeader("TCN", "choice"); - response.setHeader("Location", replayUrl); - // response.setStatus(302,"Found"); //does'not work - response.sendError(302, "Found"); - - } %> \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bra...@us...> - 2010-11-11 05:26:15
|
Revision: 3329 http://archive-access.svn.sourceforge.net/archive-access/?rev=3329&view=rev Author: bradtofel Date: 2010-11-11 05:26:09 +0000 (Thu, 11 Nov 2010) Log Message: ----------- BUGFIX: was not sending correct Location redirect URL, was using resultToReplayUrl, which uses AccessPoint ResultURIConverter, which was recently changed to not rewrite URLs. Now explicitly uses an ArchivalUrl object to construct the correct Location. Modified Paths: -------------- trunk/archive-access/projects/wayback/wayback-webapp/src/main/webapp/WEB-INF/query/Memento.jsp Modified: trunk/archive-access/projects/wayback/wayback-webapp/src/main/webapp/WEB-INF/query/Memento.jsp =================================================================== --- trunk/archive-access/projects/wayback/wayback-webapp/src/main/webapp/WEB-INF/query/Memento.jsp 2010-11-11 05:22:40 UTC (rev 3328) +++ trunk/archive-access/projects/wayback/wayback-webapp/src/main/webapp/WEB-INF/query/Memento.jsp 2010-11-11 05:26:09 UTC (rev 3329) @@ -1,4 +1,5 @@ <%@ page import="java.util.Date" +%><%@ page import="org.archive.wayback.archivalurl.ArchivalUrl" %><%@ page import="org.archive.wayback.core.UIResults" %><%@ page import="org.archive.wayback.util.StringFormatter" %><%@ page import="org.archive.wayback.core.WaybackRequest" @@ -53,7 +54,10 @@ + ">;rel=\"timemap\"; type=\"text/csv\""; String origlink = ", <" + u + ">;rel=\"original\""; String uriPrefix = wbRequest.getAccessPoint().getReplayPrefix(); - String replayUrl = results.resultToReplayUrl(res); + + ArchivalUrl aUrl = new ArchivalUrl(wbRequest); + String replayUrl = uriPrefix + aUrl.toString(res.getCaptureTimestamp(), + res.getOriginalUrl()); StringBuffer sb = new StringBuffer(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |