From d8071296eb2de5ad682d2ba3f1fae8471e4358e7 Mon Sep 17 00:00:00 2001 From: jrandom Date: Tue, 29 Nov 2005 16:58:01 +0000 Subject: [PATCH] 2005-11-29 jrandom * Further Syndie UI cleanup * Bundled our patched MultiPartRequest code from jetty (APL2 licensed), since it hasn't been applied to the jetty CVS yet [1]. Its packaged into syndie.jar and renamed to net.i2p.syndie.web.MultiPartRequest, but will be removed as soon as its integrated into Jetty. This patch allows posting content in various character sets. [1] http://article.gmane.org/gmane.comp.java.jetty.general/6031 * Upgraded new installs to the latest stable jetty (5.1.6), though this isn't pushed as part of the update yet, as there aren't any critical bugs. --- apps/jetty/build.xml | 14 +- .../net/i2p/syndie/web/MultiPartRequest.java | 424 ++++++++++++++++++ .../src/net/i2p/syndie/web/PostServlet.java | 3 +- .../i2p/syndie/web/ViewThreadedServlet.java | 58 ++- history.txt | 14 +- .../src/net/i2p/router/RouterVersion.java | 4 +- 6 files changed, 475 insertions(+), 42 deletions(-) create mode 100644 apps/syndie/java/src/net/i2p/syndie/web/MultiPartRequest.java diff --git a/apps/jetty/build.xml b/apps/jetty/build.xml index 6f725ccc0..1befb9602 100644 --- a/apps/jetty/build.xml +++ b/apps/jetty/build.xml @@ -3,27 +3,27 @@ - + - + - + - + - + - + @@ -34,7 +34,7 @@ - + diff --git a/apps/syndie/java/src/net/i2p/syndie/web/MultiPartRequest.java b/apps/syndie/java/src/net/i2p/syndie/web/MultiPartRequest.java new file mode 100644 index 000000000..780070aa5 --- /dev/null +++ b/apps/syndie/java/src/net/i2p/syndie/web/MultiPartRequest.java @@ -0,0 +1,424 @@ +// see below for license info +package net.i2p.syndie.web; + +import org.mortbay.servlet.*; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.util.Hashtable; +import java.util.List; +import java.util.Set; +import java.util.StringTokenizer; + +import javax.servlet.http.HttpServletRequest; + +import org.mortbay.http.HttpFields; +import org.mortbay.util.LineInput; +import org.mortbay.util.MultiMap; +import org.mortbay.util.StringUtil; + +/* ------------------------------------------------------------ */ +/** + * Hacked version of Jetty's MultiPartRequest handler, applying a tiny patch for + * charset handling [1]. These changes are public domain, and will hopefully + * be integrated into Jetty so we can drop this file altogether. Of course, + * until then, this file is APL2 licensed. + * + * Original code is up at [2] + * + * [1] http://article.gmane.org/gmane.comp.java.jetty.general/6031 + * [2] http://cvs.sourceforge.net/viewcvs.py/jetty/Jetty/src/org/mortbay/servlet/ + * (rev 1.15) + * + */ +public class MultiPartRequest +{ + /* ------------------------------------------------------------ */ + HttpServletRequest _request; + LineInput _in; + String _boundary; + String _encoding; + byte[] _byteBoundary; + MultiMap _partMap = new MultiMap(10); + int _char=-2; + boolean _lastPart=false; + + /* ------------------------------------------------------------ */ + /** Constructor. + * @param request The request containing a multipart/form-data + * request + * @exception IOException IOException + */ + public MultiPartRequest(HttpServletRequest request) + throws IOException + { + _request=request; + String content_type = request.getHeader(HttpFields.__ContentType); + if (!content_type.startsWith("multipart/form-data")) + throw new IOException("Not multipart/form-data request"); + + //if(log.isDebugEnabled())log.debug("Multipart content type = "+content_type); + + _encoding = request.getCharacterEncoding(); + if (_encoding != null) + _in = new LineInput(request.getInputStream(), 2048, _encoding); + else + _in = new LineInput(request.getInputStream()); + + // Extract boundary string + _boundary="--"+ + value(content_type.substring(content_type.indexOf("boundary="))); + + //if(log.isDebugEnabled())log.debug("Boundary="+_boundary); + _byteBoundary= (_boundary+"--").getBytes(StringUtil.__ISO_8859_1); + + loadAllParts(); + } + + /* ------------------------------------------------------------ */ + /** Get the part names. + * @return an array of part names + */ + public String[] getPartNames() + { + Set s = _partMap.keySet(); + return (String[]) s.toArray(new String[s.size()]); + } + + /* ------------------------------------------------------------ */ + /** Check if a named part is present + * @param name The part + * @return true if it was included + */ + public boolean contains(String name) + { + Part part = (Part)_partMap.get(name); + return (part!=null); + } + + /* ------------------------------------------------------------ */ + /** Get the data of a part as a string. + * @param name The part name + * @return The part data + */ + public String getString(String name) + { + List part = (List)_partMap.getValues(name); + if (part==null) + return null; + if (_encoding != null) + { + try + { + return new String(((Part)part.get(0))._data, _encoding); + } + catch (UnsupportedEncodingException uee) + { + //if (log.isDebugEnabled()) log.debug("Invalid character set: " + uee); + return null; + } + } + else + { + return new String(((Part)part.get(0))._data); + } + } + + /* ------------------------------------------------------------ */ + /** + * @param name The part name + * @return The parts data + */ + public String[] getStrings(String name) + { + List parts = (List)_partMap.getValues(name); + if (parts==null) + return null; + String[] strings = new String[parts.size()]; + if (_encoding == null) { + for (int i=0; i0) + value=value.substring(0,i); + } + return value; + } + + /* ------------------------------------------------------------ */ + private class Part + { + String _name=null; + String _filename=null; + Hashtable _headers= new Hashtable(10); + byte[] _data=null; + } +}; diff --git a/apps/syndie/java/src/net/i2p/syndie/web/PostServlet.java b/apps/syndie/java/src/net/i2p/syndie/web/PostServlet.java index 3298e7702..a7cc3d7e8 100644 --- a/apps/syndie/java/src/net/i2p/syndie/web/PostServlet.java +++ b/apps/syndie/java/src/net/i2p/syndie/web/PostServlet.java @@ -8,7 +8,8 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.ServletException; -import org.mortbay.servlet.MultiPartRequest; +// temporarily, we use our overwride, until jetty applies our patches +//import org.mortbay.servlet.MultiPartRequest; import net.i2p.I2PAppContext; import net.i2p.client.naming.*; diff --git a/apps/syndie/java/src/net/i2p/syndie/web/ViewThreadedServlet.java b/apps/syndie/java/src/net/i2p/syndie/web/ViewThreadedServlet.java index 7b47223a5..d7414411e 100644 --- a/apps/syndie/java/src/net/i2p/syndie/web/ViewThreadedServlet.java +++ b/apps/syndie/java/src/net/i2p/syndie/web/ViewThreadedServlet.java @@ -247,12 +247,34 @@ public class ViewThreadedServlet extends BaseServlet { } } - out.write(" @ "); + out.write(": "); out.write(""); + EntryContainer entry = archive.getEntry(node.getEntry()); + if (entry == null) throw new RuntimeException("Unable to fetch the entry " + node.getEntry()); + + HeaderReceiver rec = new HeaderReceiver(); + parser.parse(entry.getEntry().getText(), rec); + String subject = rec.getHeader(HTMLRenderer.HEADER_SUBJECT); + if (subject == null) + subject = "(no subject)"; + out.write(trim(subject, 40)); + //out.write("\n\n"); + out.write(""); + + out.write(" (full thread)\n"); + + out.write(""); + + out.write(" latest - "); + long dayBegin = BlogManager.instance().getDayBegin(); - long postId = node.getEntry().getEntryId(); + long postId = node.getMostRecentPostDate(); if (postId >= dayBegin) { out.write("today"); } else if (postId >= dayBegin - 24*60*60*1000) { @@ -261,39 +283,13 @@ public class ViewThreadedServlet extends BaseServlet { int daysAgo = (int)((dayBegin - postId + 24*60*60*1000-1)/(24*60*60*1000)); out.write(daysAgo + " days ago"); } - - out.write(": "); - EntryContainer entry = archive.getEntry(node.getEntry()); - if (entry == null) throw new RuntimeException("Unable to fetch the entry " + node.getEntry()); - HeaderReceiver rec = new HeaderReceiver(); - parser.parse(entry.getEntry().getText(), rec); - String subject = rec.getHeader(HTMLRenderer.HEADER_SUBJECT); - if (subject == null) - subject = ""; - out.write(trim(subject, 40)); - //out.write("\n\n"); - out.write(""); - if (childCount > 0) { - out.write(" latest - "); - - postId = node.getMostRecentPostDate(); - if (postId >= dayBegin) { - out.write("today"); - } else if (postId >= dayBegin - 24*60*60*1000) { - out.write("yesterday"); - } else { - int daysAgo = (int)((dayBegin - postId + 24*60*60*1000-1)/(24*60*60*1000)); - out.write(daysAgo + " days ago"); - } - - out.write("\n"); - } + out.write("\n"); + /* out.write(" full thread\n"); + */ out.write(""); out.write("\n"); diff --git a/history.txt b/history.txt index 308e945e4..d6782919c 100644 --- a/history.txt +++ b/history.txt @@ -1,4 +1,16 @@ -$Id: history.txt,v 1.335 2005/11/28 11:02:41 jrandom Exp $ +$Id: history.txt,v 1.336 2005/11/29 07:46:34 jrandom Exp $ + +2005-11-29 jrandom + * Further Syndie UI cleanup + * Bundled our patched MultiPartRequest code from jetty (APL2 licensed), + since it hasn't been applied to the jetty CVS yet [1]. Its packaged + into syndie.jar and renamed to net.i2p.syndie.web.MultiPartRequest, but + will be removed as soon as its integrated into Jetty. This patch allows + posting content in various character sets. + [1] http://article.gmane.org/gmane.comp.java.jetty.general/6031 + * Upgraded new installs to the latest stable jetty (5.1.6), though this + isn't pushed as part of the update yet, as there aren't any critical + bugs. 2005-11-29 jrandom * Added back in the OSX jbigi, which was accidentally removed a few revs diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index 04310a4b7..b1a1fef50 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -15,9 +15,9 @@ import net.i2p.CoreVersion; * */ public class RouterVersion { - public final static String ID = "$Revision: 1.302 $ $Date: 2005/11/26 13:26:23 $"; + public final static String ID = "$Revision: 1.303 $ $Date: 2005/11/28 11:02:40 $"; public final static String VERSION = "0.6.1.6"; - public final static long BUILD = 1; + public final static long BUILD = 3; public static void main(String args[]) { System.out.println("I2P Router version: " + VERSION + "-" + BUILD); System.out.println("Router ID: " + RouterVersion.ID);