X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=php_http_std_defs.h;h=186a8b0834098d4f3f5f750f202fe4a3efc707a2;hp=6a113a7c7e1e84b302531fd35d42ebfc429c657c;hb=634720c4e1cac414707bbe0dba0a6c4e47f9e5d9;hpb=ea31ba145c26e01b14c8aaf49ee487a118a456a8 diff --git a/php_http_std_defs.h b/php_http_std_defs.h index 6a113a7..186a8b0 100644 --- a/php_http_std_defs.h +++ b/php_http_std_defs.h @@ -18,9 +18,50 @@ #ifndef PHP_HTTP_STD_DEFS_H #define PHP_HTTP_STD_DEFS_H -#define RETURN_SUCCESS(v) RETURN_BOOL(SUCCESS == (v)) -#define HASH_ORNULL(z) ((z) ? Z_ARRVAL_P(z) : NULL) -#define NO_ARGS if (ZEND_NUM_ARGS()) WRONG_PARAM_COUNT +#if defined(PHP_WIN32) +# if defined(HTTP_EXPORTS) +# define PHP_HTTP_API __declspec(dllexport) +# elif defined(COMPILE_DL_HTTP) +# define PHP_HTTP_API __declspec(dllimport) +# else +# define PHP_HTTP_API +# endif +#else +# define PHP_HTTP_API +#endif + +/* make functions that return SUCCESS|FAILURE more obvious */ +typedef int STATUS; + +/* lenof() */ +#define lenof(S) (sizeof(S) - 1) + +/* return bool (v == SUCCESS) */ +#define RETVAL_SUCCESS(v) RETVAL_BOOL(SUCCESS == (v)) +#define RETURN_SUCCESS(v) RETURN_BOOL(SUCCESS == (v)) +/* return object(values) */ +#define RETVAL_OBJECT(o) \ + return_value->is_ref = 1; \ + return_value->type = IS_OBJECT; \ + return_value->value.obj = (o)->value.obj; \ + zval_add_ref(&return_value) +#define RETURN_OBJECT(o) \ + RETVAL_OBJECT(o); \ + return +#define RETVAL_OBJVAL(ov) \ + return_value->is_ref = 1; \ + return_value->type = IS_OBJECT; \ + return_value->value.obj = (ov); \ + zend_objects_store_add_ref(return_value TSRMLS_CC) +#define RETURN_OBJVAL(ov) \ + RETVAL_OBJVAL(ov); \ + return + +/* function accepts no args */ +#define NO_ARGS \ + if (ZEND_NUM_ARGS()) { \ + zend_error(E_NOTICE, "Wrong parameter count for %s()", get_active_function_name(TSRMLS_C)); \ + } /* CR LF */ #define HTTP_CRLF "\r\n" @@ -28,8 +69,13 @@ /* default cache control */ #define HTTP_DEFAULT_CACHECONTROL "private, must-revalidate, max-age=0" -/* max URI length */ -#define HTTP_URI_MAXLEN 2048 +/* max URL length */ +#define HTTP_URL_MAXLEN 2048 +#define HTTP_URI_MAXLEN HTTP_URL_MAXLEN + +/* def URL arg separator */ +#define HTTP_URL_ARGSEP "&" +#define HTTP_URI_ARGSEP HTTP_URL_ARGSEP /* send buffer size */ #define HTTP_SENDBUF_SIZE 2097152 @@ -37,29 +83,25 @@ /* CURL buffer size */ #define HTTP_CURLBUF_SIZE 16384 -/* server vars shorthand */ -#define HTTP_SERVER_VARS Z_ARRVAL_P(PG(http_globals)[TRACK_VARS_SERVER]) - +/* known methods */ +#define HTTP_KNOWN_METHODS \ + /* HTTP 1.1 */ \ + "GET, HEAD, POST, PUT, DELETE, OPTIONS, TRACE, CONNECT, " \ + /* WebDAV - RFC 2518 */ \ + "PROPFIND, PROPPATCH, MKCOL, COPY, MOVE, LOCK, UNLOCK, " \ + /* WebDAV Versioning - RFC 3253 */ \ + "VERSION-CONTROL, REPORT, CHECKOUT, CHECKIN, UNCHECKOUT, " \ + "MKWORKSPACE, UPDATE, LABEL, MERGE, BASELINE-CONTROL, MKACTIVITY, " \ + /* WebDAV Access Control - RFC 3744 */ \ + "ACL, " \ + /* END */ -/* {{{ HTTP_GSC(var, name, ret) */ -#define HTTP_GSC(var, name, ret) HTTP_GSP(var, name, return ret) -/* }}} */ -/* {{{ HTTP_GSP(var, name, ret) */ -#define HTTP_GSP(var, name, ret) \ - if (!(var = http_get_server_var(name))) { \ - ret; \ - } \ - if (!Z_STRLEN_P(var)) { \ - ret; \ - } -/* }}} */ +/* server vars shorthand */ +#define HTTP_SERVER_VARS Z_ARRVAL_P(PG(http_globals)[TRACK_VARS_SERVER]) -/* override arg_separator.output to "&" for data used in outgoing requests */ -#include "zend_ini.h" -#define HTTP_URL_ARGSEP_DEFAULT "&" -#define HTTP_URL_ARGSEP_OVERRIDE zend_alter_ini_entry("arg_separator.output", sizeof("arg_separator.output") - 1, HTTP_URL_ARGSEP_DEFAULT, sizeof(HTTP_URL_ARGSEP_DEFAULT) - 1, ZEND_INI_ALL, ZEND_INI_STAGE_RUNTIME) -#define HTTP_URL_ARGSEP_RESTORE zend_restore_ini_entry("arg_separator.output", sizeof("arg_separator.output") - 1, ZEND_INI_STAGE_RUNTIME) +#define HTTP_INI_ENTRY(entry, default, scope, global) \ + STD_PHP_INI_ENTRY(entry, default, scope, http_update_##global, global, zend_http_globals, http_globals) /* {{{ arrays */ #define FOREACH_VAL(array, val) FOREACH_HASH_VAL(Z_ARRVAL_P(array), val) @@ -83,33 +125,64 @@ #define array_copy(src, dst) zend_hash_copy(Z_ARRVAL_P(dst), Z_ARRVAL_P(src), (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *)) #define array_merge(src, dst) zend_hash_merge(Z_ARRVAL_P(dst), Z_ARRVAL_P(src), (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *), 1) +#define array_append(src, dst) \ + { \ + ulong idx; \ + uint klen; \ + char *key = NULL; \ + zval **data; \ + \ + for ( zend_hash_internal_pointer_reset(Z_ARRVAL_P(src)); \ + zend_hash_get_current_key_ex(Z_ARRVAL_P(src), &key, &klen, &idx, 0, NULL) != HASH_KEY_NON_EXISTANT && \ + zend_hash_get_current_data(Z_ARRVAL_P(src), (void **) &data) == SUCCESS; \ + zend_hash_move_forward(Z_ARRVAL_P(src))) \ + { \ + if (key) { \ + zval **tmp; \ + \ + if (SUCCESS == zend_hash_find(Z_ARRVAL_P(dst), key, klen, (void **) &tmp)) { \ + if (Z_TYPE_PP(tmp) != IS_ARRAY) { \ + convert_to_array_ex(tmp); \ + } \ + add_next_index_zval(*tmp, *data); \ + } else { \ + add_assoc_zval(dst, key, *data); \ + } \ + zval_add_ref(data); \ + key = NULL; \ + } \ + } \ + } /* }}} */ +#define HTTP_LONG_CONSTANT(name, const) REGISTER_LONG_CONSTANT(name, const, CONST_CS | CONST_PERSISTENT); + /* {{{ objects & properties */ #ifdef ZEND_ENGINE_2 + # define HTTP_REGISTER_CLASS_EX(classname, name, parent, flags) \ { \ zend_class_entry ce; \ - INIT_CLASS_ENTRY(ce, #classname, name## _class_methods); \ - ce.create_object = name## _new_object; \ + INIT_CLASS_ENTRY(ce, #classname, name## _fe); \ + ce.create_object = name## _new; \ name## _ce = zend_register_internal_class_ex(&ce, parent, NULL TSRMLS_CC); \ name## _ce->ce_flags |= flags; \ - memcpy(& name## _object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); \ - name## _object_handlers.clone_obj = NULL; \ - name## _declare_default_properties(name## _ce); \ + memcpy(& name## _handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); \ + name## _declare_default_properties(); \ } # define HTTP_REGISTER_CLASS(classname, name, parent, flags) \ { \ zend_class_entry ce; \ - INIT_CLASS_ENTRY(ce, #classname, name## _class_methods); \ + INIT_CLASS_ENTRY(ce, #classname, name## _fe); \ ce.create_object = NULL; \ name## _ce = zend_register_internal_class_ex(&ce, parent, NULL TSRMLS_CC); \ name## _ce->ce_flags |= flags; \ } -# define getObject(t, o) t * o = ((t *) zend_object_store_get_object(getThis() TSRMLS_CC)) +# define getObject(t, o) getObjectEx(t, o, getThis()) +# define getObjectEx(t, o, v) t * o = ((t *) zend_object_store_get_object(v TSRMLS_CC)) # define OBJ_PROP(o) o->zo.properties # define DCL_PROP(a, t, n, v) zend_declare_property_ ##t(ce, (#n), sizeof(#n), (v), (ZEND_ACC_ ##a) TSRMLS_CC) # define DCL_PROP_Z(a, n, v) zend_declare_property(ce, (#n), sizeof(#n), (v), (ZEND_ACC_ ##a) TSRMLS_CC) @@ -136,9 +209,27 @@ } \ } +# define SET_EH_THROW() SET_EH_THROW_EX(zend_exception_get_default()) +# define SET_EH_THROW_HTTP() SET_EH_THROW_EX(http_exception_get_default()) +# define SET_EH_THROW_EX(ex) php_set_error_handling(EH_THROW, ex TSRMLS_CC) +# define SET_EH_NORMAL() php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC) + #endif /* ZEND_ENGINE_2 */ /* }}} */ +#ifndef E_THROW +# define E_THROW 0 +#endif + +#define HTTP_E_UNKOWN 0L +#define HTTP_E_PARSE 1L +#define HTTP_E_HEADER 2L +#define HTTP_E_OBUFFER 3L +#define HTTP_E_CURL 4L +#define HTTP_E_ENCODE 5L +#define HTTP_E_PARAM 6L +#define HTTP_E_URL 7L +#define HTTP_E_MSG 8L #endif /* PHP_HTTP_STD_DEFS_H */