This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit c0ac4ca3058b5258ae54cbe3cabc9919875db6c6
Author: Benoit Tellier <btell...@linagora.com>
AuthorDate: Tue Mar 8 08:32:42 2022 +0700

    JAMES-3722 IMAP FETCH parsing should support several modifiers
---
 .../james/imap/decode/ImapRequestLineReader.java   |  2 +-
 .../imap/decode/parser/FetchCommandParser.java     | 43 +++++++++++-----------
 .../james/imapserver/netty/IMAPServerTest.java     |  2 -
 3 files changed, 23 insertions(+), 24 deletions(-)

diff --git 
a/protocols/imap/src/main/java/org/apache/james/imap/decode/ImapRequestLineReader.java
 
b/protocols/imap/src/main/java/org/apache/james/imap/decode/ImapRequestLineReader.java
index 045ebec..85ea774 100644
--- 
a/protocols/imap/src/main/java/org/apache/james/imap/decode/ImapRequestLineReader.java
+++ 
b/protocols/imap/src/main/java/org/apache/james/imap/decode/ImapRequestLineReader.java
@@ -351,7 +351,7 @@ public abstract class ImapRequestLineReader {
         return consumeWord(validator, false);
     }
 
-    private String consumeWord(CharacterValidator validator, boolean 
stripParen) throws DecodingException {
+    public String consumeWord(CharacterValidator validator, boolean 
stripParen) throws DecodingException {
         StringBuilder atom = new StringBuilder();
 
         char next = nextWordChar();
diff --git 
a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/FetchCommandParser.java
 
b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/FetchCommandParser.java
index d9b2fc2..f006dd2 100644
--- 
a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/FetchCommandParser.java
+++ 
b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/FetchCommandParser.java
@@ -81,39 +81,40 @@ public class FetchCommandParser extends 
AbstractUidCommandParser {
             }
             request.consumeChar(')');
             
-            
             next = nextNonSpaceChar(request);
             if (next == '(') {
                 request.consumeChar('(');
-
-                next = request.nextChar();
-                switch (next) {
-                case 'C':
-                    // Now check for the CHANGEDSINCE option which is part of 
CONDSTORE
-                    
request.consumeWord(StringMatcherCharacterValidator.ignoreCase(CHANGEDSINCE));
-                    fetch.changedSince(request.number(true));
-                    break;
-                case 'V':
-                    // Check for the VANISHED option which is part of QRESYNC
-                    
request.consumeWord(StringMatcherCharacterValidator.ignoreCase(VANISHED));
-                    fetch.vanished(true);
-                    break;
-                default:
-                    break;
-                }
-               
-                
+                parseModifier(request, fetch);
+                nextNonSpaceChar(request);
+                parseModifier(request, fetch);
+                nextNonSpaceChar(request);
                 request.consumeChar(')');
-
             }
         } else {
             addNextElement(request, fetch);
-
         }
 
         return fetch.build();
     }
 
+    private void parseModifier(ImapRequestLineReader request, 
FetchData.Builder fetch) throws DecodingException {
+        char next = request.nextChar();
+        switch (next) {
+        case 'C':
+            // Now check for the CHANGEDSINCE option which is part of CONDSTORE
+            
request.consumeWord(StringMatcherCharacterValidator.ignoreCase(CHANGEDSINCE));
+            fetch.changedSince(request.number(true));
+            break;
+        case 'V':
+            // Check for the VANISHED option which is part of QRESYNC
+            
request.consumeWord(StringMatcherCharacterValidator.ignoreCase(VANISHED), true);
+            fetch.vanished(true);
+            break;
+        default:
+            break;
+        }
+    }
+
     private void addNextElement(ImapRequestLineReader reader, 
FetchData.Builder fetch) throws DecodingException {
         // String name = element.toString();
         String name = readWord(reader, " [)\r\n");
diff --git 
a/server/protocols/protocols-imap4/src/test/java/org/apache/james/imapserver/netty/IMAPServerTest.java
 
b/server/protocols/protocols-imap4/src/test/java/org/apache/james/imapserver/netty/IMAPServerTest.java
index 686c624..8b470b5 100644
--- 
a/server/protocols/protocols-imap4/src/test/java/org/apache/james/imapserver/netty/IMAPServerTest.java
+++ 
b/server/protocols/protocols-imap4/src/test/java/org/apache/james/imapserver/netty/IMAPServerTest.java
@@ -1605,8 +1605,6 @@ class IMAPServerTest {
                 .hasSize(1);
         }
 
-        @Disabled("JAMES-3722 IMAP stack failed to parse FETCH command with 
two modifiers and thus do" +
-            "not conform to the example of the RFC-5162")
         @Test
         void fetchShouldSupportVanishedModifiedWithEarlierTag() throws 
Exception {
             inbox.delete(ImmutableList.of(MessageUid.of(14)), mailboxSession);

---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscr...@james.apache.org
For additional commands, e-mail: notifications-h...@james.apache.org

Reply via email to