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 }