X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=http_api.c;h=3969b82fd156d50ca69037893b199964713adbf7;hb=a343fa32a9cfa77208c68bd8f73338b6f03a2f56;hp=6046052f1be597943442acb832b0109d00ea4b62;hpb=32e91737086db53bb1fd9ed9f79d693c43ec459f;p=m6w6%2Fext-http diff --git a/http_api.c b/http_api.c index 6046052..3969b82 100644 --- a/http_api.c +++ b/http_api.c @@ -12,13 +12,9 @@ /* $Id$ */ -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - +#define HTTP_WANT_SAPI #include "php_http.h" -#include "SAPI.h" #include "php_output.h" #include "ext/standard/url.h" @@ -206,11 +202,9 @@ void _http_log_ex(char *file, const char *ident, const char *message TSRMLS_DC) { time_t now; struct tm nowtm; - char datetime[128]; + char datetime[20] = {0}; - HTTP_CHECK_OPEN_BASEDIR(file, return); - - time(&now); + now = HTTP_GET_REQUEST_TIME(); strftime(datetime, sizeof(datetime), "%Y-%m-%d %H:%M:%S", php_localtime_r(&now, &nowtm)); #define HTTP_LOG_WRITE(file, type, msg) \ @@ -256,6 +250,7 @@ STATUS _http_exit_ex(int status, char *header, char *body, zend_bool send_header 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 305: http_log(HTTP_G(log).redirect, "305-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; @@ -313,18 +308,21 @@ PHP_HTTP_API STATUS _http_get_request_body_ex(char **body, size_t *length, zend_ { *length = 0; *body = NULL; - + if (SG(request_info).raw_post_data) { *length = SG(request_info).raw_post_data_length; - *body = (char *) (dup ? estrndup(SG(request_info).raw_post_data, *length) : SG(request_info).raw_post_data); + *body = SG(request_info).raw_post_data; + + if (dup) { + *body = estrndup(*body, *length); + } return SUCCESS; - } - - /* PHP only reads POST */ - if (sapi_module.read_post) { + } else if (sapi_module.read_post && !HTTP_G(read_post_data)) { char buf[4096]; int len; + HTTP_G(read_post_data) = 1; + while (0 < (len = sapi_module.read_post(buf, sizeof(buf) TSRMLS_CC))) { *body = erealloc(*body, *length + len + 1); memcpy(*body + *length, buf, len); @@ -333,23 +331,55 @@ PHP_HTTP_API STATUS _http_get_request_body_ex(char **body, size_t *length, zend_ } /* check for error */ - if (len >= 0) { - /* connect to sapi module so it'll be freed */ - if (!dup) { - SG(request_info).raw_post_data = *body; - SG(request_info).raw_post_data_length = *length; - } - return SUCCESS; - } else { + if (len < 0) { STR_FREE(*body); *length = 0; + return FAILURE; + } + + SG(request_info).raw_post_data = *body; + SG(request_info).raw_post_data_length = *length; + + if (dup) { + *body = estrndup(*body, *length); } + return SUCCESS; } return FAILURE; } /* }}} */ +/* {{{ php_stream *_http_get_request_body_stream(void) */ +PHP_HTTP_API php_stream *_http_get_request_body_stream(TSRMLS_D) +{ + php_stream *s = NULL; + + if (SG(request_info).raw_post_data) { + s = php_stream_open_wrapper("php://input", "rb", 0, NULL); + } else if (sapi_module.read_post && !HTTP_G(read_post_data)) { + HTTP_G(read_post_data) = 1; + + if ((s = php_stream_temp_new())) { + char buf[4096]; + int len; + + while (0 < (len = sapi_module.read_post(buf, sizeof(buf) TSRMLS_CC))) { + php_stream_write(s, buf, len); + } + + if (len < 0) { + php_stream_close(s); + s = NULL; + } else { + php_stream_rewind(s); + } + } + } + + return s; +} +/* }}} */ /* * Local variables: