- improved put support
[m6w6/ext-http] / http_functions.c
index 5dc49b5c4dc64e64bdeaa8fe787af1322108f907..afe6f85f6a6ec5f78225f9918feacea486d0d092 100644 (file)
@@ -837,6 +837,90 @@ PHP_FUNCTION(http_post_fields)
 }
 /* }}} */
 
+/* {{{ proto string http_put_file(string url, string file[, array options[, array &info]])
+ *
+ */
+PHP_FUNCTION(http_put_file)
+{
+       char *URL, *file;
+       int URL_len, f_len;
+       zval *options = NULL, *info = NULL;
+       phpstr response;
+       php_stream *stream;
+       php_stream_statbuf ssb;
+       http_request_body body;
+
+       if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|a/!z", &URL, &URL_len, &file, &f_len, &options, &info)) {
+               RETURN_FALSE;
+       }
+
+       if (!(stream = php_stream_open_wrapper(file, "rb", REPORT_ERRORS|ENFORCE_SAFE_MODE, NULL))) {
+               RETURN_FALSE;
+       }
+       if (php_stream_stat(stream, &ssb)) {
+               php_stream_close(stream);
+               RETURN_FALSE;
+       }
+
+       if (info) {
+               zval_dtor(info);
+               array_init(info);
+       }
+
+       body.type = HTTP_REQUEST_BODY_UPLOADFILE;
+       body.data = stream;
+       body.size = ssb.sb.st_size;
+
+       phpstr_init_ex(&response, HTTP_CURLBUF_SIZE, 0);
+       if (SUCCESS == http_put(URL, &body, options ? Z_ARRVAL_P(options) : NULL, info ? Z_ARRVAL_P(info) : NULL, &response)) {
+               RETVAL_PHPSTR_VAL(response);
+       } else {
+               RETVAL_FALSE;
+       }
+       http_request_body_dtor(&body);
+}
+/* }}} */
+
+/* {{{ proto string http_put_stream(string url, resource stream[, array options[, array &info]])
+ *
+ */
+PHP_FUNCTION(http_put_stream)
+{
+       zval *resource, *options = NULL, *info = NULL;
+       char *URL;
+       int URL_len;
+       phpstr response;
+       php_stream *stream;
+       php_stream_statbuf ssb;
+       http_request_body body;
+       
+       if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sr|a/!z", &URL, &URL_len, &resource, &options, &info)) {
+               RETURN_FALSE;
+       }
+       
+       php_stream_from_zval(stream, &resource);
+       if (php_stream_stat(stream, &ssb)) {
+               RETURN_FALSE;
+       }
+       
+       if (info) {
+               zval_dtor(info);
+               array_init(info);
+       }
+       
+       body.type = HTTP_REQUEST_BODY_UPLOADFILE;
+       body.data = stream;
+       body.size = ssb.sb.st_size;
+       
+       phpstr_init_ex(&response, HTTP_CURLBUF_SIZE, 0);
+       if (SUCCESS == http_put(URL, &body, options ? Z_ARRVAL_P(options) : NULL, info ? Z_ARRVAL_P(info) : NULL, &response)) {
+               RETURN_PHPSTR_VAL(response);
+       } else {
+               RETURN_NULL();
+       }
+}
+/* }}} */
+
 #endif
 /* }}} HAVE_CURL */