Tech-invite3GPPspaceIETFspace
96959493929190898887868584838281807978777675747372717069686766656463626160595857565554535251504948474645444342414039383736353433323130292827262524232221201918171615141312111009080706050403020100
in Index   Prev   Next

RFC 3977

Network News Transfer Protocol (NNTP)

Pages: 125
Proposed Standard
Errata
Obsoletes:  0977
Updates:  2980
Updated by:  6048
Part 2 of 4 – Pages 25 to 61
First   Prev   Next

Top   ToC   RFC3977 - Page 25   prevText

4. The WILDMAT Format

The WILDMAT format described here is based on the version first developed by Rich Salz [SALZ1992], which was in turn derived from the format used in the UNIX "find" command to articulate file names. It was developed to provide a uniform mechanism for matching patterns in the same manner that the UNIX shell matches filenames.
Top   ToC   RFC3977 - Page 26

4.1. Wildmat Syntax

A wildmat is described by the following ABNF [RFC4234] syntax, which is an extract of that in Section 9.8. wildmat = wildmat-pattern *("," ["!"] wildmat-pattern) wildmat-pattern = 1*wildmat-item wildmat-item = wildmat-exact / wildmat-wild wildmat-exact = %x22-29 / %x2B / %x2D-3E / %x40-5A / %x5E-7E / UTF8-non-ascii ; exclude ! * , ? [ \ ] wildmat-wild = "*" / "?" Note: the characters ",", "\", "[", and "]" are not allowed in wildmats, while * and ? are always wildcards. This should not be a problem, since these characters cannot occur in newsgroup names, which is the only current use of wildmats. Backslash is commonly used to suppress the special meaning of characters, whereas brackets are used to introduce sets. However, these usages are not universal, and interpretation of these characters in the context of UTF-8 strings is potentially complex and differs from existing practice, so they were omitted from this specification. A future extension to this specification may provide semantics for these characters.

4.2. Wildmat Semantics

A wildmat is tested against a string and either matches or does not match. To do this, each constituent <wildmat-pattern> is matched against the string, and the rightmost pattern that matches is identified. If that <wildmat-pattern> is not preceded with "!", the whole wildmat matches. If it is preceded by "!", or if no <wildmat- pattern> matches, the whole wildmat does not match. For example, consider the wildmat "a*,!*b,*c*": o The string "aaa" matches because the rightmost match is with "a*". o The string "abb" does not match because the rightmost match is with "*b". o The string "ccb" matches because the rightmost match is with "*c*". o The string "xxx" does not match because no <wildmat-pattern> matches. A <wildmat-pattern> matches a string if the string can be broken into components, each of which matches the corresponding <wildmat-item> in the pattern. The matches must be in the same order, and the whole
Top   ToC   RFC3977 - Page 27
   string must be used in the match.  The pattern is "anchored"; that
   is, the first and last characters in the string must match the first
   and last item, respectively (unless that item is an asterisk matching
   zero characters).

   A <wildmat-exact> matches the same character (which may be more than
   one octet in UTF-8).

   "?" matches exactly one character (which may be more than one octet).

   "*" matches zero or more characters.  It can match an empty string,
   but it cannot match a subsequence of a UTF-8 sequence that is not
   aligned to the character boundaries.

4.3. Extensions

An NNTP server or extension MAY extend the syntax or semantics of wildmats provided that all wildmats that meet the requirements of Section 4.1 have the meaning ascribed to them by Section 4.2. Future editions of this document may also extend wildmats.

4.4. Examples

In these examples, $ and @ are used to represent the two octets %xC2 and %xA3, respectively; $@ is thus the UTF-8 encoding for the pound sterling symbol, shown as # in the descriptions. Wildmat Description of strings that match abc The one string "abc" abc,def The two strings "abc" and "def" $@ The one character string "#" a* Any string that begins with "a" a*b Any string that begins with "a" and ends with "b" a*,*b Any string that begins with "a" or ends with "b" a*,!*b Any string that begins with "a" and does not end with "b" a*,!*b,c* Any string that begins with "a" and does not end with "b", and any string that begins with "c" no matter what it ends with a*,c*,!*b Any string that begins with "a" or "c" and does not end with "b" ?a* Any string with "a" as its second character ??a* Any string with "a" as its third character *a? Any string with "a" as its penultimate character *a?? Any string with "a" as its antepenultimate character
Top   ToC   RFC3977 - Page 28

5. Session Administration Commands

5.1. Initial Connection

5.1.1. Usage

This command MUST NOT be pipelined. Responses [1] 200 Service available, posting allowed 201 Service available, posting prohibited 400 Service temporarily unavailable [2] 502 Service permanently unavailable [2] [1] These are the only valid response codes for the initial greeting; the server MUST not return any other generic response code. [2] Following a 400 or 502 response, the server MUST immediately close the connection.

5.1.2. Description

There is no command presented by the client upon initial connection to the server. The server MUST present an appropriate response code as a greeting to the client. This response informs the client whether service is available and whether the client is permitted to post. If the server will accept further commands from the client including POST, the server MUST present a 200 greeting code. If the server will accept further commands from the client, but the client is not authorized to post articles using the POST command, the server MUST present a 201 greeting code. Otherwise, the server MUST present a 400 or 502 greeting code and then immediately close the connection. 400 SHOULD be used if the issue is only temporary (for example, because of load) and the client can expect to be able to connect successfully at some point in the future without making any changes. 502 MUST be used if the client is not permitted under any circumstances to interact with the server, and MAY be used if the server has insufficient information to determine whether the issue is temporary or permanent. Note: the distinction between the 200 and 201 response codes has turned out in practice to be insufficient; for example, some servers do not allow posting until the client has authenticated, while other clients assume that a 201 response means that posting will never be possible even after authentication. Therefore, clients SHOULD use
Top   ToC   RFC3977 - Page 29
   the CAPABILITIES command (Section 5.2) rather than rely on this
   response.

5.1.3. Examples

Example of a normal connection from an authorized client that then terminates the session (see Section 5.4): [Initial connection set-up completed.] [S] 200 NNTP Service Ready, posting permitted [C] QUIT [S] 205 NNTP Service exits normally [Server closes connection.] Example of a normal connection from an authorized client that is not permitted to post, which also immediately terminates the session: [Initial connection set-up completed.] [S] 201 NNTP Service Ready, posting prohibited [C] QUIT [S] 205 NNTP Service exits normally [Server closes connection.] Example of a normal connection from an unauthorized client: [Initial connection set-up completed.] [S] 502 NNTP Service permanently unavailable [Server closes connection.] Example of a connection from a client if the server is unable to provide service: [Initial connection set-up completed.] [S] 400 NNTP Service temporarily unavailable [Server closes connection.]

5.2. CAPABILITIES

5.2.1. Usage

This command is mandatory. Syntax CAPABILITIES [keyword] Responses 101 Capability list follows (multi-line)
Top   ToC   RFC3977 - Page 30
   Parameters
     keyword    additional feature, see description

5.2.2. Description

The CAPABILITIES command allows a client to determine the capabilities of the server at any given time. This command MAY be issued at any time; the server MUST NOT require it to be issued in order to make use of any capability. The response generated by this command MAY change during a session because of other state information (which, in turn, may be changed by the effects of other commands or by external events). An NNTP client is only able to get the current and correct information concerning available capabilities at any point during a session by issuing a CAPABILITIES command at that point of that session and processing the response. The capability list is returned as a multi-line data block following the 101 response code. Each capability is described by a separate capability line. The server MUST NOT list the same capability twice in the response, even with different arguments. Except that the VERSION capability MUST be the first line, the order in which the capability lines appears is not significant; the server need not even consistently return the same order. While some capabilities are likely to be always available or never available, others (notably extensions) will appear and disappear depending on server state changes within the session or on external events between sessions. An NNTP client MAY cache the results of this command, but MUST NOT rely on the correctness of any cached results, whether from earlier in this session or from a previous session, MUST cope gracefully with the cached status being out of date, and SHOULD (if caching results) provide a way to force the cached information to be refreshed. Furthermore, a client MUST NOT use cached results in relation to security, privacy, and authentication extensions. See Section 12.6 for further discussion of this topic. The keyword argument is not used by this specification. It is provided so that extensions or revisions to this specification can include extra features for this command without requiring the CAPABILITIES command to be used twice (once to determine if the extra features are available, and a second time to make use of them). If the server does not recognise the argument (and it is a keyword), it MUST respond with the 101 response code as if the argument had been omitted. If an argument is provided that the server does recognise, it MAY use the 101 response code or MAY use some other response code
Top   ToC   RFC3977 - Page 31
   (which will be defined in the specification of that feature).  If the
   argument is not a keyword, the 501 generic response code MUST be
   returned.  The server MUST NOT generate any other response code to
   the CAPABILITIES command.

5.2.3. Examples

Example of a minimal response (a read-only server): [C] CAPABILITIES [S] 101 Capability list: [S] VERSION 2 [S] READER [S] LIST ACTIVE NEWSGROUPS [S] . Example of a response from a server that has a range of facilities and that also describes itself: [C] CAPABILITIES [S] 101 Capability list: [S] VERSION 2 [S] READER [S] IHAVE [S] POST [S] NEWNEWS [S] LIST ACTIVE NEWSGROUPS ACTIVE.TIMES OVERVIEW.FMT [S] IMPLEMENTATION INN 4.2 2004-12-25 [S] OVER MSGID [S] STREAMING [S] XSECRET [S] . Example of a server that supports more than one version of NNTP: [C] CAPABILITIES [S] 101 Capability list: [S] VERSION 2 3 [S] READER [S] LIST ACTIVE NEWSGROUPS [S] .
Top   ToC   RFC3977 - Page 32
   Example of a client attempting to use a feature of the CAPABILITIES
   command that the server does not support:

      [C] CAPABILITIES AUTOUPDATE
      [S] 101 Capability list:
      [S] VERSION 2
      [S] READER
      [S] IHAVE
      [S] LIST ACTIVE NEWSGROUPS OVERVIEW.FMT HEADERS
      [S] OVER MSGID
      [S] HDR
      [S] NEWNEWS
      [S] .

5.3. MODE READER

5.3.1. Usage

Indicating capability: MODE-READER This command MUST NOT be pipelined. Syntax MODE READER Responses 200 Posting allowed 201 Posting prohibited 502 Reading service permanently unavailable [1] [1] Following a 502 response the server MUST immediately close the connection.

5.3.2. Description

The MODE READER command instructs a mode-switching server to switch modes, as described in Section 3.4.2. If the server is mode-switching, it switches from its transit mode to its reader mode, indicating this by changing the capability list accordingly. It MUST then return a 200 or 201 response with the same meaning as for the initial greeting (as described in Section 5.1.1). Note that the response need not be the same as that presented during the initial greeting. The client MUST NOT issue MODE READER more than once in a session or after any security or privacy commands are issued. When the MODE READER command is issued, the server MAY reset its state to that immediately after the initial connection before switching mode.
Top   ToC   RFC3977 - Page 33
   If the server is not mode-switching, then the following apply:

   o  If it advertises the READER capability, it MUST return a 200 or
      201 response with the same meaning as for the initial greeting; in
      this case, the command MUST NOT affect the server state in any
      way.

   o  If it does not advertise the READER capability, it MUST return a
      502 response and then immediately close the connection.

5.3.3. Examples

Example of use of the MODE READER command on a transit-only server (which therefore does not providing reading facilities): [C] CAPABILITIES [S] 101 Capability list: [S] VERSION 2 [S] IHAVE [S] . [C] MODE READER [S] 502 Transit service only [Server closes connection.] Example of use of the MODE READER command on a server that provides reading facilities: [C] CAPABILITIES [S] 101 Capability list: [S] VERSION 2 [S] READER [S] LIST ACTIVE NEWSGROUPS [S] . [C] MODE READER [S] 200 Reader mode, posting permitted [C] IHAVE <i.am.an.article.you.have@example.com> [S] 500 Permission denied [C] GROUP misc.test [S] 211 1234 3000234 3002322 misc.test Note that in both of these situations, the client SHOULD NOT use MODE READER.
Top   ToC   RFC3977 - Page 34
   Example of use of the MODE READER command on a mode-switching server:

      [C] CAPABILITIES
      [S] 101 Capability list:
      [S] VERSION 2
      [S] IHAVE
      [S] MODE-READER
      [S] .
      [C] MODE READER
      [S] 200 Reader mode, posting permitted
      [C] CAPABILITIES
      [S] 101 Capability list:
      [S] VERSION 2
      [S] READER
      [S] NEWNEWS
      [S] LIST ACTIVE NEWSGROUPS
      [S] STARTTLS
      [S] .

   In this case, the server offers (but does not require) TLS privacy in
   its reading mode but not in its transit mode.

   Example of use of the MODE READER command where the client is not
   permitted to post:

      [C] MODE READER
      [S] 201 NNTP Service Ready, posting prohibited

5.4. QUIT

5.4.1. Usage

This command is mandatory. Syntax QUIT Responses 205 Connection closing

5.4.2. Description

The client uses the QUIT command to terminate the session. The server MUST acknowledge the QUIT command and then close the connection to the client. This is the preferred method for a client to indicate that it has finished all of its transactions with the NNTP server.
Top   ToC   RFC3977 - Page 35
   If a client simply disconnects (or if the connection times out or
   some other fault occurs), the server MUST gracefully cease its
   attempts to service the client, disconnecting from its end if
   necessary.

   The server MUST NOT generate any response code to the QUIT command
   other than 205 or, if any arguments are provided, 501.

5.4.3. Examples

[C] QUIT [S] 205 closing connection [Server closes connection.]

6. Article Posting and Retrieval

News-reading clients have available a variety of mechanisms to retrieve articles via NNTP. The news articles are stored and indexed using three types of keys. The first type of key is the message-id of an article and is globally unique. The second type of key is composed of a newsgroup name and an article number within that newsgroup. On a particular server, there MUST only be one article with a given number within any newsgroup, and an article MUST NOT have two different numbers in the same newsgroup. An article can be cross-posted to multiple newsgroups, so there may be multiple keys that point to the same article on the same server; these MAY have different numbers in each newsgroup. However, this type of key is not required to be globally unique, so the same key MAY refer to different articles on different servers. (Note that the terms "group" and "newsgroup" are equivalent.) The final type of key is the arrival timestamp, giving the time that the article arrived at the server. The server MUST ensure that article numbers are issued in order of arrival timestamp; that is, articles arriving later MUST have higher numbers than those that arrive earlier. The server SHOULD allocate the next sequential unused number to each new article. Article numbers MUST lie between 1 and 2,147,483,647, inclusive. The client and server MAY use leading zeroes in specifying article numbers but MUST NOT use more than 16 digits. In some situations, the value zero replaces an article number to show some special situation. Note that it is likely that the article number limit of 2,147,483,647 will be increased by a future revision or extension to this specification. While servers MUST NOT send article numbers greater than this current limit, client and server developers are advised to
Top   ToC   RFC3977 - Page 36
   use internal structures and datatypes capable of handling larger
   values in anticipation of such a change.

6.1. Group and Article Selection

The following commands are used to set the "currently selected newsgroup" and the "current article number", which are used by various commands. At the start of an NNTP session, both of these values are set to the special value "invalid".

6.1.1. GROUP

6.1.1.1. Usage
Indicating capability: READER Syntax GROUP group Responses 211 number low high group Group successfully selected 411 No such newsgroup Parameters group Name of newsgroup number Estimated number of articles in the group low Reported low water mark high Reported high water mark
6.1.1.2. Description
The GROUP command selects a newsgroup as the currently selected newsgroup and returns summary information about it. The required argument is the name of the newsgroup to be selected (e.g., "news.software.nntp"). A list of valid newsgroups may be obtained by using the LIST ACTIVE command (see Section 7.6.3). The successful selection response will return the article numbers of the first and last articles in the group at the moment of selection (these numbers are referred to as the "reported low water mark" and the "reported high water mark") and an estimate of the number of articles in the group currently available. If the group is not empty, the estimate MUST be at least the actual number of articles available and MUST be no greater than one more than the difference between the reported low and high water marks. (Some implementations will actually count the number of articles
Top   ToC   RFC3977 - Page 37
   currently stored.  Others will just subtract the low water mark from
   the high water mark and add one to get an estimate.)

   If the group is empty, one of the following three situations will
   occur.  Clients MUST accept all three cases; servers MUST NOT
   represent an empty group in any other way.

   o  The high water mark will be one less than the low water mark, and
      the estimated article count will be zero.  Servers SHOULD use this
      method to show an empty group.  This is the only time that the
      high water mark can be less than the low water mark.

   o  All three numbers will be zero.

   o  The high water mark is greater than or equal to the low water
      mark.  The estimated article count might be zero or non-zero; if
      it is non-zero, the same requirements apply as for a non-empty
      group.

   The set of articles in a group may change after the GROUP command is
   carried out:

   o  Articles may be removed from the group.

   o  Articles may be reinstated in the group with the same article
      number, but those articles MUST have numbers no less than the
      reported low water mark (note that this is a reinstatement of the
      previous article, not a new article reusing the number).

   o  New articles may be added with article numbers greater than the
      reported high water mark.  (If an article that was the one with
      the highest number has been removed and the high water mark has
      been adjusted accordingly, the next new article will not have the
      number one greater than the reported high water mark.)

   Except when the group is empty and all three numbers are zero,
   whenever a subsequent GROUP command for the same newsgroup is issued,
   either by the same client or a different client, the reported low
   water mark in the response MUST be no less than that in any previous
   response for that newsgroup in this session, and it SHOULD be no less
   than that in any previous response for that newsgroup ever sent to
   any client.  Any failure to meet the latter condition SHOULD be
   transient only.  The client may make use of the low water mark to
   remove all remembered information about articles with lower numbers,
   as these will never recur.  This includes the situation when the high
   water mark is one less than the low water mark.  No similar
   assumption can be made about the high water mark, as this can
Top   ToC   RFC3977 - Page 38
   decrease if an article is removed and then increase again if it is
   reinstated or if new articles arrive.

   When a valid group is selected by means of this command, the
   currently selected newsgroup MUST be set to that group, and the
   current article number MUST be set to the first article in the group
   (this applies even if the group is already the currently selected
   newsgroup).  If an empty newsgroup is selected, the current article
   number is made invalid.  If an invalid group is specified, the
   currently selected newsgroup and current article number MUST NOT be
   changed.

   The GROUP or LISTGROUP command (see Section 6.1.2) MUST be used by a
   client, and a successful response received, before any other command
   is used that depends on the value of the currently selected newsgroup
   or current article number.

   If the group specified is not available on the server, a 411 response
   MUST be returned.

6.1.1.3. Examples
Example for a group known to the server: [C] GROUP misc.test [S] 211 1234 3000234 3002322 misc.test Example for a group unknown to the server: [C] GROUP example.is.sob.bradner.or.barber [S] 411 example.is.sob.bradner.or.barber is unknown Example of an empty group using the preferred response: [C] GROUP example.currently.empty.newsgroup [S] 211 0 4000 3999 example.currently.empty.newsgroup Example of an empty group using an alternative response: [C] GROUP example.currently.empty.newsgroup [S] 211 0 0 0 example.currently.empty.newsgroup Example of an empty group using a different alternative response: [C] GROUP example.currently.empty.newsgroup [S] 211 0 4000 4321 example.currently.empty.newsgroup
Top   ToC   RFC3977 - Page 39
   Example reselecting the currently selected newsgroup:

      [C] GROUP misc.test
      [S] 211 1234 234 567 misc.test
      [C] STAT 444
      [S] 223 444 <123456@example.net> retrieved
      [C] GROUP misc.test
      [S] 211 1234 234 567 misc.test
      [C] STAT
      [S] 223 234 <different@example.net> retrieved

6.1.2. LISTGROUP

6.1.2.1. Usage
Indicating capability: READER Syntax LISTGROUP [group [range]] Responses 211 number low high group Article numbers follow (multi-line) 411 No such newsgroup 412 No newsgroup selected [1] Parameters group Name of newsgroup range Range of articles to report number Estimated number of articles in the group low Reported low water mark high Reported high water mark [1] The 412 response can only occur if no group has been specified.
6.1.2.2. Description
The LISTGROUP command selects a newsgroup in the same manner as the GROUP command (see Section 6.1.1) but also provides a list of article numbers in the newsgroup. If no group is specified, the currently selected newsgroup is used. On success, a list of article numbers is returned as a multi-line data block following the 211 response code (the arguments on the initial response line are the same as for the GROUP command). The list contains one number per line and is in numerical order. It lists precisely those articles that exist in the group at the moment of selection (therefore, an empty group produces an empty list). If the optional range argument is specified, only articles within the
Top   ToC   RFC3977 - Page 40
   range are included in the list (therefore, the list MAY be empty even
   if the group is not).

   The range argument may be any of the following:

   o  An article number.

   o  An article number followed by a dash to indicate all following.

   o  An article number followed by a dash followed by another article
      number.

   In the last case, if the second number is less than the first number,
   then the range contains no articles.  Omitting the range is
   equivalent to the range 1- being specified.

   If the group specified is not available on the server, a 411 response
   MUST be returned.  If no group is specified and the currently
   selected newsgroup is invalid, a 412 response MUST be returned.

   Except that the group argument is optional, that a range argument can
   be specified, and that a multi-line data block follows the 211
   response code, the LISTGROUP command is identical to the GROUP
   command.  In particular, when successful, the command sets the
   current article number to the first article in the group, if any,
   even if this is not within the range specified by the second
   argument.

   Note that the range argument is a new feature in this specification
   and servers that do not support CAPABILITIES (and therefore do not
   conform to this specification) are unlikely to support it.

6.1.2.3. Examples
Example of LISTGROUP being used to select a group: [C] LISTGROUP misc.test [S] 211 2000 3000234 3002322 misc.test list follows [S] 3000234 [S] 3000237 [S] 3000238 [S] 3000239 [S] 3002322 [S] .
Top   ToC   RFC3977 - Page 41
   Example of LISTGROUP on an empty group:

      [C] LISTGROUP example.empty.newsgroup
      [S] 211 0 0 0 example.empty.newsgroup list follows
      [S] .

   Example of LISTGROUP on a valid, currently selected newsgroup:

      [C] GROUP misc.test
      [S] 211 2000 3000234 3002322 misc.test
      [C] LISTGROUP
      [S] 211 2000 3000234 3002322 misc.test list follows
      [S] 3000234
      [S] 3000237
      [S] 3000238
      [S] 3000239
      [S] 3002322
      [S] .

   Example of LISTGROUP with a range:

      [C] LISTGROUP misc.test 3000238-3000248
      [S] 211 2000 3000234 3002322 misc.test list follows
      [S] 3000238
      [S] 3000239
      [S] .

   Example of LISTGROUP with an empty range:

      [C] LISTGROUP misc.test 12345678-
      [S] 211 2000 3000234 3002322 misc.test list follows
      [S] .

   Example of LISTGROUP with an invalid range:

      [C] LISTGROUP misc.test 9999-111
      [S] 211 2000 3000234 3002322 misc.test list follows
      [S] .
Top   ToC   RFC3977 - Page 42

6.1.3. LAST

6.1.3.1. Usage
Indicating capability: READER Syntax LAST Responses 223 n message-id Article found 412 No newsgroup selected 420 Current article number is invalid 422 No previous article in this group Parameters n Article number message-id Article message-id
6.1.3.2. Description
If the currently selected newsgroup is valid, the current article number MUST be set to the previous article in that newsgroup (that is, the highest existing article number less than the current article number). If successful, a response indicating the new current article number and the message-id of that article MUST be returned. No article text is sent in response to this command. There MAY be no previous article in the group, although the current article number is not the reported low water mark. There MUST NOT be a previous article when the current article number is the reported low water mark. Because articles can be removed and added, the results of multiple LAST and NEXT commands MAY not be consistent over the life of a particular NNTP session. If the current article number is already the first article of the newsgroup, a 422 response MUST be returned. If the current article number is invalid, a 420 response MUST be returned. If the currently selected newsgroup is invalid, a 412 response MUST be returned. In all three cases, the currently selected newsgroup and current article number MUST NOT be altered.
Top   ToC   RFC3977 - Page 43
6.1.3.3. Examples
Example of a successful article retrieval using LAST: [C] GROUP misc.test [S] 211 1234 3000234 3002322 misc.test [C] NEXT [S] 223 3000237 <668929@example.org> retrieved [C] LAST [S] 223 3000234 <45223423@example.com> retrieved Example of an attempt to retrieve an article without having selected a group (via the GROUP command) first: [Assumes currently selected newsgroup is invalid.] [C] LAST [S] 412 no newsgroup selected Example of an attempt to retrieve an article using the LAST command when the current article number is that of the first article in the group: [C] GROUP misc.test [S] 211 1234 3000234 3002322 misc.test [C] LAST [S] 422 No previous article to retrieve Example of an attempt to retrieve an article using the LAST command when the currently selected newsgroup is empty: [C] GROUP example.empty.newsgroup [S] 211 0 0 0 example.empty.newsgroup [C] LAST [S] 420 No current article selected
Top   ToC   RFC3977 - Page 44

6.1.4. NEXT

6.1.4.1. Usage
Indicating capability: READER Syntax NEXT Responses 223 n message-id Article found 412 No newsgroup selected 420 Current article number is invalid 421 No next article in this group Parameters n Article number message-id Article message-id
6.1.4.2. Description
If the currently selected newsgroup is valid, the current article number MUST be set to the next article in that newsgroup (that is, the lowest existing article number greater than the current article number). If successful, a response indicating the new current article number and the message-id of that article MUST be returned. No article text is sent in response to this command. If the current article number is already the last article of the newsgroup, a 421 response MUST be returned. In all other aspects (apart, of course, from the lack of 422 response), this command is identical to the LAST command (Section 6.1.3).
6.1.4.3. Examples
Example of a successful article retrieval using NEXT: [C] GROUP misc.test [S] 211 1234 3000234 3002322 misc.test [C] NEXT [S] 223 3000237 <668929@example.org> retrieved
Top   ToC   RFC3977 - Page 45
   Example of an attempt to retrieve an article without having selected
   a group (via the GROUP command) first:

      [Assumes currently selected newsgroup is invalid.]
      [C] NEXT
      [S] 412 no newsgroup selected

   Example of an attempt to retrieve an article using the NEXT command
   when the current article number is that of the last article in the
   group:

      [C] GROUP misc.test
      [S] 211 1234 3000234 3002322 misc.test
      [C] STAT 3002322
      [S] 223 3002322 <411@example.net> retrieved
      [C] NEXT
      [S] 421 No next article to retrieve

   Example of an attempt to retrieve an article using the NEXT command
   when the currently selected newsgroup is empty:

      [C] GROUP example.empty.newsgroup
      [S] 211 0 0 0 example.empty.newsgroup
      [C] NEXT
      [S] 420 No current article selected

6.2. Retrieval of Articles and Article Sections

The ARTICLE, BODY, HEAD, and STAT commands are very similar. They differ only in the parts of the article that are presented to the client and in the successful response code. The ARTICLE command is described here in full, while the other three commands are described in terms of the differences. As specified in Section 3.6, an article consists of two parts: the article headers and the article body. When responding to one of these commands, the server MUST present the entire article or appropriate part and MUST NOT attempt to alter or translate it in any way.
Top   ToC   RFC3977 - Page 46

6.2.1. ARTICLE

6.2.1.1. Usage
Indicating capability: READER Syntax ARTICLE message-id ARTICLE number ARTICLE Responses First form (message-id specified) 220 0|n message-id Article follows (multi-line) 430 No article with that message-id Second form (article number specified) 220 n message-id Article follows (multi-line) 412 No newsgroup selected 423 No article with that number Third form (current article number used) 220 n message-id Article follows (multi-line) 412 No newsgroup selected 420 Current article number is invalid Parameters number Requested article number n Returned article number message-id Article message-id
6.2.1.2. Description
The ARTICLE command selects an article according to the arguments and presents the entire article (that is, the headers, an empty line, and the body, in that order) to the client. The command has three forms. In the first form, a message-id is specified, and the server presents the article with that message-id. In this case, the server MUST NOT alter the currently selected newsgroup or current article number. This is both to facilitate the presentation of articles that may be referenced within another article being read, and because of the semantic difficulties of determining the proper sequence and membership of an article that may have been cross-posted to more than one newsgroup.
Top   ToC   RFC3977 - Page 47
   In the response, the article number MUST be replaced with zero,
   unless there is a currently selected newsgroup and the article is
   present in that group, in which case the server MAY use the article's
   number in that group.  (The server is not required to determine
   whether the article is in the currently selected newsgroup or, if so,
   what article number it has; the client MUST always be prepared for
   zero to be specified.)  The server MUST NOT provide an article number
   unless use of that number in a second ARTICLE command immediately
   following this one would return the same article.  Even if the server
   chooses to return article numbers in these circumstances, it need not
   do so consistently; it MAY return zero to any such command (also see
   the STAT examples, Section 6.2.4.3).

   In the second form, an article number is specified.  If there is an
   article with that number in the currently selected newsgroup, the
   server MUST set the current article number to that number.

   In the third form, the article indicated by the current article
   number in the currently selected newsgroup is used.

   Note that a previously valid article number MAY become invalid if the
   article has been removed.  A previously invalid article number MAY
   become valid if the article has been reinstated, but this article
   number MUST be no less than the reported low water mark for that
   group.

   The server MUST NOT change the currently selected newsgroup as a
   result of this command.  The server MUST NOT change the current
   article number except when an article number argument was provided
   and the article exists; in particular, it MUST NOT change it
   following an unsuccessful response.

   Since the message-id is unique for each article, it may be used by a
   client to skip duplicate displays of articles that have been posted
   more than once, or to more than one newsgroup.

   The article is returned as a multi-line data block following the 220
   response code.

   If the argument is a message-id and no such article exists, a 430
   response MUST be returned.  If the argument is a number or is omitted
   and the currently selected newsgroup is invalid, a 412 response MUST
   be returned.  If the argument is a number and that article does not
   exist in the currently selected newsgroup, a 423 response MUST be
   returned.  If the argument is omitted and the current article number
   is invalid, a 420 response MUST be returned.
Top   ToC   RFC3977 - Page 48
6.2.1.3. Examples
Example of a successful retrieval of an article (explicitly not using an article number): [C] GROUP misc.test [S] 211 1234 3000234 3002322 misc.test [C] ARTICLE [S] 220 3000234 <45223423@example.com> [S] Path: pathost!demo!whitehouse!not-for-mail [S] From: "Demo User" <nobody@example.net> [S] Newsgroups: misc.test [S] Subject: I am just a test article [S] Date: 6 Oct 1998 04:38:40 -0500 [S] Organization: An Example Net, Uncertain, Texas [S] Message-ID: <45223423@example.com> [S] [S] This is just a test article. [S] . Example of a successful retrieval of an article by message-id: [C] ARTICLE <45223423@example.com> [S] 220 0 <45223423@example.com> [S] Path: pathost!demo!whitehouse!not-for-mail [S] From: "Demo User" <nobody@example.net> [S] Newsgroups: misc.test [S] Subject: I am just a test article [S] Date: 6 Oct 1998 04:38:40 -0500 [S] Organization: An Example Net, Uncertain, Texas [S] Message-ID: <45223423@example.com> [S] [S] This is just a test article. [S] . Example of an unsuccessful retrieval of an article by message-id: [C] ARTICLE <i.am.not.there@example.com> [S] 430 No Such Article Found Example of an unsuccessful retrieval of an article by number: [C] GROUP misc.test [S] 211 1234 3000234 3002322 news.groups [C] ARTICLE 300256 [S] 423 No article with that number
Top   ToC   RFC3977 - Page 49
   Example of an unsuccessful retrieval of an article by number because
   no newsgroup was selected first:

      [Assumes currently selected newsgroup is invalid.]
      [C] ARTICLE 300256
      [S] 412 No newsgroup selected

   Example of an attempt to retrieve an article when the currently
   selected newsgroup is empty:

      [C] GROUP example.empty.newsgroup
      [S] 211 0 0 0 example.empty.newsgroup
      [C] ARTICLE
      [S] 420 No current article selected

6.2.2. HEAD

6.2.2.1. Usage
This command is mandatory. Syntax HEAD message-id HEAD number HEAD Responses First form (message-id specified) 221 0|n message-id Headers follow (multi-line) 430 No article with that message-id Second form (article number specified) 221 n message-id Headers follow (multi-line) 412 No newsgroup selected 423 No article with that number Third form (current article number used) 221 n message-id Headers follow (multi-line) 412 No newsgroup selected 420 Current article number is invalid Parameters number Requested article number n Returned article number message-id Article message-id
Top   ToC   RFC3977 - Page 50
6.2.2.2. Description
The HEAD command behaves identically to the ARTICLE command except that, if the article exists, the response code is 221 instead of 220 and only the headers are presented (the empty line separating the headers and body MUST NOT be included).
6.2.2.3. Examples
Example of a successful retrieval of the headers of an article (explicitly not using an article number): [C] GROUP misc.test [S] 211 1234 3000234 3002322 misc.test [C] HEAD [S] 221 3000234 <45223423@example.com> [S] Path: pathost!demo!whitehouse!not-for-mail [S] From: "Demo User" <nobody@example.net> [S] Newsgroups: misc.test [S] Subject: I am just a test article [S] Date: 6 Oct 1998 04:38:40 -0500 [S] Organization: An Example Net, Uncertain, Texas [S] Message-ID: <45223423@example.com> [S] . Example of a successful retrieval of the headers of an article by message-id: [C] HEAD <45223423@example.com> [S] 221 0 <45223423@example.com> [S] Path: pathost!demo!whitehouse!not-for-mail [S] From: "Demo User" <nobody@example.net> [S] Newsgroups: misc.test [S] Subject: I am just a test article [S] Date: 6 Oct 1998 04:38:40 -0500 [S] Organization: An Example Net, Uncertain, Texas [S] Message-ID: <45223423@example.com> [S] . Example of an unsuccessful retrieval of the headers of an article by message-id: [C] HEAD <i.am.not.there@example.com> [S] 430 No Such Article Found
Top   ToC   RFC3977 - Page 51
   Example of an unsuccessful retrieval of the headers of an article by
   number:

      [C] GROUP misc.test
      [S] 211 1234 3000234 3002322 misc.test
      [C] HEAD 300256
      [S] 423 No article with that number

   Example of an unsuccessful retrieval of the headers of an article by
   number because no newsgroup was selected first:

      [Assumes currently selected newsgroup is invalid.]
      [C] HEAD 300256
      [S] 412 No newsgroup selected

   Example of an attempt to retrieve the headers of an article when the
   currently selected newsgroup is empty:

      [C] GROUP example.empty.newsgroup
      [S] 211 0 0 0 example.empty.newsgroup
      [C] HEAD
      [S] 420 No current article selected

6.2.3. BODY

6.2.3.1. Usage
Indicating capability: READER Syntax BODY message-id BODY number BODY Responses First form (message-id specified) 222 0|n message-id Body follows (multi-line) 430 No article with that message-id Second form (article number specified) 222 n message-id Body follows (multi-line) 412 No newsgroup selected 423 No article with that number
Top   ToC   RFC3977 - Page 52
   Third form (current article number used)
     222 n message-id      Body follows (multi-line)
     412                   No newsgroup selected
     420                   Current article number is invalid

   Parameters
     number        Requested article number
     n             Returned article number
     message-id    Article message-id

6.2.3.2. Description
The BODY command behaves identically to the ARTICLE command except that, if the article exists, the response code is 222 instead of 220 and only the body is presented (the empty line separating the headers and body MUST NOT be included).
6.2.3.3. Examples
Example of a successful retrieval of the body of an article (explicitly not using an article number): [C] GROUP misc.test [S] 211 1234 3000234 3002322 misc.test [C] BODY [S] 222 3000234 <45223423@example.com> [S] This is just a test article. [S] . Example of a successful retrieval of the body of an article by message-id: [C] BODY <45223423@example.com> [S] 222 0 <45223423@example.com> [S] This is just a test article. [S] . Example of an unsuccessful retrieval of the body of an article by message-id: [C] BODY <i.am.not.there@example.com> [S] 430 No Such Article Found
Top   ToC   RFC3977 - Page 53
   Example of an unsuccessful retrieval of the body of an article by
   number:

      [C] GROUP misc.test
      [S] 211 1234 3000234 3002322 misc.test
      [C] BODY 300256
      [S] 423 No article with that number

   Example of an unsuccessful retrieval of the body of an article by
   number because no newsgroup was selected first:

      [Assumes currently selected newsgroup is invalid.]
      [C] BODY 300256
      [S] 412 No newsgroup selected

   Example of an attempt to retrieve the body of an article when the
   currently selected newsgroup is empty:

      [C] GROUP example.empty.newsgroup
      [S] 211 0 0 0 example.empty.newsgroup
      [C] BODY
      [S] 420 No current article selected

6.2.4. STAT

6.2.4.1. Usage
This command is mandatory. Syntax STAT message-id STAT number STAT Responses First form (message-id specified) 223 0|n message-id Article exists 430 No article with that message-id Second form (article number specified) 223 n message-id Article exists 412 No newsgroup selected 423 No article with that number
Top   ToC   RFC3977 - Page 54
   Third form (current article number used)
     223 n message-id      Article exists
     412                   No newsgroup selected
     420                   Current article number is invalid

   Parameters
     number        Requested article number
     n             Returned article number
     message-id    Article message-id

6.2.4.2. Description
The STAT command behaves identically to the ARTICLE command except that, if the article exists, it is NOT presented to the client and the response code is 223 instead of 220. Note that the response is NOT multi-line. This command allows the client to determine whether an article exists and, in the second and third forms, what its message-id is, without having to process an arbitrary amount of text.
6.2.4.3. Examples
Example of STAT on an existing article (explicitly not using an article number): [C] GROUP misc.test [S] 211 1234 3000234 3002322 misc.test [C] STAT [S] 223 3000234 <45223423@example.com> Example of STAT on an existing article by message-id: [C] STAT <45223423@example.com> [S] 223 0 <45223423@example.com> Example of STAT on an article not on the server by message-id: [C] STAT <i.am.not.there@example.com> [S] 430 No Such Article Found Example of STAT on an article not in the server by number: [C] GROUP misc.test [S] 211 1234 3000234 3002322 misc.test [C] STAT 300256 [S] 423 No article with that number
Top   ToC   RFC3977 - Page 55
   Example of STAT on an article by number when no newsgroup was
   selected first:

      [Assumes currently selected newsgroup is invalid.]
      [C] STAT 300256
      [S] 412 No newsgroup selected

   Example of STAT on an article when the currently selected newsgroup
   is empty:

      [C] GROUP example.empty.newsgroup
      [S] 211 0 0 0 example.empty.newsgroup
      [C] STAT
      [S] 420 No current article selected

   Example of STAT by message-id on a server that sometimes reports the
   actual article number:

      [C] GROUP misc.test
      [S] 211 1234 3000234 3002322 misc.test
      [C] STAT
      [S] 223 3000234 <45223423@example.com>
      [C] STAT <45223423@example.com>
      [S] 223 0 <45223423@example.com>
      [C] STAT <45223423@example.com>
      [S] 223 3000234 <45223423@example.com>
      [C] GROUP example.empty.newsgroup
      [S] 211 0 0 0 example.empty.newsgroup
      [C] STAT <45223423@example.com>
      [S] 223 0 <45223423@example.com>
      [C] GROUP alt.crossposts
      [S] 211 9999 111111 222222 alt.crossposts
      [C] STAT <45223423@example.com>
      [S] 223 123456 <45223423@example.com>
      [C] STAT
      [S] 223 111111 <23894720@example.com>

   The first STAT command establishes the identity of an article in the
   group.  The second and third show that the server may, but need not,
   give the article number when the message-id is specified.  The fourth
   STAT command shows that zero must be specified if the article isn't
   in the currently selected newsgroup.  The fifth shows that the
   number, if provided, must be that relating to the currently selected
   newsgroup.  The last one shows that the current article number is
   still not changed by the use of STAT with a message-id even if it
   returns an article number.
Top   ToC   RFC3977 - Page 56

6.3. Article Posting

Article posting is done in one of two ways: individual article posting from news-reading clients using POST, and article transfer from other news servers using IHAVE.

6.3.1. POST

6.3.1.1. Usage
Indicating capability: POST This command MUST NOT be pipelined. Syntax POST Responses Initial responses 340 Send article to be posted 440 Posting not permitted Subsequent responses 240 Article received OK 441 Posting failed
6.3.1.2. Description
If posting is allowed, a 340 response MUST be returned to indicate that the article to be posted should be sent. If posting is prohibited for some installation-dependent reason, a 440 response MUST be returned. If posting is permitted, the article MUST be in the format specified in Section 3.6 and MUST be sent by the client to the server as a multi-line data block (see Section 3.1.1). Thus a single dot (".") on a line indicates the end of the text, and lines starting with a dot in the original text have that dot doubled during transmission. Following the presentation of the termination sequence by the client, the server MUST return a response indicating success or failure of the article transfer. Note that response codes 340 and 440 are used in direct response to the POST command while 240 and 441 are returned after the article is sent.
Top   ToC   RFC3977 - Page 57
   A response of 240 SHOULD indicate that, barring unforeseen server
   errors, the posted article will be made available on the server
   and/or transferred to other servers, as appropriate, possibly
   following further processing.  In other words, articles not wanted by
   the server SHOULD be rejected with a 441 response, rather than being
   accepted and then discarded silently.  However, the client SHOULD NOT
   assume that the article has been successfully transferred unless it
   receives an affirmative response from the server and SHOULD NOT
   assume that it is being made available to other clients without
   explicitly checking (for example, using the STAT command).

   If the session is interrupted before the response is received, it is
   possible that an affirmative response was sent but has been lost.
   Therefore, in any subsequent session, the client SHOULD either check
   whether the article was successfully posted before resending or
   ensure that the server will allocate the same message-id to the new
   attempt (see Appendix A.2).  The latter approach is preferred since
   the article might not have been made available for reading yet (for
   example, it may have to go through a moderation process).

6.3.1.3. Examples
Example of a successful posting: [C] POST [S] 340 Input article; end with <CR-LF>.<CR-LF> [C] From: "Demo User" <nobody@example.net> [C] Newsgroups: misc.test [C] Subject: I am just a test article [C] Organization: An Example Net [C] [C] This is just a test article. [C] . [S] 240 Article received OK Example of an unsuccessful posting: [C] POST [S] 340 Input article; end with <CR-LF>.<CR-LF> [C] From: "Demo User" <nobody@example.net> [C] Newsgroups: misc.test [C] Subject: I am just a test article [C] Organization: An Example Net [C] [C] This is just a test article. [C] . [S] 441 Posting failed
Top   ToC   RFC3977 - Page 58
   Example of an attempt to post when posting is not allowed:

      [Initial connection set-up completed.]
      [S] 201 NNTP Service Ready, posting prohibited
      [C] POST
      [S] 440 Posting not permitted

6.3.2. IHAVE

6.3.2.1. Usage
Indicating capability: IHAVE This command MUST NOT be pipelined. Syntax IHAVE message-id Responses Initial responses 335 Send article to be transferred 435 Article not wanted 436 Transfer not possible; try again later Subsequent responses 235 Article transferred OK 436 Transfer failed; try again later 437 Transfer rejected; do not retry Parameters message-id Article message-id
6.3.2.2. Description
The IHAVE command informs the server that the client has an article with the specified message-id. If the server desires a copy of that article, a 335 response MUST be returned, instructing the client to send the entire article. If the server does not want the article (if, for example, the server already has a copy of it), a 435 response MUST be returned, indicating that the article is not wanted. Finally, if the article isn't wanted immediately but the client should retry later if possible (if, for example, another client is in the process of sending the same article to the server), a 436 response MUST be returned.
Top   ToC   RFC3977 - Page 59
   If transmission of the article is requested, the client MUST send the
   entire article, including headers and body, to the server as a
   multi-line data block (see Section 3.1.1).  Thus, a single dot (".")
   on a line indicates the end of the text, and lines starting with a
   dot in the original text have that dot doubled during transmission.
   The server MUST return a 235 response, indicating that the article
   was successfully transferred; a 436 response, indicating that the
   transfer failed but should be tried again later; or a 437 response,
   indicating that the article was rejected.

   This function differs from the POST command in that it is intended
   for use in transferring already-posted articles between hosts.  It
   SHOULD NOT be used when the client is a personal news-reading
   program, since use of this command indicates that the article has
   already been posted at another site and is simply being forwarded
   from another host.  However, despite this, the server MAY elect not
   to post or forward the article if, after further examination of the
   article, it deems it inappropriate to do so.  Reasons for such
   subsequent rejection of an article may include problems such as
   inappropriate newsgroups or distributions, disc space limitations,
   article lengths, garbled headers, and the like.  These are typically
   restrictions enforced by the server host's news software and not
   necessarily by the NNTP server itself.

   The client SHOULD NOT assume that the article has been successfully
   transferred unless it receives an affirmative response from the
   server.  A lack of response (such as a dropped network connection or
   a network timeout) SHOULD be treated the same as a 436 response.

   Because some news server software may not immediately be able to
   determine whether an article is suitable for posting or forwarding,
   an NNTP server MAY acknowledge the successful transfer of the article
   (with a 235 response) but later silently discard it.
Top   ToC   RFC3977 - Page 60
6.3.2.3. Examples
Example of successfully sending an article to another site: [C] IHAVE <i.am.an.article.you.will.want@example.com> [S] 335 Send it; end with <CR-LF>.<CR-LF> [C] Path: pathost!demo!somewhere!not-for-mail [C] From: "Demo User" <nobody@example.com> [C] Newsgroups: misc.test [C] Subject: I am just a test article [C] Date: 6 Oct 1998 04:38:40 -0500 [C] Organization: An Example Com, San Jose, CA [C] Message-ID: <i.am.an.article.you.will.want@example.com> [C] [C] This is just a test article. [C] . [S] 235 Article transferred OK Example of sending an article to another site that rejects it. Note that the message-id in the IHAVE command is not the same as the one in the article headers; while this is bad practice and SHOULD NOT be done, it is not forbidden. [C] IHAVE <i.am.an.article.you.will.want@example.com> [S] 335 Send it; end with <CR-LF>.<CR-LF> [C] Path: pathost!demo!somewhere!not-for-mail [C] From: "Demo User" <nobody@example.com> [C] Newsgroups: misc.test [C] Subject: I am just a test article [C] Date: 6 Oct 1998 04:38:40 -0500 [C] Organization: An Example Com, San Jose, CA [C] Message-ID: <i.am.an.article.you.have@example.com> [C] [C] This is just a test article. [C] . [S] 437 Article rejected; don't send again
Top   ToC   RFC3977 - Page 61
   Example of sending an article to another site where the transfer
   fails:

      [C] IHAVE <i.am.an.article.you.will.want@example.com>
      [S] 335 Send it; end with <CR-LF>.<CR-LF>
      [C] Path: pathost!demo!somewhere!not-for-mail
      [C] From: "Demo User" <nobody@example.com>
      [C] Newsgroups: misc.test
      [C] Subject: I am just a test article
      [C] Date: 6 Oct 1998 04:38:40 -0500
      [C] Organization: An Example Com, San Jose, CA
      [C] Message-ID: <i.am.an.article.you.will.want@example.com>
      [C]
      [C] This is just a test article.
      [C] .
      [S] 436 Transfer failed

   Example of sending an article to a site that already has it:

      [C] IHAVE <i.am.an.article.you.have@example.com>
      [S] 435 Duplicate

   Example of sending an article to a site that requests that the
   article be tried again later:

      [C] IHAVE <i.am.an.article.you.defer@example.com>
      [S] 436 Retry later



(page 61 continued on part 3)

Next Section