/* $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"
/* {{{ */
STATUS _http_parse_key_list(const char *list, HashTable *items, char separator, http_key_list_decode_t decode, zend_bool first_entry_is_name_value_pair TSRMLS_DC)
{
- const char *key = list, *val = NULL;
+ char *str = estrdup(list), *key = str, *val = NULL;
int vallen = 0, keylen = 0, done = 0;
zval array;
INIT_ZARR(array, items);
- if (!(val = strchr(list, '='))) {
+ if (!(val = strchr(str, '='))) {
+ efree(str);
return FAILURE;
}
}
#define HTTP_KEYLIST_FIXKEY() \
{ \
- while (isspace(*key)) ++key; \
- keylen = val - key; \
- while (isspace(key[keylen - 1])) --keylen; \
+ while (isspace(*key)) ++key; \
+ keylen = val - key; \
+ while (isspace(key[keylen - 1])) --keylen; \
}
#define HTTP_KEYLIST_FIXVAL() \
{ \
+ ++val; \
+ while (isspace(*val)) ++val; \
+ vallen = key - val; \
+ while (isspace(val[vallen - 1])) --vallen; \
+ if (val[0] == '"' && val[vallen - 1] == '"') { \
+ int i; \
++val; \
- while (isspace(*val)) ++val; \
- vallen = key - val; \
- while (isspace(val[vallen - 1])) --vallen; \
+ vallen -= 2; \
+ for (i = 0; i < vallen; ++i) { \
+ if (val[i] == '\\' && val[i+1] == '"' && (!i || val[i-1] != '\\')) { \
+ memmove(&val[i], &val[i+1], vallen - i); \
+ --vallen; \
+ } \
+ } \
+ } \
}
HTTP_KEYLIST_FIXKEY();
key = val + strlen(val);
HTTP_KEYLIST_FIXVAL();
HTTP_KEYLIST_VAL(&array, "value", val, vallen);
+ efree(str);
return SUCCESS;
}
/* additional info appended */
efree(keydup);
} while (!done);
+ efree(str);
return SUCCESS;
}
/* }}} */
{
time_t now;
struct tm nowtm;
- char datetime[128];
-
- HTTP_CHECK_OPEN_BASEDIR(file, return);
+ char datetime[20] = {0};
- 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) \
}
HTTP_LOG_WRITE(file, ident, message);
- HTTP_LOG_WRITE(HTTP_G(log).composite, ident, message);
+ HTTP_LOG_WRITE(HTTP_G->log.composite, ident, message);
}
/* }}} */
switch (status)
{
- 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;
+ 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;
default: http_log(NULL, header, body); break;
}
STR_FREE(header);
STR_FREE(body);
- if (HTTP_G(force_exit)) {
+ if (HTTP_G->force_exit) {
zend_bailout();
} else {
php_ob_set_internal_handler(http_ob_blackhole, 4096, "blackhole", 0 TSRMLS_CC);
{
*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);
}
/* 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: