Mercurial > hg > nginx
comparison src/core/ngx_string.c @ 408:d6e2b445c1b8
nginx-0.0.10-2004-08-27-19:40:59 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Fri, 27 Aug 2004 15:40:59 +0000 |
parents | 37b5381fb6d8 |
children | 8ac40cae79f0 |
comparison
equal
deleted
inserted
replaced
407:35fe251cd231 | 408:d6e2b445c1b8 |
---|---|
124 | 124 |
125 | 125 |
126 ngx_int_t ngx_encode_base64(ngx_pool_t *pool, ngx_str_t *src, ngx_str_t *dst) | 126 ngx_int_t ngx_encode_base64(ngx_pool_t *pool, ngx_str_t *src, ngx_str_t *dst) |
127 { | 127 { |
128 u_char *d, *s; | 128 u_char *d, *s; |
129 ngx_uint_t i; | 129 size_t len; |
130 static u_char basis64[] = | 130 static u_char basis64[] = |
131 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; | 131 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; |
132 | 132 |
133 if (!(d = ngx_palloc(pool, ((src->len + 2) / 3) * 4 + 1))) { | 133 if (!(d = ngx_palloc(pool, ((src->len + 2) / 3) * 4 + 1))) { |
134 return NGX_ERROR; | 134 return NGX_ERROR; |
135 } | 135 } |
136 | 136 |
137 dst->data = d; | 137 dst->data = d; |
138 s = src->data; | 138 s = src->data; |
139 | 139 len = src->len; |
140 for (i = 0; i < src->len - 2; i += 3) { | 140 |
141 *d++ = basis64[(s[i] >> 2) & 0x3f]; | 141 while (len > 2) { |
142 *d++ = basis64[((s[i] & 3) << 4) | (s[i + 1] >> 4)]; | 142 *d++ = basis64[(s[0] >> 2) & 0x3f]; |
143 *d++ = basis64[((s[i + 1] & 0x0f) << 2) | (s[i + 2] >> 6)]; | 143 *d++ = basis64[((s[0] & 3) << 4) | (s[1] >> 4)]; |
144 *d++ = basis64[s[i + 2] & 0x3f]; | 144 *d++ = basis64[((s[1] & 0x0f) << 2) | (s[2] >> 6)]; |
145 } | 145 *d++ = basis64[s[2] & 0x3f]; |
146 | 146 |
147 if (i < src->len) { | 147 s += 3; |
148 *d++ = basis64[(s[i] >> 2) & 0x3f]; | 148 len -= 3; |
149 | 149 } |
150 if (i == src->len - 1) { | 150 |
151 *d++ = basis64[(s[i] & 3) << 4]; | 151 if (len) { |
152 *d++ = basis64[(s[0] >> 2) & 0x3f]; | |
153 | |
154 if (len == 1) { | |
155 *d++ = basis64[(s[0] & 3) << 4]; | |
152 *d++ = '='; | 156 *d++ = '='; |
153 | 157 |
154 } else { | 158 } else { |
155 *d++ = basis64[((s[i] & 3) << 4) | (s[i + 1] >> 4)]; | 159 *d++ = basis64[((s[0] & 3) << 4) | (s[1] >> 4)]; |
156 *d++ = basis64[(s[i + 1] & 0x0f) << 2]; | 160 *d++ = basis64[(s[1] & 0x0f) << 2]; |
157 } | 161 } |
158 | 162 |
159 *d++ = '='; | 163 *d++ = '='; |
160 } | 164 } |
161 | 165 |
166 } | 170 } |
167 | 171 |
168 | 172 |
169 ngx_int_t ngx_decode_base64(ngx_pool_t *pool, ngx_str_t *src, ngx_str_t *dst) | 173 ngx_int_t ngx_decode_base64(ngx_pool_t *pool, ngx_str_t *src, ngx_str_t *dst) |
170 { | 174 { |
171 u_char *d, *s, c; | 175 size_t len; |
172 | 176 u_char *d, *s; |
173 if (!(d = ngx_palloc(pool, ((src->len + 3) / 4) * 3))) { | 177 static u_char basis64[] = |
178 { 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, | |
179 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, | |
180 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 62, 77, 77, 77, 63, | |
181 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 77, 77, 77, 77, 77, 77, | |
182 77, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, | |
183 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 77, 77, 77, 77, 77, | |
184 77, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, | |
185 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 77, 77, 77, 77, 77, | |
186 | |
187 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, | |
188 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, | |
189 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, | |
190 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, | |
191 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, | |
192 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, | |
193 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, | |
194 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77 }; | |
195 | |
196 for (len = 0; len < src->len; len++) { | |
197 if (src->data[len] == '=') { | |
198 break; | |
199 } | |
200 | |
201 if (basis64[src->data[len]] == 77) { | |
202 return NGX_ERROR; | |
203 } | |
204 } | |
205 | |
206 if (len % 4 == 1) { | |
207 return NGX_ERROR; | |
208 } | |
209 | |
210 if (!(d = ngx_palloc(pool, ((len + 3) / 4) * 3 + 1))) { | |
174 return NGX_ABORT; | 211 return NGX_ABORT; |
175 } | 212 } |
176 | 213 |
177 dst->data = d; | 214 dst->data = d; |
215 | |
178 s = src->data; | 216 s = src->data; |
179 | 217 |
180 if (*s == '+') { | 218 while (len > 3) { |
181 c = 62; | 219 *d++ = basis64[s[0]] << 2 | basis64[s[1]] >> 4; |
182 | 220 *d++ = basis64[s[1]] << 4 | basis64[s[2]] >> 2; |
183 } else if (*s == '/') { | 221 *d++ = basis64[s[2]] << 6 | basis64[s[3]]; |
184 c = 63; | 222 |
185 | 223 s += 4; |
186 } else if (*s >= '0' && *s <= '9') { | 224 len -= 4; |
187 c = *s - '0' + 52; | 225 } |
188 | 226 |
189 } else if (*s >= 'A' && *s <= 'Z') { | 227 if (len > 1) { |
190 c = *s - 'A'; | 228 *d++ = basis64[s[0]] << 2 | basis64[s[1]] >> 4; |
191 | 229 } |
192 } else if (*s >= 'a' && *s <= 'z') { | 230 |
193 c = *s - 'a' + 26; | 231 if (len > 2) { |
194 | 232 *d++ = basis64[s[1]] << 4 | basis64[s[2]] >> 2; |
195 } else { | 233 } |
196 return NGX_ERROR; | 234 |
197 } | 235 dst->len = d - dst->data; |
236 *d++ = '\0'; | |
198 | 237 |
199 return NGX_OK; | 238 return NGX_OK; |
200 } | 239 } |
201 | 240 |
202 | 241 |