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