+--------------------------------------------------------------------+
| Redistribution and use in source and binary forms, with or without |
| modification, are permitted provided that the conditions mentioned |
- | in the accomp395anying LICENSE file are met. |
+ | in the accompanying LICENSE file are met. |
+--------------------------------------------------------------------+
| Copyright (c) 2004-2011, Michael Wallner <mike@php.net> |
+--------------------------------------------------------------------+
if (SUCCESS == zend_hash_find(&SG(known_post_content_types), key_str, key_len, (void *) &post_entry)) {
zval *files = PG(http_globals)[TRACK_VARS_FILES];
- zend_is_auto_global(ZEND_STRL("_POST") TSRMLS_CC);
-
if (post_entry) {
SG(request_info).post_entry = post_entry;
}
}
-PHP_HTTP_API char *php_http_env_get_request_header(const char *name_str, size_t name_len, size_t *len TSRMLS_DC)
+PHP_HTTP_API char *php_http_env_get_request_header(const char *name_str, size_t name_len, size_t *len, php_http_message_t *request TSRMLS_DC)
{
- zval **zvalue;
+ HashTable *request_headers;
+ zval **zvalue = NULL;
char *val = NULL, *key = php_http_pretty_key(estrndup(name_str, name_len), name_len, 1, 1);
- php_http_env_get_request_headers(NULL TSRMLS_CC);
+ if (request) {
+ request_headers = &request->hdrs;
+ } else {
+ php_http_env_get_request_headers(NULL TSRMLS_CC);
+ request_headers = PHP_HTTP_G->env.request.headers;
+ }
- if (SUCCESS == zend_symtable_find(PHP_HTTP_G->env.request.headers, key, name_len + 1, (void *) &zvalue)) {
+ if (SUCCESS == zend_symtable_find(request_headers, key, name_len + 1, (void *) &zvalue)) {
zval *zcopy = php_http_ztyp(IS_STRING, *zvalue);
val = estrndup(Z_STRVAL_P(zcopy), Z_STRLEN_P(zcopy));
return val;
}
-PHP_HTTP_API int php_http_env_got_request_header(const char *name_str, size_t name_len TSRMLS_DC)
+PHP_HTTP_API int php_http_env_got_request_header(const char *name_str, size_t name_len, php_http_message_t *request TSRMLS_DC)
{
+ HashTable *request_headers;
char *key = php_http_pretty_key(estrndup(name_str, name_len), name_len, 1, 1);
int got;
- php_http_env_get_request_headers(NULL TSRMLS_CC);
- got = zend_symtable_exists(PHP_HTTP_G->env.request.headers, key, name_len + 1);
+ if (request) {
+ request_headers = &request->hdrs;
+ } else {
+ php_http_env_get_request_headers(NULL TSRMLS_CC);
+ request_headers = PHP_HTTP_G->env.request.headers;
+ }
+ got = zend_symtable_exists(request_headers, key, name_len + 1);
efree(key);
return got;
return PHP_HTTP_G->env.request.body;
}
-PHP_HTTP_API php_http_range_status_t php_http_env_get_request_ranges(HashTable *ranges, size_t length TSRMLS_DC)
+PHP_HTTP_API const char *php_http_env_get_request_method(php_http_message_t *request TSRMLS_DC)
+{
+ const char *m;
+
+ if (PHP_HTTP_MESSAGE_TYPE(REQUEST, request)) {
+ m = request->http.info.request.method;
+ } else {
+ m = SG(request_info).request_method;
+ }
+
+ return m ? m : "GET";
+}
+
+PHP_HTTP_API php_http_range_status_t php_http_env_get_request_ranges(HashTable *ranges, size_t length, php_http_message_t *request TSRMLS_DC)
{
zval *zentry;
char *range, *rp, c;
long begin = -1, end = -1, *ptr;
- if (!(range = php_http_env_get_request_header(ZEND_STRL("Range"), NULL TSRMLS_CC))) {
+ if (!(range = php_http_env_get_request_header(ZEND_STRL("Range"), NULL, request TSRMLS_CC))) {
return PHP_HTTP_RANGE_NO;
}
if (strncmp(range, "bytes=", lenof("bytes="))) {
zend_llist_apply_with_argument(&SG(sapi_headers).headers, grab_headers, &headers TSRMLS_CC);
php_http_buffer_fix(&headers);
- status = php_http_headers_parse(PHP_HTTP_BUFFER_VAL(&headers), PHP_HTTP_BUFFER_LEN(&headers), headers_ht, NULL, NULL TSRMLS_CC);
+ status = php_http_headers_parse(headers.data, headers.used, headers_ht, NULL, NULL TSRMLS_CC);
php_http_buffer_dtor(&headers);
return status;
return ret;
}
-PHP_HTTP_API STATUS php_http_env_set_response_header_format(long http_code, zend_bool replace TSRMLS_DC, const char *fmt, ...)
+PHP_HTTP_API STATUS php_http_env_set_response_header_va(long http_code, zend_bool replace, const char *fmt, va_list argv TSRMLS_DC)
{
- va_list args;
STATUS ret = FAILURE;
sapi_header_line h = {NULL, 0, http_code};
- va_start(args, fmt);
- h.line_len = vspprintf(&h.line, 0, fmt, args);
- va_end(args);
+ h.line_len = vspprintf(&h.line, 0, fmt, argv);
if (h.line) {
if (h.line_len) {
return ret;
}
+PHP_HTTP_API STATUS php_http_env_set_response_header_format(long http_code, zend_bool replace TSRMLS_DC, const char *fmt, ...)
+{
+ STATUS ret;
+ va_list args;
+
+ va_start(args, fmt);
+ ret = php_http_env_set_response_header_va(http_code, replace, fmt, args TSRMLS_CC);
+ va_end(args);
+
+ return ret;
+}
+
PHP_HTTP_API STATUS php_http_env_set_response_header_value(long http_code, const char *name_str, size_t name_len, zval *value, zend_bool replace TSRMLS_DC)
{
if (!value) {
static PHP_HTTP_STRLIST(php_http_env_response_status) =
PHP_HTTP_STRLIST_ITEM("Continue")
PHP_HTTP_STRLIST_ITEM("Switching Protocols")
+ PHP_HTTP_STRLIST_ITEM("Processing")
PHP_HTTP_STRLIST_NEXT
PHP_HTTP_STRLIST_ITEM("OK")
PHP_HTTP_STRLIST_ITEM("Created")
PHP_HTTP_STRLIST_ITEM("No Content")
PHP_HTTP_STRLIST_ITEM("Reset Content")
PHP_HTTP_STRLIST_ITEM("Partial Content")
+ PHP_HTTP_STRLIST_ITEM("Multi-Status")
+ PHP_HTTP_STRLIST_ITEM("Already Reported")
+ PHP_HTTP_STRLIST_ITEM("(Unused)")
+ PHP_HTTP_STRLIST_ITEM("(Unused)")
+ PHP_HTTP_STRLIST_ITEM("(Unused)")
+ PHP_HTTP_STRLIST_ITEM("(Unused)")
+ PHP_HTTP_STRLIST_ITEM("(Unused)")
+ PHP_HTTP_STRLIST_ITEM("(Unused)")
+ PHP_HTTP_STRLIST_ITEM("(Unused)")
+ PHP_HTTP_STRLIST_ITEM("(Unused)")
+ PHP_HTTP_STRLIST_ITEM("(Unused)")
+ PHP_HTTP_STRLIST_ITEM("(Unused)")
+ PHP_HTTP_STRLIST_ITEM("(Unused)")
+ PHP_HTTP_STRLIST_ITEM("(Unused)")
+ PHP_HTTP_STRLIST_ITEM("(Unused)")
+ PHP_HTTP_STRLIST_ITEM("(Unused)")
+ PHP_HTTP_STRLIST_ITEM("(Unused)")
+ PHP_HTTP_STRLIST_ITEM("(Unused)")
+ PHP_HTTP_STRLIST_ITEM("(Unused)")
+ PHP_HTTP_STRLIST_ITEM("IM Used")
PHP_HTTP_STRLIST_NEXT
PHP_HTTP_STRLIST_ITEM("Multiple Choices")
PHP_HTTP_STRLIST_ITEM("Moved Permanently")
PHP_HTTP_STRLIST_ITEM("Use Proxy")
PHP_HTTP_STRLIST_ITEM("(Unused)")
PHP_HTTP_STRLIST_ITEM("Temporary Redirect")
+ PHP_HTTP_STRLIST_ITEM("Permanent Redirect")
PHP_HTTP_STRLIST_NEXT
PHP_HTTP_STRLIST_ITEM("Bad Request")
PHP_HTTP_STRLIST_ITEM("Unauthorized")
PHP_HTTP_STRLIST_ITEM("Unsupported Media Type")
PHP_HTTP_STRLIST_ITEM("Requested Range Not Satisfiable")
PHP_HTTP_STRLIST_ITEM("Expectation Failed")
+ PHP_HTTP_STRLIST_ITEM("(Unused)")
+ PHP_HTTP_STRLIST_ITEM("(Unused)")
+ PHP_HTTP_STRLIST_ITEM("(Unused)")
+ PHP_HTTP_STRLIST_ITEM("(Unused)")
+ PHP_HTTP_STRLIST_ITEM("Unprocessible Entity")
+ PHP_HTTP_STRLIST_ITEM("Locked")
+ PHP_HTTP_STRLIST_ITEM("Failed Dependency")
+ PHP_HTTP_STRLIST_ITEM("(Reserved)")
+ PHP_HTTP_STRLIST_ITEM("Upgrade Required")
+ PHP_HTTP_STRLIST_ITEM("(Unused)")
+ PHP_HTTP_STRLIST_ITEM("Precondition Required")
+ PHP_HTTP_STRLIST_ITEM("Too Many Requests")
+ PHP_HTTP_STRLIST_ITEM("(Unused)")
+ PHP_HTTP_STRLIST_ITEM("Request Header Fields Too Large")
PHP_HTTP_STRLIST_NEXT
PHP_HTTP_STRLIST_ITEM("Internal Server Error")
PHP_HTTP_STRLIST_ITEM("Not Implemented")
PHP_HTTP_STRLIST_ITEM("Service Unavailable")
PHP_HTTP_STRLIST_ITEM("Gateway Timeout")
PHP_HTTP_STRLIST_ITEM("HTTP Version Not Supported")
+ PHP_HTTP_STRLIST_ITEM("Variant Also Negotiates")
+ PHP_HTTP_STRLIST_ITEM("Insufficient Storage")
+ PHP_HTTP_STRLIST_ITEM("Loop Detected")
+ PHP_HTTP_STRLIST_ITEM("(Unused)")
+ PHP_HTTP_STRLIST_ITEM("Not Extended")
+ PHP_HTTP_STRLIST_ITEM("Network Authentication Required")
PHP_HTTP_STRLIST_STOP
;
PHP_HTTP_ARG_VAL(code, 0)
PHP_HTTP_END_ARGS;
+PHP_HTTP_EMPTY_ARGS(getResponseStatusForAllCodes);
+
PHP_HTTP_BEGIN_ARGS(getResponseHeader, 0)
PHP_HTTP_ARG_VAL(header_name, 0)
PHP_HTTP_END_ARGS;
PHP_HTTP_ARG_VAL(result_array, 1)
PHP_HTTP_END_ARGS;
-PHP_HTTP_EMPTY_ARGS(statPersistentHandles);
-
-PHP_HTTP_BEGIN_ARGS(cleanPersistentHandles, 0)
- PHP_HTTP_ARG_VAL(name, 0)
- PHP_HTTP_ARG_VAL(ident, 0)
-PHP_HTTP_END_ARGS;
-
static zend_class_entry *php_http_env_class_entry;
zend_class_entry *php_http_env_get_class_entry(void)
PHP_HTTP_ENV_ME(getRequestBody)
PHP_HTTP_ENV_ME(getResponseStatusForCode)
+ PHP_HTTP_ENV_ME(getResponseStatusForAllCodes)
PHP_HTTP_ENV_ME(getResponseHeader)
PHP_HTTP_ENV_ME(getResponseCode)
PHP_HTTP_ENV_ME(negotiateCharset)
PHP_HTTP_ENV_ME(negotiate)
- PHP_HTTP_ENV_ME(statPersistentHandles)
- PHP_HTTP_ENV_ME(cleanPersistentHandles)
-
EMPTY_FUNCTION_ENTRY
};
if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s!", &header_name_str, &header_name_len)) {
if (header_name_str && header_name_len) {
size_t header_length;
- char *header_value = php_http_env_get_request_header(header_name_str, header_name_len, &header_length TSRMLS_CC);
+ char *header_value = php_http_env_get_request_header(header_name_str, header_name_len, &header_length, NULL TSRMLS_CC);
if (header_value) {
RETURN_STRINGL(header_value, header_length, 0);
zend_object_value ov;
php_http_message_body_t *body = php_http_env_get_request_body(TSRMLS_C);
- if (SUCCESS == php_http_new(&ov, class_entry, (php_http_new_t) php_http_message_body_object_new_ex, php_http_message_body_get_class_entry(), php_http_message_body_copy(body, NULL, 0), NULL TSRMLS_CC)) {
+ if (SUCCESS == php_http_new(&ov, class_entry, (php_http_new_t) php_http_message_body_object_new_ex, php_http_message_body_get_class_entry(), php_http_message_body_init(&body, NULL TSRMLS_CC), NULL TSRMLS_CC)) {
RETVAL_OBJVAL(ov, 0);
}
}
RETURN_FALSE;
}
+PHP_METHOD(HttpEnv, getResponseStatusForAllCodes)
+{
+ const char *s;
+ unsigned c;
+ php_http_strlist_iterator_t i;
+
+ if (SUCCESS != zend_parse_parameters_none()) {
+ RETURN_FALSE;
+ }
+
+ array_init(return_value);
+ for ( php_http_strlist_iterator_init(&i, php_http_env_response_status, 100);
+ *(s = php_http_strlist_iterator_this(&i, &c));
+ php_http_strlist_iterator_next(&i)
+ ) {
+ add_index_string(return_value, c, s, 1);
+ }
+}
+
PHP_METHOD(HttpEnv, getResponseHeader)
{
char *header_name_str = NULL;
}
}
-PHP_METHOD(HttpEnv, statPersistentHandles)
-{
- if (SUCCESS == zend_parse_parameters_none()) {
- object_init(return_value);
- if (php_http_persistent_handle_statall(HASH_OF(return_value) TSRMLS_CC)) {
- return;
- }
- zval_dtor(return_value);
- }
- RETURN_FALSE;
-}
-
-PHP_METHOD(HttpEnv, cleanPersistentHandles)
-{
- char *name_str = NULL, *ident_str = NULL;
- int name_len = 0, ident_len = 0;
-
- if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s!s!", &name_str, &name_len, &ident_str, &ident_len)) {
- php_http_persistent_handle_cleanup(name_str, name_len, ident_str, ident_len TSRMLS_CC);
- }
-}
-
#ifdef PHP_HTTP_HAVE_JSON
#include "ext/json/php_json.h"
static SAPI_POST_HANDLER_FUNC(php_http_json_post_handler)
{
if (SG(request_info).raw_post_data) {
- php_json_decode_ex(arg, SG(request_info).raw_post_data, SG(request_info).raw_post_data_length, PHP_JSON_OBJECT_AS_ARRAY, PG(max_input_nesting_level) TSRMLS_CC);
+ zval *zarg = arg;
+ zval_dtor(zarg);
+ ZVAL_NULL(zarg);
+ php_json_decode(zarg, SG(request_info).raw_post_data, SG(request_info).raw_post_data_length, 1, PG(max_input_nesting_level) TSRMLS_CC);
+ if (Z_TYPE_P(zarg) == IS_NULL) {
+ array_init(zarg);
+ }
}
}