rfc9585.original | rfc9585.txt | |||
---|---|---|---|---|
EXTRA M. Bettini | Internet Engineering Task Force (IETF) M. Bettini | |||
Internet-Draft Open-Xchange Oy | Request for Comments: 9585 Open-Xchange Oy | |||
Intended status: Standards Track 4 April 2024 | Category: Standards Track May 2024 | |||
Expires: 6 October 2024 | ISSN: 2070-1721 | |||
IMAP4 Response Code for Command Progress Notifications. | IMAP Response Code for Command Progress Notifications | |||
draft-ietf-extra-imap-inprogress-06 | ||||
Abstract | Abstract | |||
This document defines a new IMAP untagged response code, | This document defines a new IMAP untagged response code, | |||
"INPROGRESS", that provides structured numeric progress status | "INPROGRESS", that provides progress notifications regarding the | |||
indication for long-running commands. | status of long-running commands. | |||
Status of This Memo | Status of This Memo | |||
This Internet-Draft is submitted in full conformance with the | This is an Internet Standards Track document. | |||
provisions of BCP 78 and BCP 79. | ||||
Internet-Drafts are working documents of the Internet Engineering | ||||
Task Force (IETF). Note that other groups may also distribute | ||||
working documents as Internet-Drafts. The list of current Internet- | ||||
Drafts is at https://datatracker.ietf.org/drafts/current/. | ||||
Internet-Drafts are draft documents valid for a maximum of six months | This document is a product of the Internet Engineering Task Force | |||
and may be updated, replaced, or obsoleted by other documents at any | (IETF). It represents the consensus of the IETF community. It has | |||
time. It is inappropriate to use Internet-Drafts as reference | received public review and has been approved for publication by the | |||
material or to cite them other than as "work in progress." | Internet Engineering Steering Group (IESG). Further information on | |||
Internet Standards is available in Section 2 of RFC 7841. | ||||
This Internet-Draft will expire on 6 October 2024. | Information about the current status of this document, any errata, | |||
and how to provide feedback on it may be obtained at | ||||
https://www.rfc-editor.org/info/rfc9585. | ||||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2024 IETF Trust and the persons identified as the | Copyright (c) 2024 IETF Trust and the persons identified as the | |||
document authors. All rights reserved. | document authors. All rights reserved. | |||
This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
Provisions Relating to IETF Documents (https://trustee.ietf.org/ | Provisions Relating to IETF Documents | |||
license-info) in effect on the date of publication of this document. | (https://trustee.ietf.org/license-info) in effect on the date of | |||
Please review these documents carefully, as they describe your rights | publication of this document. Please review these documents | |||
and restrictions with respect to this document. Code Components | carefully, as they describe your rights and restrictions with respect | |||
extracted from this document must include Revised BSD License text as | to this document. Code Components extracted from this document must | |||
described in Section 4.e of the Trust Legal Provisions and are | include Revised BSD License text as described in Section 4.e of the | |||
provided without warranty as described in the Revised BSD License. | Trust Legal Provisions and are provided without warranty as described | |||
in the Revised BSD License. | ||||
Table of Contents | Table of Contents | |||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 2 | 1. Introduction | |||
2. Conventions Used in This Document . . . . . . . . . . . . . . 2 | 2. Conventions Used in This Document | |||
3. CAPABILITY Identification . . . . . . . . . . . . . . . . . . 3 | 3. CAPABILITY Identification | |||
4. The "INPROGRESS" Response Code . . . . . . . . . . . . . . . 3 | 4. The "INPROGRESS" Response Code | |||
5. Formal Syntax . . . . . . . . . . . . . . . . . . . . . . . . 5 | 5. Formal Syntax | |||
6. Security Considerations . . . . . . . . . . . . . . . . . . . 6 | 6. Security Considerations | |||
7. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 6 | 7. IANA Considerations | |||
8. Normative References . . . . . . . . . . . . . . . . . . . . 6 | 8. Normative References | |||
Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 7 | Author's Address | |||
1. Introduction | 1. Introduction | |||
Internet Message Access Protocol (IMAP) [RFC9051] commands can | IMAP commands [RFC9051] can require a considerable amount of time to | |||
require a considerable amount of time to be completed by the server. | be completed by the server. In these cases, the client has no | |||
In these cases, the client has no information about the progress of | information about the progress of the commands. It is already | |||
the commands. It is already possible to expose updates with a | possible to expose updates with a generic untagged response, like "* | |||
generic untagged response, like "* OK Still on it, 57% done"; | OK Still on it, 57% done"; however, this does not provide a standard | |||
however, this does not provide a standard way to communicate with the | way to communicate with the client and does not allow the server to | |||
client and allow it to inform the user of the progress of the long- | inform the client of the progress of the long-running actions. | |||
running actions. | ||||
This document extends the Internet Message Access Protocol (IMAP) | This document extends the Internet Message Access Protocol (IMAP) | |||
[RFC9051] with: | [RFC9051] with: | |||
* a new "INPROGRESS" response code [RFC5530]. The new response code | * a new "INPROGRESS" response code [RFC5530]. The new response code | |||
provides consistent means for a client to receive a progress | provides a consistent means for a client to receive progress | |||
update notifications on command completion status. | notifications on command completion status. | |||
* a new "INPROGRESS" capability [RFC9051]. The new capability | * a new "INPROGRESS" capability [RFC9051]. The new capability | |||
informs the client that the server emits progress update | informs the client that the server emits progress notifications | |||
notifications, via the "INPROGRESS" response code | via the "INPROGRESS" response code. | |||
2. Conventions Used in This Document | 2. Conventions Used in This Document | |||
"Conventions" are basic principles or procedures. Document | ||||
conventions are noted in this section. | ||||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
"OPTIONAL" in this document are to be interpreted as described in BCP | "OPTIONAL" in this document are to be interpreted as described in | |||
14 [RFC2119] [RFC8174] when, and only when, they appear in all | BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all | |||
capitals, as shown here. | capitals, as shown here. | |||
The word "can" (not "may") is used to refer to a possible | The word "can" (not "may") is used to refer to a possible | |||
circumstance or situation, as opposed to an optional facility of the | circumstance or situation, as opposed to an optional facility of the | |||
protocol. | protocol. | |||
Conventions for notations are as in [RFC9051] and [RFC5530]. | Conventions for notations are as in [RFC9051] and [RFC5530]. | |||
In examples, "C:" and "S:" indicate lines sent by the client and | In examples, "C:" and "S:" indicate lines sent by the client and | |||
server, respectively. Note that each line includes the terminating | server, respectively. Note that each line includes the terminating | |||
CRLF. | CRLF. | |||
3. CAPABILITY Identification | 3. CAPABILITY Identification | |||
IMAP servers that support this extension MUST include "INPROGRESS" in | IMAP servers that support this extension MUST include "INPROGRESS" in | |||
the response list to the CAPABILITY command. | the response list to the CAPABILITY command. | |||
4. The "INPROGRESS" Response Code | 4. The "INPROGRESS" Response Code | |||
The server MAY send the "INPROGRESS" Response Code to notify the | The server MAY send the "INPROGRESS" response code to notify the | |||
client about the progress of the commands in execution, or simply to | client about the progress of the commands in execution or simply to | |||
prevent the client from timing out and terminating the connection. | prevent the client from timing out and terminating the connection. | |||
The notifications MAY be sent for any IMAP command. If the server | The notifications MAY be sent for any IMAP command. If the server | |||
elects to send notifications, it is RECOMMENDED that these are sent | elects to send notifications, it is RECOMMENDED that these are sent | |||
every 10-15 seconds. | every 10-15 seconds. | |||
The response code is meant to appear embedded inside an untagged OK | The response code is meant to appear embedded inside an untagged OK | |||
reply. The response code MUST NOT appear in a tagged response (the | reply. The response code MUST NOT appear in a tagged response (the | |||
command has completed and further progress notifications make no | command has completed and further progress notifications make no | |||
sense). | sense). | |||
The response code MAY embed a list of details, composed in order of: | The response code MAY embed a list of details, which appear in the | |||
following order: | ||||
1. CMD-TAG: the cmd-tag [RFC9051] that originated the long-running | 1. CMD-TAG: the tag [RFC9051] that originated the long-running | |||
command. If the tag is not available, or if it contains the "]" | command. If the tag is not available or if it contains the "]" | |||
character, it MUST be set to NIL. This still produces a usable | character, it MUST be set to NIL. This still produces a usable | |||
notification, unless multiple commands are in flight | notification, unless multiple commands are in flight | |||
simultaneously. A client can ensure reception of notifications | simultaneously. A client can ensure reception of notifications | |||
with cmd-tag(s) by simply refraining from the use of character | with tags by simply refraining from the use of the character "]" | |||
"]" in the originating command tags. | in the originating command tags. | |||
2. PROGRESS: a number indicating the number of items processed so | 2. PROGRESS: a number indicating the number of items processed so | |||
far. The number MUST be non-negative and SHOULD be monotonically | far. The number MUST be non-negative and SHOULD be monotonically | |||
increasing. If the PROGRESS is not available, both PROGRESS and | increasing. If the PROGRESS is not available, both PROGRESS and | |||
GOAL MUST be set to NIL. | GOAL MUST be set to NIL. | |||
3. GOAL: a number indicating the total number of items to be | 3. GOAL: a number indicating the total number of items to be | |||
processed. The number MUST be positive and it SHOULD NOT change | processed. The number MUST be positive, and it SHOULD NOT change | |||
between successive notifications for the same command (i.e. for | between successive notifications for the same command tag. This | |||
the same cmd-tag). This is the number that PROGRESS is expected | is the number that PROGRESS is expected to reach after the | |||
to reach after the completion of the command and therefore it | completion of the command; therefore, it MUST be greater than | |||
MUST be strictly greater than PROGRESS. If the GOAL is not | PROGRESS. If the GOAL is not known, it MUST be set to NIL. | |||
known, it MUST be set to NIL. | ||||
If the response code does not embed a list of details, all details | If the response code does not embed a list of details, all details | |||
are to be interpreted as NIL. | are to be interpreted as NIL. | |||
The server can provide the progress notification details with | The server can provide the progress details with different degrees of | |||
different degrees of completeness: | completeness: | |||
- bare keepalive | - bare keepalive | |||
* OK [INPROGRESS] Hang in there.. | * OK [INPROGRESS] Hang in there... | |||
- keepalive with an indication of the command tag | - keepalive with an indication of the command tag | |||
* OK [INPROGRESS ("tag" NIL NIL)] Hang in there.. | * OK [INPROGRESS ("tag" NIL NIL)] Hang in there... | |||
- progress indication with unknown GOAL | - progress notification with unknown GOAL | |||
* OK [INPROGRESS ("tag" 175 NIL)] Processed 175 items so far | * OK [INPROGRESS ("tag" 175 NIL)] Processed 175 items so far | |||
- progress indication with the indication of the GOAL | - progress notification with an indication of the GOAL | |||
* OK [INPROGRESS ("tag" 175 1000)] Processed 17% of the items | * OK [INPROGRESS ("tag" 175 1000)] Processed 17% of the items | |||
Examples: | Examples: | |||
C: A001 search text "this will be slow" | C: A001 search text "this will be slow" | |||
[13 seconds later] | [13 seconds later] | |||
S: * OK [INPROGRESS ("A001" 454 1000)] Processed 45% of the items | S: * OK [INPROGRESS ("A001" 454 1000)] Processed 45% of the items | |||
[14 seconds later] | [14 seconds later] | |||
S: * OK [INPROGRESS ("A001" 999 1000)] Processed 99% of the items | S: * OK [INPROGRESS ("A001" 999 1000)] Processed 99% of the items | |||
[5 seconds later] | [5 seconds later] | |||
skipping to change at page 4, line 46 ¶ | skipping to change at line 178 ¶ | |||
[13 seconds later] | [13 seconds later] | |||
S: * OK [INPROGRESS ("A003" 987 2001)] Still working on this... | S: * OK [INPROGRESS ("A003" 987 2001)] Still working on this... | |||
[14 seconds later] | [14 seconds later] | |||
S: * OK [INPROGRESS ("A003" 1388 2001)] Still working on this... | S: * OK [INPROGRESS ("A003" 1388 2001)] Still working on this... | |||
[14 seconds later] | [14 seconds later] | |||
S: * OK [INPROGRESS ("A003" 1876 2001)] Still working on this... | S: * OK [INPROGRESS ("A003" 1876 2001)] Still working on this... | |||
[9 seconds later] | [9 seconds later] | |||
S: A003 OK Copy completed | S: A003 OK Copy completed | |||
PROGRESS and GOAL SHOULD be counts of the kind of item being | PROGRESS and GOAL SHOULD be counts of the kind of item being | |||
processed - in most cases, messages counts. If that is not possible, | processed -- in most cases, messages counts. If that is not | |||
the counts SHOULD be percentages, with goal set to 100 and progress | possible, the counts SHOULD be percentages, with GOAL set to 100 and | |||
varying between 0 and 99. | PROGRESS varying between 0 and 99. | |||
The server SHOULD NOT send a progress notification where PROGRESS | The server SHOULD NOT send a progress notification where PROGRESS | |||
equals GOAL, as that would mean the command is completed. In that | equals GOAL, as that would mean the command is completed. In that | |||
case, the proper tagged response should be emitted instead. | case, the proper tagged response should be emitted instead. | |||
If the command completes before the first server notification | If the command completes before the first server notification | |||
deadline, there will be no notifications at all. The client MUST | deadline, there will be no notifications at all. The client MUST | |||
assume PROGRESS to be 0 and GOAL to be unknown until the server | assume PROGRESS to be 0 and GOAL to be unknown until the server | |||
issues a notification for the command. | issues a notification for the command. | |||
While the server SHOULD keep GOAL constant and PROGRESS monotonically | While the server SHOULD keep GOAL constant and PROGRESS monotonically | |||
increasing, there are circumstances where this might not be possible. | increasing, there are circumstances where this might not be possible. | |||
The client MUST be prepared to handle cases where the server cannot | The client MUST be prepared to handle cases where the server cannot | |||
keep GOAL constant and/or PROGRESS monotonically increasing. When | keep GOAL constant and/or PROGRESS monotonically increasing. When | |||
the GOAL changes or the PROGRESS goes backward, the RECOMMENDED | the GOAL changes or the PROGRESS goes backward, the RECOMMENDED | |||
interpretation is that the previous GOAL has been reached, but the | interpretation is that the previous GOAL has been reached, but the | |||
server discovered that further (long-running) work is required | server discovered that further (long-running) work is required (with | |||
(either with known or unknown new GOAL), | a new known or unknown GOAL). | |||
The client MAY disregard progress notifications entirely or process | The client MAY disregard progress notifications entirely or process | |||
them only in relation to specific commands. If a User Interface is | them only in relation to specific commands. If a user interface is | |||
involved, it is the client's duty to decide which of these commands | involved, it is the client's duty to decide which of these | |||
are blocking on the user experience, since this may differ based on | notifications should emerge to the user interface and/or modify the | |||
implementation details. | user's ability to interact in their presence, since this may differ | |||
based on implementation details. | ||||
Also, the client MUST NOT consider the values to be authoritative for | Also, the client MUST NOT consider the values to be authoritative for | |||
any other use than evaluating the progress of the commands. E.g.: | any other use than evaluating the progress of the commands. For | |||
the client must not use the GOAL field in place of the proper output | example, the client must not use the GOAL field in place of the | |||
of a SEARCH command to know the number of messages in a folder. | proper output of a SEARCH command to know the number of messages in a | |||
folder. | ||||
5. Formal Syntax | 5. Formal Syntax | |||
The following syntax specification uses the Augmented Backus-Naur | The following syntax specification uses the Augmented Backus-Naur | |||
Form (ABNF) [RFC5234] notation. Elements not defined here can be | Form (ABNF) [RFC5234] notation. Elements not defined here can be | |||
found in the formal syntax of the ABNF [RFC5234] and IMAP [RFC9051] | found in the formal syntax of the ABNF [RFC5234] and IMAP [RFC9051] | |||
specifications. | specifications. | |||
Except as noted otherwise, all alphabetic characters are case- | Except as noted otherwise, all alphabetic characters are case- | |||
insensitive. The use of uppercase or lowercase characters to define | insensitive. The use of uppercase or lowercase characters to define | |||
skipping to change at page 6, line 10 ¶ | skipping to change at line 242 ¶ | |||
/ inprogress-state-known-goal | / inprogress-state-known-goal | |||
resp-text-code =/ "INPROGRESS" [ SP "(" inprogress-tag SP | resp-text-code =/ "INPROGRESS" [ SP "(" inprogress-tag SP | |||
inprogress-state ")" ] | inprogress-state ")" ] | |||
6. Security Considerations | 6. Security Considerations | |||
The details of the response code are not expected to disclose any | The details of the response code are not expected to disclose any | |||
information that isn't currently available from the command output. | information that isn't currently available from the command output. | |||
The progress details could be obtained anyway by sending a series of | The progress details could be obtained anyway by sending a series of | |||
commands with different workloads - either by constructing data sets | commands with different workloads -- by either constructing data sets | |||
or searching in the appropriate way. | or searching in the appropriate way. | |||
The client must protect itself against data sent by a malicious | The client must protect itself against data sent by a malicious | |||
server. Specifically, the client should guard against values that | server. Specifically, the client should guard against values that | |||
can cause arithmetic exceptions, like GOAL = 0, GOAL/VALUE < 0, GOAL/ | can cause arithmetic exceptions, like GOAL = 0, GOAL/VALUE < 0, GOAL/ | |||
VALUE >= 2^32 (these are not possible within a correct implementation | VALUE ≥ 2^32 (these are not possible within a correct implementation | |||
of the ABNF syntax above), and VALUE > GOAL. In these cases, the | of the ABNF syntax above), and VALUE > GOAL. In these cases, the | |||
notification MUST be disregarded. | notification MUST be disregarded. | |||
7. IANA Considerations | 7. IANA Considerations | |||
IANA is requested to add "INPROGRESS" to the "IMAP Response Codes" | IANA has added "INPROGRESS" to the "IMAP Response Codes" registry | |||
registry located at <https://www.iana.org/assignments/imap-response- | located at <https://www.iana.org/assignments/imap-response-codes>, | |||
codes>, with a reference to this document. | with a reference to this document. | |||
IANA is requested to add "INPROGRESS" to the "IMAP Capabilities" | IANA had added "INPROGRESS" to the "IMAP Capabilities" registry | |||
registry located at <https://www.iana.org/assignments/imap- | located at <https://www.iana.org/assignments/imap-capabilities>, with | |||
capabilities>, with a reference to this document. | a reference to this document. | |||
8. Normative References | 8. Normative References | |||
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
Requirement Levels", BCP 14, RFC 2119, | Requirement Levels", BCP 14, RFC 2119, | |||
DOI 10.17487/RFC2119, March 1997, | DOI 10.17487/RFC2119, March 1997, | |||
<https://www.rfc-editor.org/info/rfc2119>. | <https://www.rfc-editor.org/info/rfc2119>. | |||
[RFC5234] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax | [RFC5234] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax | |||
Specifications: ABNF", STD 68, RFC 5234, | Specifications: ABNF", STD 68, RFC 5234, | |||
End of changes. 30 change blocks. | ||||
92 lines changed or deleted | 87 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. |