You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by se...@apache.org on 2012/05/26 13:56:23 UTC

svn commit: r1342888 - in /commons/proper/net/trunk/src: changes/changes.xml main/java/org/apache/commons/net/imap/IMAP.java main/java/org/apache/commons/net/imap/IMAPReply.java

Author: sebb
Date: Sat May 26 11:56:22 2012
New Revision: 1342888

URL: http://svn.apache.org/viewvc?rev=1342888&view=rev
Log:
NET-467 - IMAPClient#fetch() does not handle literal strings

Modified:
    commons/proper/net/trunk/src/changes/changes.xml
    commons/proper/net/trunk/src/main/java/org/apache/commons/net/imap/IMAP.java
    commons/proper/net/trunk/src/main/java/org/apache/commons/net/imap/IMAPReply.java

Modified: commons/proper/net/trunk/src/changes/changes.xml
URL: http://svn.apache.org/viewvc/commons/proper/net/trunk/src/changes/changes.xml?rev=1342888&r1=1342887&r2=1342888&view=diff
==============================================================================
--- commons/proper/net/trunk/src/changes/changes.xml (original)
+++ commons/proper/net/trunk/src/changes/changes.xml Sat May 26 11:56:22 2012
@@ -65,6 +65,9 @@ The <action> type attribute can be add,u
         <release version="3.2" date="TBA" description="
 TBA
         ">
+            <action issue="NET-467" dev="sebb" type="fix">
+            IMAPClient#fetch() does not handle literal strings.
+            </action>
             <action issue="NET-458" dev="sebb" type="fix" due-to="Denis Molony">
             MVSFTPEntryParser.parseSimpleEntry - ArrayIndexOutOfBoundsException.
             </action>

Modified: commons/proper/net/trunk/src/main/java/org/apache/commons/net/imap/IMAP.java
URL: http://svn.apache.org/viewvc/commons/proper/net/trunk/src/main/java/org/apache/commons/net/imap/IMAP.java?rev=1342888&r1=1342887&r2=1342888&view=diff
==============================================================================
--- commons/proper/net/trunk/src/main/java/org/apache/commons/net/imap/IMAP.java (original)
+++ commons/proper/net/trunk/src/main/java/org/apache/commons/net/imap/IMAP.java Sat May 26 11:56:22 2012
@@ -110,6 +110,15 @@ public class IMAP extends SocketClient
 
         if (wantTag) {
             while(IMAPReply.isUntagged(line)) {
+                int literalCount = IMAPReply.literalCount(line);
+                while (literalCount >= 0) {
+                    line=_reader.readLine();
+                    if (line == null) {
+                        throw new EOFException("Connection closed without indication.");
+                    }
+                    _replyLines.add(line);
+                    literalCount -= (line.length() + 2); // Allow for CRLF
+                }
                 line = _reader.readLine();
                 if (line == null) {
                     throw new EOFException("Connection closed without indication.");

Modified: commons/proper/net/trunk/src/main/java/org/apache/commons/net/imap/IMAPReply.java
URL: http://svn.apache.org/viewvc/commons/proper/net/trunk/src/main/java/org/apache/commons/net/imap/IMAPReply.java?rev=1342888&r1=1342887&r2=1342888&view=diff
==============================================================================
--- commons/proper/net/trunk/src/main/java/org/apache/commons/net/imap/IMAPReply.java (original)
+++ commons/proper/net/trunk/src/main/java/org/apache/commons/net/imap/IMAPReply.java Sat May 26 11:56:22 2012
@@ -78,6 +78,7 @@ public final class IMAPReply
         return line.startsWith(IMAP_CONTINUATION_PREFIX);
     }
 
+    // TODO do we need trailing .* ?
     private static final String TAGGED_RESPONSE = "^\\w+ (\\S+).*"; // TODO perhaps be less strict on tag match?
     // tag cannot contain: + ( ) { SP CTL % * " \ ]
     private static final Pattern TAGGED_PATTERN = Pattern.compile(TAGGED_RESPONSE);
@@ -93,9 +94,24 @@ public final class IMAPReply
         return getReplyCode(line, TAGGED_PATTERN);
     }
 
-    private static final String UNTAGGED_RESPONSE = "^\\* (\\S+).*";
+    private static final String UNTAGGED_RESPONSE = "^\\* (\\S+).*"; // TODO do we need trailing .* ?
     private static final Pattern UNTAGGED_PATTERN = Pattern.compile(UNTAGGED_RESPONSE);
 
+    private static final Pattern LITERAL_PATTERN = Pattern.compile("\\{(\\d+)\\}$"); // {dd}
+
+    /**
+     * Checks if the line introduces a literal, i.e. ends with {dd}
+     * 
+     * @return the literal count, or -1 if there was no literal.
+     */
+    public static int literalCount(String line) {
+        Matcher m = LITERAL_PATTERN.matcher(line);
+        if (m.find()) {
+            return Integer.parseInt(m.group(1)); // Should always parse because we matched \d+
+        }
+        return -1;
+    }
+
     /**
      * Intepret the String reply code - OK, NO, BAD - in an untagged response as a integer.
      *