You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by bt...@apache.org on 2024/11/18 07:48:49 UTC
(james-project) 04/09: [FIX] FetchProcessor: get selected mailbox as part of the reactive chain
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 c081867d60e5810b21804481ce5297a2a042aa43
Author: Benoit TELLIER <bt...@linagora.com>
AuthorDate: Wed Nov 6 13:16:43 2024 +0100
[FIX] FetchProcessor: get selected mailbox as part of the reactive chain
---
.../james/imap/processor/fetch/FetchProcessor.java | 35 ++++++++++++----------
1 file changed, 20 insertions(+), 15 deletions(-)
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java
index ca5baf9183..5a19054e0b 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java
@@ -153,12 +153,27 @@ public class FetchProcessor extends AbstractMailboxProcessor<FetchRequest> {
IdRange[] idSet = request.getIdSet();
FetchData fetch = computeFetchData(request, session);
long changedSince = fetch.getChangedSince();
- MailboxSession mailboxSession = session.getMailboxSession();
- SelectedMailbox selected = session.getSelected();
- return Optional.ofNullable(selected)
- .map(s -> Mono.from(getMailboxManager().getMailboxReactive(s.getMailboxId(), mailboxSession)))
- .orElseGet(() -> Mono.error(new MailboxException("Session not in SELECTED state")))
+ return Mono.fromCallable(() -> Optional.ofNullable(session.getSelected()))
+ .<SelectedMailbox>handle((a, sink) -> a.ifPresentOrElse(sink::next, () -> sink.error(new MailboxException("Session not in SELECTED state"))))
+ .flatMap(selected -> processFetch(request, session, responder, selected, fetch, changedSince))
+ .doOnEach(logOnError(MessageRangeException.class, e -> LOGGER.debug("Fetch failed for mailbox {} because of invalid sequence-set {}",
+ Optional.ofNullable(session.getSelected()).map(SelectedMailbox::getMailboxId), idSet, e)))
+ .onErrorResume(MessageRangeException.class, e -> {
+ taggedBad(request, responder, HumanReadableText.INVALID_MESSAGESET);
+ return Mono.empty();
+ })
+ .doOnEach(logOnError(MailboxException.class, e -> LOGGER.error("Fetch failed for mailbox {} and sequence-set {}",
+ Optional.ofNullable(session.getSelected()).map(SelectedMailbox::getMailboxId), idSet, e)))
+ .onErrorResume(MailboxException.class, e -> {
+ no(request, responder, HumanReadableText.SEARCH_FAILED);
+ return Mono.empty();
+ });
+ }
+
+ private Mono<Void> processFetch(FetchRequest request, ImapSession session, Responder responder, SelectedMailbox selected, FetchData fetch, long changedSince) {
+ MailboxSession mailboxSession = session.getMailboxSession();
+ return Mono.from(getMailboxManager().getMailboxReactive(selected.getMailboxId(), mailboxSession))
.flatMap(Throwing.<MessageManager, Mono<Void>>function(mailbox -> {
boolean vanished = fetch.getVanished();
if (vanished && !EnableProcessor.getEnabledCapabilities(session).contains(ImapConstants.SUPPORTS_QRESYNC)) {
@@ -184,16 +199,6 @@ public class FetchProcessor extends AbstractMailboxProcessor<FetchRequest> {
return doFetch(selected, request, responder, fetch, mailboxSession, mailbox, session);
}).sneakyThrow())
- .doOnEach(logOnError(MessageRangeException.class, e -> LOGGER.debug("Fetch failed for mailbox {} because of invalid sequence-set {}", selected.getMailboxId(), idSet, e)))
- .onErrorResume(MessageRangeException.class, e -> {
- taggedBad(request, responder, HumanReadableText.INVALID_MESSAGESET);
- return Mono.empty();
- })
- .doOnEach(logOnError(MailboxException.class, e -> LOGGER.error("Fetch failed for mailbox {} and sequence-set {}", selected.getMailboxId(), idSet, e)))
- .onErrorResume(MailboxException.class, e -> {
- no(request, responder, HumanReadableText.SEARCH_FAILED);
- return Mono.empty();
- })
.then();
}
---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org