+#define http_flush() _http_flush(TSRMLS_C)
+/* {{{ static inline void http_flush() */
+static inline void _http_flush(TSRMLS_D)
+{
+ php_end_ob_buffer(1, 1 TSRMLS_CC);
+ sapi_flush(TSRMLS_C);
+}
+/* }}} */
+
+#define http_sleep() _http_sleep(TSRMLS_C)
+/* {{{ static inline void http_sleep() */
+static inline void _http_sleep(TSRMLS_D)
+{
+#define HTTP_MSEC(s) (s * 1000)
+#define HTTP_USEC(s) (HTTP_MSEC(s) * 1000)
+#define HTTP_NSEC(s) (HTTP_USEC(s) * 1000)
+#define HTTP_NANOSEC (1000 * 1000 * 1000)
+#define HTTP_DIFFSEC (0.001)
+
+ if (HTTP_G(send).throttle_delay >= HTTP_DIFFSEC) {
+#if defined(PHP_WIN32)
+ Sleep((DWORD) HTTP_MSEC(HTTP_G(send).throttle_delay));
+#elif defined(HAVE_USLEEP)
+ usleep(HTTP_USEC(HTTP_G(send).throttle_delay));
+#elif defined(HAVE_NANOSLEEP)
+ struct timespec req, rem;
+
+ req.tv_sec = (time_t) HTTP_G(send).throttle_delay;
+ req.tv_nsec = HTTP_NSEC(HTTP_G(send).throttle_delay) % HTTP_NANOSEC;
+
+ while (nanosleep(&req, &rem) && (errno == EINTR) && (HTTP_NSEC(rem.tv_sec) + rem.tv_nsec) > HTTP_NSEC(HTTP_DIFFSEC))) {
+ req.tv_sec = rem.tv_sec;
+ req.tv_nsec = rem.tv_nsec;
+ }
+#endif
+ }
+}
+/* }}} */
+#ifdef HTTP_HAVE_ZLIB
+# define HTTP_CHUNK_ENCODE(data, size, dogzip) \
+ if (dogzip) { \
+ char *encoded = NULL; \
+ size_t encoded_len = 0; \
+ \
+ if (SUCCESS != http_encode(dogzip, 1, data, size, &encoded, &encoded_len)) { \
+ return FAILURE; \
+ } \
+ \
+ data = encoded; \
+ size = encoded_len; \
+ }
+#else
+# define HTTP_CHUNK_ENCODE(data, size, dogzip)
+#endif
+
+#define HTTP_CHUNK_AVAIL(len, cs) ((len -= cs) >= 0)
+#define HTTP_CHUNK_WRITE(d, l, dofree, dosleep, dogzip) \
+ { \
+ long size = (long) l; \
+ char *data = (char *) d; \
+ \
+ HTTP_CHUNK_ENCODE(data, size, dogzip); \
+ \
+ if ((1 > size) || (size - PHPWRITE(data, size))) { \
+ if (dofree) { \
+ efree(data); \
+ } \
+ return FAILURE; \
+ } \
+ \
+ http_flush(); \
+ if (dosleep) { \
+ http_sleep(); \
+ } \
+ }
+