| 193 | } |
| 194 | |
| 195 | static apr_status_t read_table(cache_handle_t *handle, request_rec *r, |
| 196 | apr_table_t *table, unsigned char *buffer, apr_size_t buffer_len, |
| 197 | apr_size_t *slider) |
| 198 | { |
| 199 | apr_size_t key = *slider, colon = 0, len = 0; |
| 200 | |
| 201 | while (*slider < buffer_len) { |
| 202 | if (buffer[*slider] == ':') { |
| 203 | if (!colon) { |
| 204 | colon = *slider; |
| 205 | } |
| 206 | (*slider)++; |
| 207 | } |
| 208 | else if (buffer[*slider] == '\r') { |
| 209 | len = colon; |
| 210 | if (key == *slider) { |
| 211 | (*slider)++; |
| 212 | if (buffer[*slider] == '\n') { |
| 213 | (*slider)++; |
| 214 | } |
| 215 | return APR_SUCCESS; |
| 216 | } |
| 217 | if (!colon || buffer[colon++] != ':') { |
| 218 | ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO(02344) |
| 219 | "Premature end of cache headers."); |
| 220 | return APR_EGENERAL; |
| 221 | } |
| 222 | /* Do not go past the \r from above as apr_isspace('\r') is true */ |
| 223 | while (apr_isspace(buffer[colon]) && (colon < *slider)) { |
| 224 | colon++; |
| 225 | } |
| 226 | apr_table_addn(table, apr_pstrmemdup(r->pool, (const char *) buffer |
| 227 | + key, len - key), apr_pstrmemdup(r->pool, |
| 228 | (const char *) buffer + colon, *slider - colon)); |
| 229 | (*slider)++; |
| 230 | if (buffer[*slider] == '\n') { |
| 231 | (*slider)++; |
| 232 | } |
| 233 | key = *slider; |
| 234 | colon = 0; |
| 235 | } |
| 236 | else if (buffer[*slider] == '\0') { |
| 237 | (*slider)++; |
| 238 | return APR_SUCCESS; |
| 239 | } |
| 240 | else { |
| 241 | (*slider)++; |
| 242 | } |
| 243 | } |
| 244 | |
| 245 | return APR_EOF; |
| 246 | } |
| 247 | |
| 248 | static apr_status_t store_table(apr_table_t *table, unsigned char *buffer, |
| 249 | apr_size_t buffer_len, apr_size_t *slider) |