-#define http_send_ranges(r, d, s, m) _http_send_ranges((r), (d), (s), (m) TSRMLS_CC)
-PHP_HTTP_API STATUS _http_send_ranges(zval *zranges, const void *data, const size_t size, const http_send_mode mode TSRMLS_DC);
-
-#define http_send(d, s, m) _http_send((d), (s), (m) TSRMLS_CC)
-PHP_HTTP_API STATUS _http_send(const void *data, const size_t data_size, const http_send_mode mode TSRMLS_DC);
-
-#define http_send_data(z) _http_send_data((z) TSRMLS_CC)
-PHP_HTTP_API STATUS _http_send_data(const zval *zdata TSRMLS_DC);
-
-#define http_send_stream(s) _http_send_stream((s) TSRMLS_CC)
-PHP_HTTP_API STATUS _http_send_stream(const php_stream *s TSRMLS_DC);
-
-#define http_send_file(f) _http_send_file((f) TSRMLS_CC)
-PHP_HTTP_API STATUS _http_send_file(const zval *zfile TSRMLS_DC);
-
-#define http_chunked_decode(e, el, d, dl) _http_chunked_decode((e), (el), (d), (dl) TSRMLS_CC)
-PHP_HTTP_API STATUS _http_chunked_decode(const char *encoded, const size_t encoded_len, char **decoded, size_t *decoded_len TSRMLS_DC);
-
-#define http_split_response(r, h, b) _http_split_response((r), (h), (b) TSRMLS_CC)
-PHP_HTTP_API STATUS _http_split_response(const zval *zresponse, zval *zheaders, zval *zbody TSRMLS_DC);
-
-#define http_parse_headers(h, l, a) _http_parse_headers((h), (l), (a) TSRMLS_CC)
-PHP_HTTP_API STATUS _http_parse_headers(char *header, int header_len, zval *array TSRMLS_DC);
-
-#define http_get_request_headers(h) _http_get_request_headers((h) TSRMLS_CC)
-PHP_HTTP_API void _http_get_request_headers(zval *array TSRMLS_DC);
-
-/* {{{ HAVE_CURL */
-#ifdef HTTP_HAVE_CURL
-
-#define http_get(u, o, i, d, l) _http_get((u), (o), (i), (d), (l) TSRMLS_CC)
-PHP_HTTP_API STATUS _http_get(const char *URL, HashTable *options, HashTable *info, char **data, size_t *data_len TSRMLS_DC);
-#define http_get_ex(c, u, o, i, d, l) _http_get_ex((c), (u), (o), (i), (d), (l) TSRMLS_CC)
-PHP_HTTP_API STATUS _http_get_ex(CURL *ch, const char *URL, HashTable *options, HashTable *info, char **data, size_t *data_len TSRMLS_DC);
-
-#define http_head(u, o, i, d, l) _http_head((u), (o), (i), (d), (l) TSRMLS_CC)
-PHP_HTTP_API STATUS _http_head(const char *URL, HashTable *options, HashTable *info, char **data, size_t *data_len TSRMLS_DC);
-#define http_head_ex(c, u, o, i, d, l) _http_head_ex((c), (u), (o), (i), (d), (l) TSRMLS_CC)
-PHP_HTTP_API STATUS _http_head_ex(CURL *ch, const char *URL, HashTable *options, HashTable *info, char **data, size_t *data_len TSRMLS_DC);
-
-#define http_post_data(u, pd, pl, o, i, d, l) _http_post_data((u), (pd), (pl), (o), (i), (d), (l) TSRMLS_CC)
-PHP_HTTP_API STATUS _http_post_data(const char *URL, char *postdata, size_t postdata_len, HashTable *options, HashTable *info, char **data, size_t *data_len TSRMLS_DC);
-#define http_post_data_ex(c, u, pd, pl, o, i, d, l) _http_post_data_ex((c), (u), (pd), (pl), (o), (i), (d), (l) TSRMLS_CC)
-PHP_HTTP_API STATUS _http_post_data_ex(CURL *ch, const char *URL, char *postdata, size_t postdata_len, HashTable *options, HashTable *info, char **data, size_t *data_len TSRMLS_DC);
-
-#define http_post_array(u, p, o, i, d, l) _http_post_array((u), (p), (o), (i), (d), (l) TSRMLS_CC)
-PHP_HTTP_API STATUS _http_post_array(const char *URL, HashTable *postarray, HashTable *options, HashTable *info, char **data, size_t *data_len 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"); \
+ action; \
+ }
+#define HTTP_CHECK_CONTENT_TYPE(ct, action) \
+ if (!strchr((ct), '/')) { \
+ http_error_ex(HE_WARNING, HTTP_E_INVALID_PARAM, \
+ "Content type \"%s\" does not seem to contain a primary and a secondary part", (ct)); \
+ action; \
+ }
+#define HTTP_CHECK_MESSAGE_TYPE_RESPONSE(msg, action) \
+ if (!HTTP_MSG_TYPE(RESPONSE, (msg))) { \
+ http_error(HE_NOTICE, HTTP_E_MESSAGE_TYPE, "HttpMessage is not of type HTTP_MSG_RESPONSE"); \
+ action; \
+ }
+#define HTTP_CHECK_MESSAGE_TYPE_REQUEST(msg, action) \
+ if (!HTTP_MSG_TYPE(REQUEST, (msg))) { \
+ http_error(HE_NOTICE, HTTP_E_MESSAGE_TYPE, "HttpMessage is not of type HTTP_MSG_REQUEST"); \
+ action; \
+ }
+#define HTTP_CHECK_GZIP_LEVEL(level, action) \
+ if (level < -1 || level > 9) { \
+ http_error_ex(HE_WARNING, HTTP_E_INVALID_PARAM, "Invalid compression level (-1 to 9): %d", level); \
+ action; \
+ }
+
+#define HTTP_CHECK_HEADERS_SENT(action) \
+ if (SG(headers_sent) && !SG(request_info).no_headers) { \
+ char *output_start_filename = php_get_output_start_filename(TSRMLS_C); \
+ int output_start_lineno = php_get_output_start_lineno(TSRMLS_C); \
+ \
+ if (output_start_filename) { \
+ http_error_ex(HE_WARNING, HTTP_E_HEADER, "Cannot modify header information - headers already sent by (output started at %s:%d)", \
+ output_start_filename, output_start_lineno); \
+ } else { \
+ http_error(HE_WARNING, HTTP_E_HEADER, "Cannot modify header information - headers already sent"); \
+ } \
+ action; \
+ }
+
+#define HTTP_CHECK_OPEN_BASEDIR(file, act) \
+ if ((PG(open_basedir) && *PG(open_basedir)) || PG(safe_mode)) \
+ { \
+ const char *tmp = file; \
+ \
+ if (!strncasecmp(tmp, "file:", lenof("file:"))) { \
+ tmp += lenof("file:"); \
+ while ((tmp - (const char *)file < 7) && (*tmp == '/' || *tmp == '\\')) ++tmp; \
+ } \
+ \
+ if ( (tmp != file || !strstr(file, "://")) && \
+ (!*tmp || php_check_open_basedir(tmp TSRMLS_CC) || \
+ (PG(safe_mode) && !php_checkuid(tmp, "rb+", CHECKUID_CHECK_MODE_PARAM)))) { \
+ act; \
+ } \
+ }