#define HTTP_SUPPORT_ENCODINGS 0x08L
#define HTTP_SUPPORT_SSLREQUESTS 0x20L
+#define HTTP_PARAMS_ALLOW_COMMA 0x01
+#define HTTP_PARAMS_ALLOW_FAILURE 0x02
+#define HTTP_PARAMS_RAISE_ERROR 0x04
+#define HTTP_PARAMS_DEFAULT (HTTP_PARAMS_ALLOW_COMMA|HTTP_PARAMS_ALLOW_FAILURE|HTTP_PARAMS_RAISE_ERROR)
+
extern PHP_MINIT_FUNCTION(http_support);
#define http_support(f) _http_support(f)
#define pretty_key(key, key_len, uctitle, xhyphen) _http_pretty_key(key, key_len, uctitle, xhyphen)
extern char *_http_pretty_key(char *key, size_t key_len, zend_bool uctitle, zend_bool xhyphen);
-typedef void (*http_key_list_decode_t)(const char *encoded, size_t encoded_len, char **decoded, size_t *decoded_len TSRMLS_DC);
-#define http_key_list_default_decoder _http_key_list_default_decoder
-extern void _http_key_list_default_decoder(const char *encoded, size_t encoded_len, char **decoded, size_t *decoded_len TSRMLS_DC);
-
-#define http_parse_cookie(l, i) _http_parse_key_list((l), (i), ';', http_key_list_default_decoder, 1 TSRMLS_CC)
-#define http_parse_key_list(l, i, s, d, f) _http_parse_key_list((l), (i), (s), (d), (f) TSRMLS_CC)
-extern 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);
-
#define http_error(type, code, string) _http_error_ex(type, code, "%s", string)
#define http_error_ex _http_error_ex
extern void _http_error_ex(long type TSRMLS_DC, long code, const char *format, ...);
+
+#ifdef ZEND_ENGINE_2
+#define http_exception_wrap(o, n, ce) _http_exception_wrap((o), (n), (ce) TSRMLS_CC)
+extern zval *_http_exception_wrap(zval *old_exception, zval *new_exception, zend_class_entry *ce TSRMLS_DC);
+
+#define http_try \
+{ \
+ zval *old_exception = EG(exception); \
+ EG(exception) = NULL;
+#define http_catch(ex_ce) \
+ if (EG(exception) && old_exception) { \
+ EG(exception) = http_exception_wrap(old_exception, EG(exception), ex_ce); \
+ } \
+}
+#define http_final(ex_ce) \
+ if (EG(exception)) { \
+ zval *exception = http_exception_wrap(EG(exception), NULL, ex_ce); \
+ EG(exception) = NULL; \
+ zend_throw_exception_object(exception TSRMLS_CC); \
+ }
+#endif /* ZEND_ENGINE_2 */
+
+
#define HTTP_CHECK_CURL_INIT(ch, init, action) \
if ((!(ch)) && (!((ch) = init))) { \
http_error(HE_WARNING, HTTP_E_REQUEST, "Could not initialize curl"); \
#define http_get_request_body_ex(b, l, d) _http_get_request_body_ex((b), (l), (d) TSRMLS_CC)
PHP_HTTP_API STATUS _http_get_request_body_ex(char **body, size_t *length, zend_bool dup TSRMLS_DC);
+#define http_get_request_body_stream() _http_get_request_body_stream(TSRMLS_C)
+PHP_HTTP_API php_stream *_http_get_request_body_stream(TSRMLS_D);
+
+
+typedef void (*http_parse_params_callback)(void *cb_arg, const char *key, int keylen, const char *val, int vallen TSRMLS_DC);
+
+#define http_parse_params_default_callback _http_parse_params_default_callback
+PHP_HTTP_API void _http_parse_params_default_callback(void *ht, const char *key, int keylen, const char *val, int vallen TSRMLS_DC);
+
+#define http_parse_params(s, f, ht) _http_parse_params_ex((s), (f), _http_parse_params_default_callback, (ht) TSRMLS_CC)
+#define http_parse_params_ex(s, f, cb, a) _http_parse_params_ex((s), (f), (cb), (a) TSRMLS_CC)
+PHP_HTTP_API STATUS _http_parse_params_ex(const char *params, int flags, http_parse_params_callback cb, void *cb_arg TSRMLS_DC);
+
#define http_locate_body _http_locate_body
static inline const char *_http_locate_body(const char *message)
{
- const char *cr = strstr(message, "\r\n\r\n");
- const char *lf = strstr(message, "\n\n");
-
- if (lf && cr) {
- return MIN(lf + 2, cr + 4);
- } else if (lf || cr) {
- return MAX(lf + 2, cr + 4);
- } else {
- return NULL;
+ const char *body = NULL, *msg = message;
+
+ while (*msg) {
+ if (*msg == '\n') {
+ if (*(msg+1) == '\n') {
+ body = msg + 2;
+ break;
+ } else if (*(msg+1) == '\r' && *(msg+2) == '\n' && msg != message && *(msg-1) == '\r') {
+ body = msg + 3;
+ break;
+ }
+ }
+ ++msg;
}
+ return body;
}
#define http_locate_eol _http_locate_eol
static inline zval *_convert_to_type(int type, zval *z)
{
if (Z_TYPE_P(z) != type) {
- switch (type)
- {
+ switch (type) {
case IS_NULL: convert_to_null(z); break;
case IS_BOOL: convert_to_boolean(z); break;
case IS_LONG: convert_to_long(z); break;
- case IS_DOUBLE: convert_to_array(z); break;
+ case IS_DOUBLE: convert_to_double(z); break;
case IS_STRING: convert_to_string(z); break;
case IS_ARRAY: convert_to_array(z); break;
case IS_OBJECT: convert_to_object(z); break;
{
*p = z;
if (Z_TYPE_P(z) != type) {
- switch (type)
- {
+ switch (type) {
case IS_NULL: convert_to_null_ex(&z); break;
case IS_BOOL: convert_to_boolean_ex(&z); break;
case IS_LONG: convert_to_long_ex(&z); break;
- case IS_DOUBLE: convert_to_array_ex(&z); break;
+ case IS_DOUBLE: convert_to_double_ex(&z); break;
case IS_STRING: convert_to_string_ex(&z); break;
case IS_ARRAY: convert_to_array_ex(&z); break;
case IS_OBJECT: convert_to_object_ex(&z); break;