[Imap-protocol] partial fetch of BODY data

Timo Sirainen tss at iki.fi
Sat May 12 01:42:41 PDT 2012


On 12.5.2012, at 10.21, Bill Shannon wrote:


> The spec says of a FETCH BODY request:

>

> Any partial fetch that attempts to read beyond the end of the

> text is truncated as appropriate. A partial fetch that starts

> at octet 0 is returned as a partial fetch, even if this

> truncation happened.


This is mainly about how the server is supposed to reply to it, i.e. it should still give BODY[]<0> reply instead of BODY[]. All partial replies may be truncated, this just tries to clarify that offset=0 shouldn't be treated as a special case.


> The spec says of a FETCH BODY response:

>

> If the origin octet is specified, this string is a substring of

> the entire body contents, starting at that origin octet. This

> means that BODY[]<0> MAY be truncated, but BODY[] is NEVER

> truncated.


This is an instruction for client implementors about what they may assume about the replies.


> It's not clear whether the truncation being talked about is the same in

> both cases. If it were only allowed to truncate the response at the end

> of the data, "BODY[]" would be allowed to be truncated as well, so it

> seems that it must be talking about truncation for some other reason.


Truncation means that a partial fetch ended before the requested number of bytes. BODY[] always requests all bytes.


> If I do "FETCH 2 (BODY[]<0.16384>)" and the server responds

> "2 FETCH (BODY[]<0> {2817}", can I assume that that's the end

> of the data or not?


If the client remembers that it fetched 16384 bytes (or anything more than 2817 bytes) it can assume it's at end of data.


> What if I request "FETCH 2 (BODY[]<16384.16384>)" and the response is

> "2 FETCH (BODY[]<16384> {2817}"? Is that a different case than above,

> since the request doesn't start at octet 0?


If this was the same mail as above then the server's reply would be an empty string. But assuming a different mail then the message's size can be assumed to be 19201 bytes.


> If I do "FETCH 2 (BODY[]<2817.16384>)" and the server responds

> "2 FETCH (BODY[]<2817> {0}" I know I'm at the end of the data.


Yes. The reply may also be "" instead of {0}.


> Is

> "2 FETCH (BODY[]<2817> NIL)" semantically equivalent? The spec says:

>

> ... If the starting octet is beyond

> the end of the text, an empty string is returned.

>

> Is "NIL" equivalent to an empty string in this case?


No.


> It would appear not,

> according to this part of the spec:

>

> The special form "NIL" represents the non-existence of a particular

> data item that is represented as a string or parenthesized list, as

> distinct from the empty string "" or the empty parenthesized list ().

>

> Even though the syntax specifies "nstring", is "NIL" a valid response

> in this case?


A well behaving server should never return NIL to any replies. But many servers do if the fetched message has already been expunged by another session.


More information about the Imap-protocol mailing list