Mercurial > hg > nginx-quic
comparison src/imap/ngx_imap_parse.c @ 419:47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Thu, 09 Sep 2004 15:40:48 +0000 |
parents | 0526206251f6 |
children | 01456a419cf9 |
comparison
equal
deleted
inserted
replaced
418:cf072d26d6d6 | 419:47709bff4468 |
---|---|
3 #include <ngx_core.h> | 3 #include <ngx_core.h> |
4 #include <ngx_event.h> | 4 #include <ngx_event.h> |
5 #include <ngx_imap.h> | 5 #include <ngx_imap.h> |
6 | 6 |
7 | 7 |
8 ngx_int_t ngx_pop3_parse_command(ngx_imap_request_t *r) | 8 ngx_int_t ngx_pop3_parse_command(ngx_imap_session_t *s) |
9 { | 9 { |
10 u_char ch, *p, *c; | 10 u_char ch, *p, *c; |
11 ngx_str_t *arg; | |
11 enum { | 12 enum { |
12 sw_start = 0, | 13 sw_start = 0, |
14 sw_spaces_before_argument, | |
15 sw_argument, | |
16 sw_almost_done, | |
13 sw_done | 17 sw_done |
14 } state; | 18 } state; |
15 | 19 |
16 while (p < r->buf->last && state < sw_done) { | 20 state = s->state; |
21 p = s->buffer->pos; | |
22 | |
23 while (p < s->buffer->last && state < sw_done) { | |
17 ch = *p++; | 24 ch = *p++; |
18 | 25 |
19 switch (state) { | 26 switch (state) { |
20 | 27 |
21 /* POP3 commands */ | 28 /* POP3 command */ |
29 | |
22 case sw_start: | 30 case sw_start: |
23 if (ch == ' ') { | 31 if (ch == ' ' || ch == CR || ch == LF) { |
24 c = r->buf->start; | 32 c = s->buffer->start; |
25 | 33 |
26 if (p - 1 - m == 4) { | 34 if (p - 1 - c == 4) { |
27 | 35 |
28 if (*c == 'U' && *(c + 1) == 'S' | 36 if (c[0] == 'U' && c[1] == 'S' |
29 && *(c + 2) == 'E' && *(c + 3) == 'R') | 37 && c[2] == 'E' && c[3] == 'R') |
30 { | 38 { |
31 r->command = NGX_POP3_USER; | 39 s->command = NGX_POP3_USER; |
32 | 40 |
33 } else if (*c == 'P' && *(c + 1) == 'A' | 41 } else if (c[0] == 'P' && c[1] == 'A' |
34 && *(c + 2) == 'A' && *(c + 3) == 'S') | 42 && c[2] == 'A' && c[3] == 'S') |
35 { | 43 { |
36 r->method = NGX_POP3_PASS; | 44 s->command = NGX_POP3_PASS; |
37 | 45 |
38 } else if (*c == 'Q' && *(c + 1) == 'U' | 46 } else if (c[0] == 'Q' && c[1] == 'U' |
39 && *(c + 2) == 'I' && *(c + 3) == 'T') | 47 && c[2] == 'I' && c[3] == 'T') |
40 { | 48 { |
41 r->method = NGX_POP3_QUIT; | 49 s->command = NGX_POP3_QUIT; |
42 | 50 |
43 } else if (*c == 'N' && *(c + 1) == 'O' | 51 #if 0 |
44 && *(c + 2) == 'O' && *(c + 3) == 'P') | 52 } else if (c[0] == 'N' && c[1] == 'O' |
53 && c[2] == 'O' && c[3] == 'P') | |
45 { | 54 { |
46 r->method = NGX_POP3_NOOP; | 55 s->command = NGX_POP3_NOOP; |
56 #endif | |
57 | |
58 } else { | |
59 return NGX_IMAP_PARSE_INVALID_COMMAND; | |
47 } | 60 } |
61 | |
62 } else { | |
63 return NGX_IMAP_PARSE_INVALID_COMMAND; | |
48 } | 64 } |
49 | 65 |
50 state = sw_spaces_before_arg; | 66 switch (ch) { |
67 case ' ': | |
68 state = sw_spaces_before_argument; | |
69 break; | |
70 case CR: | |
71 state = sw_almost_done; | |
72 break; | |
73 case LF: | |
74 state = sw_done; | |
75 break; | |
76 } | |
51 break; | 77 break; |
52 } | 78 } |
53 | 79 |
54 if (ch < 'A' || ch > 'Z') { | 80 if (ch < 'A' || ch > 'Z') { |
55 return NGX_IMAP_PARSE_INVALID_COMMAND; | 81 return NGX_IMAP_PARSE_INVALID_COMMAND; |
56 } | 82 } |
57 | 83 |
58 break; | 84 break; |
59 } | 85 |
86 /* the spaces before the argument */ | |
87 case sw_spaces_before_argument: | |
88 switch (ch) { | |
89 case ' ': | |
90 break; | |
91 case CR: | |
92 state = sw_almost_done; | |
93 s->arg_end = p - 1; | |
94 break; | |
95 case LF: | |
96 state = sw_done; | |
97 s->arg_end = p - 1; | |
98 break; | |
99 default: | |
100 if (s->args.nelts > 2) { | |
101 return NGX_IMAP_PARSE_INVALID_COMMAND; | |
102 } | |
103 | |
104 state = sw_argument; | |
105 s->arg_start = p - 1; | |
106 break; | |
107 } | |
108 break; | |
109 | |
110 /* the argument */ | |
111 case sw_argument: | |
112 switch (ch) { | |
113 case ' ': | |
114 case CR: | |
115 case LF: | |
116 if (!(arg = ngx_array_push(&s->args))) { | |
117 return NGX_ERROR; | |
118 } | |
119 arg->len = p - s->arg_start; | |
120 arg->data = s->arg_start; | |
121 s->arg_start = NULL; | |
122 | |
123 switch (ch) { | |
124 case ' ': | |
125 state = sw_spaces_before_argument; | |
126 break; | |
127 case CR: | |
128 state = sw_almost_done; | |
129 break; | |
130 case LF: | |
131 state = sw_done; | |
132 break; | |
133 } | |
134 break; | |
135 | |
136 default: | |
137 break; | |
138 } | |
139 break; | |
140 | |
141 /* end of request line */ | |
142 case sw_almost_done: | |
143 switch (ch) { | |
144 case LF: | |
145 state = sw_done; | |
146 break; | |
147 default: | |
148 return NGX_IMAP_PARSE_INVALID_COMMAND; | |
149 } | |
150 break; | |
60 | 151 |
61 /* suppress warning */ | 152 /* suppress warning */ |
62 case sw_done: | 153 case sw_done: |
63 break; | 154 break; |
64 } | 155 } |
65 } | 156 } |
66 | 157 |
67 return NGX_OK; | 158 s->buffer->pos = p; |
159 | |
160 if (state == sw_done) { | |
161 if (s->arg_start) { | |
162 if (!(arg = ngx_array_push(&s->args))) { | |
163 return NGX_ERROR; | |
164 } | |
165 arg->len = s->arg_end - s->arg_start; | |
166 arg->data = s->arg_start; | |
167 s->arg_start = NULL; | |
168 } | |
169 | |
170 return NGX_OK; | |
171 | |
172 } else { | |
173 s->state = state; | |
174 return NGX_AGAIN; | |
175 } | |
68 } | 176 } |