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 16afc8a0e308e458755dcd1061bb0b93302e56e7
Author: Benoit Tellier <[email protected]>
AuthorDate: Thu Mar 10 16:01:37 2022 +0700

    [PERF] IMAP SELECT decoding should not rely on exception
    
    Filling the stacktrace for this represents 30% of decoding
    time of a workload of repeat(SELECT, FETCH)...
---
 .../apache/james/imap/decode/ImapRequestLineReader.java   | 15 +++++++++++++++
 .../decode/parser/AbstractSelectionCommandParser.java     | 10 +++-------
 2 files changed, 18 insertions(+), 7 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 25a32cc..045ebec 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
@@ -34,6 +34,7 @@ import java.nio.charset.CodingErrorAction;
 import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
 
 import javax.mail.Flags;
 
@@ -93,6 +94,20 @@ public abstract class ImapRequestLineReader {
         return next;
     }
 
+    public Optional<Character> nextWordCharLenient() throws DecodingException {
+        char next = nextChar();
+        while (next == ' ') {
+            consume();
+            next = nextChar();
+        }
+
+        if (next == '\r' || next == '\n') {
+            return Optional.empty();
+        }
+
+        return Optional.of(next);
+    }
+
     /**
      * Reads the next character in the current line. This method will continue
      * to return the same character until the {@link #consume()} method is
diff --git 
a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/AbstractSelectionCommandParser.java
 
b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/AbstractSelectionCommandParser.java
index 5014107..8959299 100644
--- 
a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/AbstractSelectionCommandParser.java
+++ 
b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/AbstractSelectionCommandParser.java
@@ -52,13 +52,9 @@ public abstract class AbstractSelectionCommandParser extends 
AbstractImapCommand
         UidRange[] uidSet = null;
         UidRange[] knownUidSet = null;
         IdRange[] knownSequenceSet = null;
-        
-        char c = Character.UNASSIGNED;
-        try {
-            c = request.nextWordChar();
-        } catch (DecodingException e) {
-            // This is expected if the request has no options like CONDSTORE 
and QRESYNC
-        }
+
+        char c = request.nextWordCharLenient()
+            .orElse((char) Character.UNASSIGNED);
         
         // Ok an option was found
         if (c == '(') {

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to