#include "SAPI.h"
#include "ext/standard/url.h"
+#include "ext/standard/head.h"
#include "php_http.h"
#include "php_http_std_defs.h"
vspprintf(&message, 0, format, args);
zend_throw_exception(http_exception_get_for_code(code), message, code TSRMLS_CC);
+ efree(message);
} else
#endif
php_verror(NULL, "", type, format, args TSRMLS_CC);
}
}
- if (body) {
+ if (php_header(TSRMLS_C) && body) {
PHPWRITE(body, strlen(body));
}
{
case 301: http_log(HTTP_G(log).redirect, "301-REDIRECT", header); break;
case 302: http_log(HTTP_G(log).redirect, "302-REDIRECT", header); break;
+ case 303: http_log(HTTP_G(log).redirect, "303-REDIRECT", header); break;
+ case 307: http_log(HTTP_G(log).redirect, "307-REDIRECT", header); break;
case 304: http_log(HTTP_G(log).cache, "304-CACHE", header); break;
case 405: http_log(HTTP_G(log).allowed_methods, "405-ALLOWED", header); break;
default: http_log(NULL, header, body); break;
{
const char *e_ptr;
char *d_ptr;
+ long rest;
*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;
+ while ((rest = encoded + encoded_len - e_ptr) > 0) {
+ long chunk_len = 0;
+ int EOL_len = 0, eol_mismatch = 0;
char *n_ptr;
chunk_len = strtol(e_ptr, &n_ptr, 16);
/* check if:
* - we could not read in chunk size
+ * - we got a negative chunk size
+ * - chunk size is greater then remaining 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)))) {
+ if ( (n_ptr == e_ptr) || (chunk_len < 0) || (chunk_len > rest) ||
+ (*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);
char *ct = NULL;
#ifdef HTTP_HAVE_MAGIC
- struct magic_set *magic = magic_open(magicmode);
+ /* magic_load() fails if MAGIC_MIME is set because it
+ cowardly adds .mime to the file name */
+ struct magic_set *magic = magic_open(magicmode &~ MAGIC_MIME);
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);
+ http_error_ex(HE_WARNING, HTTP_E_RUNTIME, "Failed to load magic database '%s' (%s)", magicfile, magic_error(magic));
} else {
const char *ctype = NULL;
+ magic_setflags(magic, magicmode);
+
switch (data_mode)
{
case SEND_RSRC: