comparison src/http/ngx_http_parse_time.c @ 25:a8b156554dfe

nginx-0.0.1-2002-12-11-19:57:54 import
author Igor Sysoev <igor@sysoev.ru>
date Wed, 11 Dec 2002 16:57:54 +0000
parents 77c7629a2627
children 53cb81681040
comparison
equal deleted inserted replaced
24:77c7629a2627 25:a8b156554dfe
1 1
2 time_t ngx_http_parse_time() 2 #include <time.h>
3
4 #define NGX_ERROR -1
5
6 static int mday[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
7
8 time_t ngx_http_parse_time(char *value, size_t len)
3 { 9 {
10 char *p, *end;
11 int day, month, year, hour, min, sec;
4 enum { 12 enum {
5 sw_start = 0, 13 no = 0,
6 } state; 14 rfc822, /* Tue 10 Nov 2002 23:50:13 */
7 15 rfc850, /* Tuesday, 10-Dec-02 23:50:13 */
8 state = sw_start; 16 isoc /* Tue Dec 10 23:50:13 2002 */
9 17 } fmt;
10 while () { 18
11 switch (state) { 19 end = value + len;
12 20
13 case sw_start: 21 for (p = value; p < end; p++) {
14 if (ch == ' ') { 22 if (*p == ',')
15 ansi = 1;
16 state = sw_month;
17
18 } else if (ch == ',')
19 state = sw_day_first_digit;
20
21 break; 23 break;
22 24
23 case sw_day_first_digit: 25 if (*p == ' ') {
24 if (ch == ' ') 26 fmt = isoc;
25 break; 27 break;
26
27 if (ch >= '0' && ch <= '9') {
28 day = ch - '0';
29 state = sw_day;
30 break;
31
32 }
33
34 return NGX_ERROR;
35
36 case sw_day:
37 if (ansi && ch == ' ') {
38 state = sw_hour_first_digit;
39 break;
40 }
41
42 if (ch >= '0' && ch <= '9') {
43 day = ch - '0';
44 state = ansi ? sw_space_before_hour : sw_before_month;
45 break;
46 }
47
48 return NGX_ERROR;
49
50 case sw_before_month:
51 if (ch == ' ') {
52 rfc822 = 1;
53 }
54
55 if (ch == '-') {
56 rfc850 = 1;
57 }
58
59 case sw_space_before_hour:
60
61
62 } 28 }
63 } 29 }
30
31 for (p++; p < end; p++)
32 if (*p != ' ')
33 break;
34
35 if (end - p < 18)
36 return NGX_ERROR;
37
38 if (fmt != isoc) {
39 if (*p < '0' || *p > '9' || *(p + 1) < '0' || *(p + 1) > '9')
40 return NGX_ERROR;
41
42 day = (*p - '0') * 10 + *(p + 1) - '0';
43 p += 2;
44
45 if (*p == ' ') {
46 if (end - p < 18)
47 return NGX_ERROR;
48 fmt = rfc822;
49
50 } else if (*p == '-') {
51 fmt = rfc850;
52
53 } else {
54 return NGX_ERROR;
55 }
56
57 p++;
58 }
59
60 switch (*p) {
61
62 case 'J':
63 month = *(p + 1) == 'a' ? 0 : *(p + 2) == 'n' ? 5 : 6;
64 break;
65
66 case 'F':
67 month = 1;
68 break;
69
70 case 'M':
71 month = *(p + 2) == 'r' ? 2 : 4;
72 break;
73
74 case 'A':
75 month = *(p + 1) == 'p' ? 3 : 7;
76 break;
77
78 case 'S':
79 month = 8;
80 break;
81
82 case 'O':
83 month = 9;
84 break;
85
86 case 'N':
87 month = 10;
88 break;
89
90 case 'D':
91 month = 11;
92 break;
93
94 default:
95 return NGX_ERROR;
96 }
97
98 p += 3;
99
100 if ((fmt == rfc822 && *p != ' ') || (fmt == rfc850 && *p != '-'))
101 return NGX_ERROR;
102
103 p++;
104
105 if (fmt == rfc822) {
106 if (*p < '0' || *p > '9' || *(p + 1) < '0' || *(p + 1) > '9'
107 || *(p + 2) < '0' || *(p + 2) > '9'
108 || *(p + 3) < '0' || *(p + 3) > '9')
109 return NGX_ERROR;
110
111 year = (*p - '0') * 1000 + (*(p + 1) - '0') * 100
112 + (*(p + 2) - '0') * 10 + *(p + 3) - '0';
113 p += 4;
114
115 } else if (fmt == rfc850) {
116 if (*p < '0' || *p > '9' || *(p + 1) < '0' || *(p + 1) > '9')
117 return NGX_ERROR;
118
119 year = (*p - '0') * 10 + *(p + 1) - '0';
120 year += (year < 70) ? 2000 : 1900;
121 p += 2;
122 }
123
124 if (fmt == isoc) {
125 if (*p == ' ')
126 p++;
127
128 if (*p < '0' || *p > '9')
129 return NGX_ERROR;
130
131 day = *p++ - '0';
132
133 if (*p != ' ') {
134 if (*p < '0' || *p > '9')
135 return NGX_ERROR;
136
137 day = day * 10 + *p++ - '0';
138 }
139
140 if (end - p < 14)
141 return NGX_ERROR;
142 }
143
144 if (*p++ != ' ')
145 return NGX_ERROR;
146
147 if (*p < '0' || *p > '9' || *(p + 1) < '0' || *(p + 1) > '9')
148 return NGX_ERROR;
149
150 hour = (*p - '0') * 10 + *(p + 1) - '0';
151 p += 2;
152
153 if (*p++ != ':')
154 return NGX_ERROR;
155
156 if (*p < '0' || *p > '9' || *(p + 1) < '0' || *(p + 1) > '9')
157 return NGX_ERROR;
158
159 min = (*p - '0') * 10 + *(p + 1) - '0';
160 p += 2;
161
162 if (*p++ != ':')
163 return NGX_ERROR;
164
165 if (*p < '0' || *p > '9' || *(p + 1) < '0' || *(p + 1) > '9')
166 return NGX_ERROR;
167
168 sec = (*p - '0') * 10 + *(p + 1) - '0';
169
170 if (fmt == isoc) {
171 p += 2;
172
173 if (*p++ != ' ')
174 return NGX_ERROR;
175
176 if (*p < '0' || *p > '9' || *(p + 1) < '0' || *(p + 1) > '9'
177 || *(p + 2) < '0' || *(p + 2) > '9'
178 || *(p + 3) < '0' || *(p + 3) > '9')
179 return NGX_ERROR;
180
181 year = (*p - '0') * 1000 + (*(p + 1) - '0') * 100
182 + (*(p + 2) - '0') * 10 + *(p + 3) - '0';
183 }
184
185 printf("%d.%d.%d %d:%d:%d\n", day, month + 1, year, hour, min, sec);
186
187 if (hour > 23 || min > 60 || sec > 60)
188 return NGX_ERROR;
189
190 if (day == 29 && month == 1) {
191 if ((year & 3) || ((year % 100 == 0) && (year % 400) != 0))
192 return NGX_ERROR;
193
194 } else if (day > mday[month])
195 return NGX_ERROR;
196 }
197
198 if (sizeof(time_t) <= 4 && year >= 2038)
199 return NGX_ERROR;
200
201 if (--month <= 0) {
202 month += 12;
203 year -= 1;
204 }
205
206 return year / 4 - year / 100 + year / 400
207 + 367 * month / 12 + day + year * 365 - 719499;
64 } 208 }
209
210 char zero[] = "Sun, 01 Jan 1970 08:49:30";
211 char one[] = "Sunday, 11-Dec-02 08:49:30";
212 char two[] = "Sun Mar 1 08:49:37 2000";
213 char thr[] = "Sun Dec 11 08:49:37 2002";
214
215 main()
216 {
217 int rc;
218
219 rc = ngx_http_parse_time(zero, sizeof(zero) - 1);
220 printf("rc: %d\n", rc);
221
222 rc = ngx_http_parse_time(one, sizeof(one) - 1);
223 printf("rc: %d\n", rc);
224
225 rc = ngx_http_parse_time(two, sizeof(two) - 1);
226 printf("rc: %d\n", rc);
227
228 rc = ngx_http_parse_time(thr, sizeof(thr) - 1);
229 printf("rc: %d\n", rc);
230 }