Contrary to IHAVE, for which the 436 response code can be sent to defer an article (retry later), TAKETHIS does not have such a response code.
From RFC 4644:
Responses
239 message-id Article transferred OK
439 message-id Transfer rejected; do not retry
The server MUST return either a 239 response,
indicating that the article was successfully transferred, or a 439
response, indicating that the article was rejected. If the server
encounters a temporary error that prevents it from processing the
article but does not want to reject the article, it MUST reply with a
400 response to the client and close the connection.
Yet, RFC 3977 defines a generic response code (403) for temporary internal problems, as we can see in the example:
Example of a temporary failure:
[C] GROUP archive.local
[S] 403 Archive server temporarily offline
Is the generic code 403 really not allowed for temporary errors in
TAKETHIS? (It seems to be the case when reading that explicit behaviour
to use the 400 generic code.)
FWIW, one of the case that can trigger the "can't store article" in innd
is when INT_MAX is reached. The 403 (or 400) code should really be 439
in this specific case because it is not a temporary failure.
Same thing for IHAVE which should answer 437 (reject) instead of defer
(436) in this case. We would otherwise end up with an infinite loop
where the article is stuck and kept being proposed even though the
maximum article number has been reached and INN won't be able to store
more articles in the newsgroup. (A log is also present in news.notice.)
Incidentally, though TAKETHIS does not have a response code for a "retry later" in both RFC 2980 and 4644, I've just checked what Diablo does
with TAKETHIS (which is to use 431 - the "retry later" of CHECK). And previously to the implementation of NNTP Version 2 in INN, it was using
436 (the "retry later" of IHAVE) - that I (wrongly) changed to 403. I'll
fix it.
Is the generic code 403 really not allowed for temporary errors in
TAKETHIS? (It seems to be the case when reading that explicit behaviour
to use the 400 generic code.)
Yeah, I think that's the intent. I don't remember why, though. I wonder
if someone tested with 403 and found it didn't work or something.
At the time, we probably couldn't imagine a situation where storing the article fails but storing the next article is likely to succeed, so 400
and closing the connection felt pretty reasonable.
FWIW, one of the case that can trigger the "can't store article" in innd
is when INT_MAX is reached. The 403 (or 400) code should really be 439
in this specific case because it is not a temporary failure.
Yes, and indeed I think 403 or 400 would be wrong here, because the peer would be entitled to just keep resending the same article, and it's never going to succeed.
After a TAKETHIS, well, you *have* the article, so why defer it?[...]
You're not going to save any bandwidth; you have already paid the
transit cost and you have the whole article, so just do whatever
you're going to do, accept it or reject it, don't put it off.
not thinking about cases where, say, the news server is consulting[...]> Short of that, well, you have the article now, so I think the idea is
some external spam classification oracle that's malfunctioning and
thus wants you to send the message again later.
that you should put it somewhere and deal with your problems locally
rather than asking your peer to send it yet again.
(That being said, I don't think any news server actually *does* that.)
FWIW, one of the case that can trigger the "can't store article" inI do not manage to reproduce it on my current VPS...
innd is when INT_MAX is reached.
Sysop: | Keyop |
---|---|
Location: | Huddersfield, West Yorkshire, UK |
Users: | 546 |
Nodes: | 16 (2 / 14) |
Uptime: | 21:13:28 |
Calls: | 10,390 |
Calls today: | 1 |
Files: | 14,061 |
Messages: | 6,416,983 |