From 9a73c6defe1c2c19142b2f5183f5659e38d3ab4f Mon Sep 17 00:00:00 2001
From: ragnarok <ragnarok>
Date: Fri, 30 Sep 2005 23:42:28 +0000
Subject: [PATCH] * Support conditional get for remote archive imports.

---
 .../java/src/net/i2p/syndie/BlogManager.java  |  1 +
 .../net/i2p/syndie/web/ArchiveServlet.java    |  8 ++++++--
 .../net/i2p/syndie/web/RemoteArchiveBean.java | 19 ++++++++++++++++++-
 3 files changed, 25 insertions(+), 3 deletions(-)

diff --git a/apps/syndie/java/src/net/i2p/syndie/BlogManager.java b/apps/syndie/java/src/net/i2p/syndie/BlogManager.java
index 0b5222acaf..55d45711b5 100644
--- a/apps/syndie/java/src/net/i2p/syndie/BlogManager.java
+++ b/apps/syndie/java/src/net/i2p/syndie/BlogManager.java
@@ -166,6 +166,7 @@ public class BlogManager {
     
     public Archive getArchive() { return _archive; }
     public File getTempDir() { return _tempDir; }
+    public File getRootDir() { return _rootDir; }
     
     public List listMyBlogs() {
         File files[] = _privKeyDir.listFiles();
diff --git a/apps/syndie/java/src/net/i2p/syndie/web/ArchiveServlet.java b/apps/syndie/java/src/net/i2p/syndie/web/ArchiveServlet.java
index faa3635913..7d03b98d50 100644
--- a/apps/syndie/java/src/net/i2p/syndie/web/ArchiveServlet.java
+++ b/apps/syndie/java/src/net/i2p/syndie/web/ArchiveServlet.java
@@ -8,6 +8,7 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.ServletException;
 
+import net.i2p.I2PAppContext;
 import net.i2p.data.*;
 import net.i2p.syndie.*;
 import net.i2p.syndie.data.*;
@@ -94,10 +95,13 @@ public class ArchiveServlet extends HttpServlet {
     private void renderSummary(HttpServletResponse resp) throws ServletException, IOException {
         resp.setContentType("text/plain;charset=utf-8");
         //resp.setCharacterEncoding("UTF-8");
+        ArchiveIndex index = BlogManager.instance().getArchive().getIndex();
+        byte[] indexUTF8 = DataHelper.getUTF8(index.toString());
         resp.setHeader(HEADER_EXPORT_CAPABLE, "true");
+        Hash hash = I2PAppContext.getGlobalContext().sha().calculateHash(indexUTF8);
+        resp.setHeader("ETag", "\"" + hash.toBase64() + "\"");
         OutputStream out = resp.getOutputStream();
-        ArchiveIndex index = BlogManager.instance().getArchive().getIndex();
-        out.write(DataHelper.getUTF8(index.toString()));
+        out.write(indexUTF8);
         out.close();
     }
     
diff --git a/apps/syndie/java/src/net/i2p/syndie/web/RemoteArchiveBean.java b/apps/syndie/java/src/net/i2p/syndie/web/RemoteArchiveBean.java
index b568f9074d..3a5c4b37e8 100644
--- a/apps/syndie/java/src/net/i2p/syndie/web/RemoteArchiveBean.java
+++ b/apps/syndie/java/src/net/i2p/syndie/web/RemoteArchiveBean.java
@@ -299,10 +299,27 @@ public class RemoteArchiveBean {
                             (_proxyHost != null ? " via " + HTMLRenderer.sanitizeString(_proxyHost) + ":" + _proxyPort : ""));
         File archiveFile = new File(BlogManager.instance().getTempDir(), user.getBlog().toBase64() + "_remoteArchive.txt");
         archiveFile.delete();
+        
+        Properties etags = new Properties();
+        try {
+            etags.load(new FileInputStream(new File(BlogManager.instance().getRootDir(), "etags")));
+        } catch (Exception exp) {
+            //ignore
+        }
+        
         EepGet eep = new EepGet(I2PAppContext.getGlobalContext(), ((_proxyHost != null) && (_proxyPort > 0)),
-                                _proxyHost, _proxyPort, 0, archiveFile.getAbsolutePath(), location);
+                                _proxyHost, _proxyPort, 0, archiveFile.getAbsolutePath(), location, etags.getProperty(location));
         eep.addStatusListener(new IndexFetcherStatusListener(archiveFile));
         eep.fetch();
+        
+        if (eep.getETag() != null) { 
+            etags.setProperty(location, eep.getETag());
+        }
+        try {
+            etags.store(new FileOutputStream(new File(BlogManager.instance().getRootDir(), "etags")), "etags");
+        } catch (Exception exp) {
+            //ignore
+        }
     }
     
     private class IndexFetcherStatusListener implements EepGet.StatusListener {
-- 
GitLab