- *decoded_len = 0;
- *decoded = ecalloc(1, encoded_len);
- d_ptr = *decoded;
- e_ptr = encoded;
-
- while (((e_ptr - encoded) - encoded_len) > 0) {
- size_t chunk_len = 0, EOL_len = 0;
- int eol_mismatch = 0;
- char *n_ptr;
-
- chunk_len = strtol(e_ptr, &n_ptr, 16);
-
- /* check if:
- * - we could not read in chunk size
- * - chunk size is not followed by (CR)LF|NUL
- */
- if ((n_ptr == e_ptr) || (*n_ptr && (eol_mismatch = n_ptr != http_locate_eol(e_ptr, &EOL_len)))) {
- /* don't fail on apperently not encoded data */
- if (e_ptr == encoded) {
- memcpy(*decoded, encoded, encoded_len);
- *decoded_len = encoded_len;
- return encoded + encoded_len;
- } else {
- efree(*decoded);
- if (eol_mismatch) {
- if (EOL_len == 2) {
- http_error_ex(HE_WARNING, HTTP_E_ENCODING, "Invalid character (expected 0x0D 0x0A; got: 0x%X 0x%X)", *n_ptr, *(n_ptr + 1));
- } else {
- http_error_ex(HE_WARNING, HTTP_E_ENCODING, "Invalid character (expected 0x0A; got: 0x%X)", *n_ptr);
- }
- } else {
- char *error = estrndup(n_ptr, strcspn(n_ptr, "\r\n "));
- http_error_ex(HE_WARNING, HTTP_E_ENCODING, "Invalid chunk size: '%s' at pos %d", error, n_ptr - encoded);
- efree(error);
- }
- return NULL;
- }
- } else {
- e_ptr = n_ptr;
- }
-
- /* reached the end */
- if (!chunk_len) {
- break;
- }
-
- memcpy(d_ptr, e_ptr += EOL_len, chunk_len);
- d_ptr += chunk_len;
- e_ptr += chunk_len + EOL_len;
- *decoded_len += chunk_len;
- }
-
- return e_ptr;
-}
-/* }}} */
-
-/* {{{ char *http_guess_content_type(char *magic_file, long magic_mode, void *data, size_t size, http_send_mode mode) */
-PHP_HTTP_API char *_http_guess_content_type(const char *magicfile, long magicmode, void *data_ptr, size_t data_len, http_send_mode data_mode TSRMLS_DC)
-{
- char *ct = NULL;
-
-#ifdef HTTP_HAVE_MAGIC
- struct magic_set *magic = magic_open(magicmode);
-
- if (!magic) {
- http_error_ex(HE_WARNING, HTTP_E_INVALID_PARAM, "Invalid magic mode: %ld", magicmode);
- } else if (-1 == magic_load(magic, magicfile)) {
- http_error_ex(HE_WARNING, HTTP_E_RUNTIME, "Failed to load magic database '%s'", magicfile);
- } else {
- const char *ctype = NULL;