+--------------------------------------------------------------------+
*/
-#include "php.h"
+#include <php.h>
#include "php_http_buffer.h"
PHP_HTTP_BUFFER_API php_http_buffer_t *php_http_buffer_init_ex(php_http_buffer_t *buf, size_t chunk_size, int flags)
return 0;
}
+PHP_HTTP_BUFFER_API char *php_http_buffer_account(php_http_buffer_t *buf, size_t to_account)
+{
+ /* it's probably already too late but check anyway */
+ if (to_account > buf->free) {
+ return NULL;
+ }
+
+ buf->free -= to_account;
+ buf->used += to_account;
+
+ return buf->data + buf->used;
+}
+
PHP_HTTP_BUFFER_API size_t php_http_buffer_shrink(php_http_buffer_t *buf)
{
/* avoid another realloc on fixation */
return chunk_size;
}
- if (storage->used >= (chunk_size = storage->size >> 1)) {
+ if (storage->used >= chunk_size) {
*chunk = estrndup(storage->data, chunk_size);
php_http_buffer_cut(storage, 0, chunk_size);
return chunk_size;
{
char *chunk = NULL;
size_t got = 0;
-
+
while ((got = php_http_buffer_chunk_buffer(s, data, data_len, &chunk, chunk_len))) {
passout(opaque, chunk, got TSRMLS_CC);
if (!chunk_len) {
STR_FREE(chunk);
}
-PHP_HTTP_BUFFER_API ssize_t php_http_buffer_passthru(php_http_buffer_t *s, size_t chunk_size, php_http_buffer_pass_func_t passin, void *passin_arg, php_http_buffer_pass_func_t passon, void *passon_arg TSRMLS_DC)
+PHP_HTTP_BUFFER_API ssize_t php_http_buffer_passthru(php_http_buffer_t **s, size_t chunk_size, php_http_buffer_pass_func_t passin, void *passin_arg, php_http_buffer_pass_func_t passon, void *passon_arg TSRMLS_DC)
{
- size_t passed_on = 0, passed_in = php_http_buffer_chunked_input(&s, chunk_size, passin, passin_arg TSRMLS_CC);
+ size_t passed_on = 0, passed_in = php_http_buffer_chunked_input(s, chunk_size, passin, passin_arg TSRMLS_CC);
if (passed_in == PHP_HTTP_BUFFER_PASS0) {
return passed_in;
}
- if (passed_in) {
- passed_on = passon(passon_arg, s->data, passed_in TSRMLS_CC);
+ if (passed_in || (*s)->used) {
+ passed_on = passon(passon_arg, (*s)->data, (*s)->used TSRMLS_CC);
if (passed_on == PHP_HTTP_BUFFER_PASS0) {
return passed_on;
}
if (passed_on) {
- php_http_buffer_cut(s, 0, passed_on);
+ php_http_buffer_cut(*s, 0, passed_on);
}
}