+PHP_FUNCTION(http_post_fields)
+{
+ zval *options = NULL, *info = NULL, *fields, *files = NULL;
+ char *URL;
+ int URL_len;
+ phpstr response;
+ http_request_body body;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sa|aa/!z", &URL, &URL_len, &fields, &files, &options, &info) != SUCCESS) {
+ RETURN_FALSE;
+ }
+
+ if (SUCCESS != http_request_body_fill(&body, Z_ARRVAL_P(fields), files ? Z_ARRVAL_P(files) : NULL)) {
+ RETURN_FALSE;
+ }
+
+ if (info) {
+ zval_dtor(info);
+ array_init(info);
+ }
+
+ phpstr_init_ex(&response, HTTP_CURLBUF_SIZE, 0);
+ if (SUCCESS == http_post(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_file(string url, string file[, array options[, array &info]])
+ *
+ * Performs an HTTP PUT request, uploading file.
+ * Returns the HTTP response as string.
+ * See http_get() for a full list of available options.
+ */
+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]])
+ *
+ * Performs an HTTP PUT request, uploading stream.
+ * Returns the HTTP response as string.
+ * See http_get() for a full list of available options.
+ */
+PHP_FUNCTION(http_put_stream)