refactored client options
[m6w6/ext-http] / php_http_message_body.c
index c4c3f9d2a3508f65cf909084012afac1446ff531..e765a4b93df639762b79322afe976136785047a8 100644 (file)
@@ -111,8 +111,8 @@ PHP_HTTP_API const char *php_http_message_body_boundary(php_http_message_body_t
 
 PHP_HTTP_API char *php_http_message_body_etag(php_http_message_body_t *body)
 {
-       TSRMLS_FETCH_FROM_CTX(body->ts);
        const php_stream_statbuf *ssb = php_http_message_body_stat(body);
+       TSRMLS_FETCH_FROM_CTX(body->ts);
 
        /* real file or temp buffer ? */
        if (ssb && ssb->sb.st_mtime) {
@@ -134,8 +134,8 @@ PHP_HTTP_API char *php_http_message_body_etag(php_http_message_body_t *body)
 
 PHP_HTTP_API void php_http_message_body_to_string(php_http_message_body_t *body, char **buf, size_t *len, off_t offset, size_t forlen)
 {
-       TSRMLS_FETCH_FROM_CTX(body->ts);
        php_stream *s = php_http_message_body_stream(body);
+       TSRMLS_FETCH_FROM_CTX(body->ts);
 
        php_stream_seek(s, offset, SEEK_SET);
        if (!forlen) {
@@ -146,8 +146,8 @@ PHP_HTTP_API void php_http_message_body_to_string(php_http_message_body_t *body,
 
 PHP_HTTP_API void php_http_message_body_to_stream(php_http_message_body_t *body, php_stream *dst, off_t offset, size_t forlen)
 {
-       TSRMLS_FETCH_FROM_CTX(body->ts);
        php_stream *s = php_http_message_body_stream(body);
+       TSRMLS_FETCH_FROM_CTX(body->ts);
 
        php_stream_seek(s, offset, SEEK_SET);
        if (!forlen) {
@@ -158,9 +158,9 @@ PHP_HTTP_API void php_http_message_body_to_stream(php_http_message_body_t *body,
 
 PHP_HTTP_API void php_http_message_body_to_callback(php_http_message_body_t *body, php_http_pass_callback_t cb, void *cb_arg, off_t offset, size_t forlen)
 {
-       TSRMLS_FETCH_FROM_CTX(body->ts);
        php_stream *s = php_http_message_body_stream(body);
        char *buf = emalloc(0x1000);
+       TSRMLS_FETCH_FROM_CTX(body->ts);
 
        php_stream_seek(s, offset, SEEK_SET);
 
@@ -264,10 +264,13 @@ PHP_HTTP_API STATUS php_http_message_body_add_form_field(php_http_message_body_t
 
 PHP_HTTP_API STATUS php_http_message_body_add_form_file(php_http_message_body_t *body, const char *name, const char *ctype, const char *path, php_stream *in)
 {
-       char *safe_name, *path_dup = estrdup(path);
+       char *safe_name, *path_dup = estrdup(path), *bname;
+       size_t bname_len;
        TSRMLS_FETCH_FROM_CTX(body->ts);
 
        safe_name = php_addslashes(estrdup(name), strlen(name), NULL, 1 TSRMLS_CC);
+       
+       php_basename(path_dup, strlen(path_dup), NULL, 0, &bname, &bname_len TSRMLS_CC); 
 
        BOUNDARY_OPEN(body);
        php_http_message_body_appendf(
@@ -276,7 +279,7 @@ PHP_HTTP_API STATUS php_http_message_body_add_form_file(php_http_message_body_t
                "Content-Transfer-Encoding: binary" PHP_HTTP_CRLF
                "Content-Type: %s" PHP_HTTP_CRLF
                PHP_HTTP_CRLF,
-               safe_name, basename(path_dup), ctype
+               safe_name, bname, ctype
        );
        php_stream_copy_to_stream_ex(in, php_http_message_body_stream(body), PHP_STREAM_COPY_ALL, NULL);
        BOUNDARY_CLOSE(body);
@@ -534,6 +537,9 @@ PHP_HTTP_BEGIN_ARGS(__construct, 0)
 PHP_HTTP_END_ARGS;
 
 PHP_HTTP_EMPTY_ARGS(__toString);
+PHP_HTTP_BEGIN_ARGS(unserialize, 1)
+       PHP_HTTP_ARG_VAL(serialized, 0)
+PHP_HTTP_END_ARGS;
 
 PHP_HTTP_BEGIN_ARGS(toStream, 1)
        PHP_HTTP_ARG_VAL(stream, 0)
@@ -543,6 +549,8 @@ PHP_HTTP_BEGIN_ARGS(toCallback, 1)
        PHP_HTTP_ARG_VAL(callback, 0)
 PHP_HTTP_END_ARGS;
 
+PHP_HTTP_EMPTY_ARGS(getResource);
+
 PHP_HTTP_BEGIN_ARGS(append, 1)
        PHP_HTTP_ARG_VAL(string, 0)
 PHP_HTTP_END_ARGS;
@@ -573,8 +581,11 @@ static zend_function_entry php_http_message_body_method_entry[] = {
        PHP_HTTP_MESSAGE_BODY_ME(__construct, ZEND_ACC_PUBLIC|ZEND_ACC_CTOR)
        PHP_HTTP_MESSAGE_BODY_ME(__toString, ZEND_ACC_PUBLIC)
        PHP_MALIAS(HttpMessageBody, toString, __toString, args_for_HttpMessageBody___toString, ZEND_ACC_PUBLIC)
+       PHP_MALIAS(HttpMessageBody, serialize, __toString, args_for_HttpMessageBody___toString, ZEND_ACC_PUBLIC)
+       PHP_HTTP_MESSAGE_BODY_ME(unserialize, ZEND_ACC_PUBLIC)
        PHP_HTTP_MESSAGE_BODY_ME(toStream, ZEND_ACC_PUBLIC)
        PHP_HTTP_MESSAGE_BODY_ME(toCallback, ZEND_ACC_PUBLIC)
+       PHP_HTTP_MESSAGE_BODY_ME(getResource, ZEND_ACC_PUBLIC)
        PHP_HTTP_MESSAGE_BODY_ME(append, ZEND_ACC_PUBLIC)
        PHP_HTTP_MESSAGE_BODY_ME(addForm, ZEND_ACC_PUBLIC)
        PHP_HTTP_MESSAGE_BODY_ME(addPart, ZEND_ACC_PUBLIC)
@@ -590,7 +601,7 @@ PHP_MINIT_FUNCTION(http_message_body)
        php_http_message_body_class_entry->create_object = php_http_message_body_object_new;
        memcpy(&php_http_message_body_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
        php_http_message_body_object_handlers.clone_obj = php_http_message_body_object_clone;
-
+       zend_class_implements(php_http_message_body_class_entry TSRMLS_CC, 1, zend_ce_serializable);
        return SUCCESS;
 }
 
@@ -684,6 +695,19 @@ PHP_METHOD(HttpMessageBody, __toString)
        RETURN_EMPTY_STRING();
 }
 
+PHP_METHOD(HttpMessageBody, unserialize)
+{
+       char *us_str;
+       int us_len;
+
+       if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &us_str, &us_len)) {
+               php_http_message_body_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
+               php_stream *s = php_stream_memory_open(0, us_str, us_len);
+
+               obj->body = php_http_message_body_init(NULL, s TSRMLS_CC);
+       }
+}
+
 PHP_METHOD(HttpMessageBody, toStream)
 {
        zval *zstream;
@@ -722,6 +746,16 @@ PHP_METHOD(HttpMessageBody, toCallback)
        RETURN_FALSE;
 }
 
+PHP_METHOD(HttpMessageBody, getResource)
+{
+       if (SUCCESS == zend_parse_parameters_none()) {
+               php_http_message_body_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
+
+               zend_list_addref(obj->body->stream_id);
+               RETVAL_RESOURCE(obj->body->stream_id);
+       }
+}
+
 PHP_METHOD(HttpMessageBody, append)
 {
        char *str;