nntp_proxy/protocol/
codes.rs1pub const HELP_TEXT: u16 = 100;
10pub const CAPABILITY_LIST: u16 = 101;
12pub const SERVER_DATE: u16 = 111;
14
15pub const POSTING_ALLOWED: u16 = 200;
19pub const NO_POSTING: u16 = 201;
21pub const CONNECTION_CLOSING: u16 = 205;
23pub const GROUP_SELECTED: u16 = 211;
25pub const INFORMATION_FOLLOWS: u16 = 215;
27pub const ARTICLE_FOLLOWS: u16 = 220;
29pub const HEAD_FOLLOWS: u16 = 221;
31pub const BODY_FOLLOWS: u16 = 222;
33pub const ARTICLE_EXISTS: u16 = 223;
35pub const OVERVIEW_FOLLOWS: u16 = 224;
37pub const HEADERS_FOLLOW: u16 = 225;
39pub const NEW_ARTICLES_FOLLOW: u16 = 230;
41pub const NEW_GROUPS_FOLLOW: u16 = 231;
43pub const AUTH_ACCEPTED: u16 = 281;
45pub const COMPRESSION_ACTIVE: u16 = 206;
47
48pub const SEND_ARTICLE_TRANSFER: u16 = 335;
52pub const SEND_ARTICLE_POST: u16 = 340;
54pub const PASSWORD_REQUIRED: u16 = 381;
56pub const SASL_CONTINUE: u16 = 383;
58
59pub const SERVICE_UNAVAILABLE: u16 = 400;
63pub const INTERNAL_FAULT: u16 = 403;
65pub const NO_SUCH_GROUP: u16 = 411;
67pub const NO_GROUP_SELECTED: u16 = 412;
69pub const NO_CURRENT_ARTICLE: u16 = 420;
71pub const NO_NEXT_ARTICLE: u16 = 421;
73pub const NO_PREV_ARTICLE: u16 = 422;
75pub const NO_SUCH_ARTICLE_NUMBER: u16 = 423;
77pub const NO_SUCH_ARTICLE_ID: u16 = 430;
79pub const AUTH_REQUIRED: u16 = 480;
81pub const AUTH_REJECTED: u16 = 481;
83pub const AUTH_OUT_OF_SEQUENCE: u16 = 482;
85pub const ENCRYPTION_REQUIRED: u16 = 483;
87
88pub const COMMAND_NOT_RECOGNIZED: u16 = 500;
92pub const COMMAND_SYNTAX_ERROR: u16 = 501;
94pub const ACCESS_DENIED: u16 = 502;
96pub const FEATURE_NOT_SUPPORTED: u16 = 503;
98
99#[cfg(test)]
100mod tests {
101 use super::*;
102
103 #[test]
104 fn test_1xx_informational_range() {
105 assert!((100..200).contains(&HELP_TEXT));
106 assert!((100..200).contains(&CAPABILITY_LIST));
107 assert!((100..200).contains(&SERVER_DATE));
108 }
109
110 #[test]
111 fn test_2xx_success_range() {
112 let codes = [
113 POSTING_ALLOWED,
114 NO_POSTING,
115 CONNECTION_CLOSING,
116 GROUP_SELECTED,
117 INFORMATION_FOLLOWS,
118 ARTICLE_FOLLOWS,
119 HEAD_FOLLOWS,
120 BODY_FOLLOWS,
121 ARTICLE_EXISTS,
122 OVERVIEW_FOLLOWS,
123 HEADERS_FOLLOW,
124 NEW_ARTICLES_FOLLOW,
125 NEW_GROUPS_FOLLOW,
126 AUTH_ACCEPTED,
127 COMPRESSION_ACTIVE,
128 ];
129 for code in codes {
130 assert!((200..300).contains(&code), "Code {code} should be 2xx");
131 }
132 }
133
134 #[test]
135 fn test_3xx_continuation_range() {
136 let codes = [
137 SEND_ARTICLE_TRANSFER,
138 SEND_ARTICLE_POST,
139 PASSWORD_REQUIRED,
140 SASL_CONTINUE,
141 ];
142 for code in codes {
143 assert!((300..400).contains(&code), "Code {code} should be 3xx");
144 }
145 }
146
147 #[test]
148 fn test_4xx_temporary_error_range() {
149 let codes = [
150 SERVICE_UNAVAILABLE,
151 INTERNAL_FAULT,
152 NO_SUCH_GROUP,
153 NO_GROUP_SELECTED,
154 NO_CURRENT_ARTICLE,
155 NO_NEXT_ARTICLE,
156 NO_PREV_ARTICLE,
157 NO_SUCH_ARTICLE_NUMBER,
158 NO_SUCH_ARTICLE_ID,
159 AUTH_REQUIRED,
160 AUTH_REJECTED,
161 AUTH_OUT_OF_SEQUENCE,
162 ENCRYPTION_REQUIRED,
163 ];
164 for code in codes {
165 assert!((400..500).contains(&code), "Code {code} should be 4xx");
166 }
167 }
168
169 #[test]
170 fn test_5xx_permanent_error_range() {
171 let codes = [
172 COMMAND_NOT_RECOGNIZED,
173 COMMAND_SYNTAX_ERROR,
174 ACCESS_DENIED,
175 FEATURE_NOT_SUPPORTED,
176 ];
177 for code in codes {
178 assert!((500..600).contains(&code), "Code {code} should be 5xx");
179 }
180 }
181
182 #[test]
183 fn test_specific_code_values() {
184 assert_eq!(SERVICE_UNAVAILABLE, 400);
186 assert_eq!(INTERNAL_FAULT, 403);
187 assert_eq!(NO_SUCH_GROUP, 411);
188 assert_eq!(NO_GROUP_SELECTED, 412);
189 assert_eq!(NO_CURRENT_ARTICLE, 420);
190 assert_eq!(NO_NEXT_ARTICLE, 421);
191 assert_eq!(NO_PREV_ARTICLE, 422);
192 assert_eq!(NO_SUCH_ARTICLE_NUMBER, 423);
193 assert_eq!(NO_SUCH_ARTICLE_ID, 430);
194 assert_eq!(AUTH_REQUIRED, 480);
195 assert_eq!(AUTH_REJECTED, 481);
196 assert_eq!(AUTH_OUT_OF_SEQUENCE, 482);
197 assert_eq!(ENCRYPTION_REQUIRED, 483);
198
199 assert_eq!(COMMAND_NOT_RECOGNIZED, 500);
201 assert_eq!(COMMAND_SYNTAX_ERROR, 501);
202 assert_eq!(ACCESS_DENIED, 502);
203 assert_eq!(FEATURE_NOT_SUPPORTED, 503);
204 }
205}