- added http_get_request_body()
[m6w6/ext-http] / http_functions.c
index ba2bd56135717d73c50e2ad40693e5179f29e5cd..4e67be7aee3fac005c0e2f083d096c94e0986b60 100644 (file)
@@ -416,7 +416,7 @@ PHP_FUNCTION(ob_etaghandler)
  * Use with http_send() API.
  *
  * Example:
- * <code>
+ * <pre>
  * <?php
  * // ~ 20 kbyte/s
  * # http_throttle(1, 20000);
@@ -424,7 +424,7 @@ PHP_FUNCTION(ob_etaghandler)
  * # http_throttle(0.1, 2000);
  * http_send_file('document.pdf');
  * ?>
- * </code>
+ * </pre>
  */
 PHP_FUNCTION(http_throttle)
 {
@@ -460,7 +460,7 @@ PHP_FUNCTION(http_redirect)
        size_t query_len = 0;
        zend_bool session = 0, permanent = 0;
        zval *params = NULL;
-       char *query, *url, *URI,
+       char *query = NULL, *url = NULL, *URI,
                LOC[HTTP_URI_MAXLEN + sizeof("Location: ")],
                RED[HTTP_URI_MAXLEN * 2 + sizeof("Redirecting to <a href=\"%s?%s\">%s?%s</a>.\n")];
 
@@ -606,26 +606,26 @@ PHP_FUNCTION(http_chunked_decode)
  */
 PHP_FUNCTION(http_split_response)
 {
-       zval *zresponse, *zbody, *zheaders;
+       char *response, *body;
+       int response_len;
+       size_t body_len;
+       zval *zheaders;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &zresponse) != SUCCESS) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &response, &response_len) != SUCCESS) {
                RETURN_FALSE;
        }
 
-       convert_to_string(zresponse);
-
-       MAKE_STD_ZVAL(zbody);
        MAKE_STD_ZVAL(zheaders);
        array_init(zheaders);
 
-       if (SUCCESS != http_split_response(zresponse, zheaders, zbody)) {
+       if (SUCCESS != http_split_response(response, response_len, Z_ARRVAL_P(zheaders), &body, &body_len)) {
                http_error(E_WARNING, HTTP_E_PARSE, "Could not parse HTTP response");
                RETURN_FALSE;
        }
 
        array_init(return_value);
        add_index_zval(return_value, 0, zheaders);
-       add_index_zval(return_value, 1, zbody);
+       add_index_stringl(return_value, 1, body, body_len, 0);
 }
 /* }}} */
 
@@ -652,6 +652,7 @@ PHP_FUNCTION(http_parse_headers)
 
 /* {{{ proto array http_get_request_headers(void)
  *
+ * Get a list of incoming HTTP headers.
  */
 PHP_FUNCTION(http_get_request_headers)
 {
@@ -662,6 +663,43 @@ PHP_FUNCTION(http_get_request_headers)
 }
 /* }}} */
 
+/* {{{ proto string http_get_request_body(void)
+ *
+ * Get the raw request body (e.g. POST or PUT data).
+ */
+PHP_FUNCTION(http_get_request_body)
+{
+       char *body;
+       size_t length;
+
+       NO_ARGS;
+
+       if (SUCCESS == http_get_request_body(&body, &length)) {
+               RETURN_STRING(body, (int) length, 0);
+       } else {
+               RETURN_NULL();
+       }
+}
+/* }}} */
+
+/* {{{ proto bool http_match_request_header(string header, string value[, bool match_case = false])
+ *
+ * Match an incoming HTTP header.
+ */
+PHP_FUNCTION(http_match_request_header)
+{
+       char *header, *value;
+       int header_len, value_len;
+       zend_bool match_case = 0, result = 0;
+
+       if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|b", &header, &header_len, &value, &value_len, &match_case)) {
+               RETURN_FALSE;
+       }
+
+       RETURN_BOOL(http_match_request_header_ex(header, value, match_case));
+}
+/* }}} */
+
 /* {{{ HAVE_CURL */
 #ifdef HTTP_HAVE_CURL
 
@@ -825,7 +863,6 @@ PHP_FUNCTION(http_post_data)
        } else {
                RETVAL_FALSE;
        }
-       http_request_body_dtor(&body);
 }
 /* }}} */
 
@@ -868,6 +905,9 @@ PHP_FUNCTION(http_post_fields)
 
 /* {{{ 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)
 {
@@ -912,6 +952,9 @@ PHP_FUNCTION(http_put_file)
 
 /* {{{ 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)
 {
@@ -950,12 +993,9 @@ PHP_FUNCTION(http_put_stream)
 }
 /* }}} */
 
-/* {{{ proto bool http_request()
- */
-/* }}} */
-
 /* {{{ proto long http_request_method_register(string method)
  *
+ * Register a custom request method.
  */
 PHP_FUNCTION(http_request_method_register)
 {
@@ -976,6 +1016,7 @@ PHP_FUNCTION(http_request_method_register)
 
 /* {{{ proto bool http_request_method_unregister(mixed method)
  *
+ * Unregister a previously registered custom request method.
  */
 PHP_FUNCTION(http_request_method_unregister)
 {
@@ -1011,6 +1052,7 @@ PHP_FUNCTION(http_request_method_unregister)
 
 /* {{{ proto long http_request_method_exists(mixed method)
  *
+ * Check if a request method is registered (or available by default).
  */
 PHP_FUNCTION(http_request_method_exists)
 {
@@ -1042,6 +1084,7 @@ PHP_FUNCTION(http_request_method_exists)
 
 /* {{{ proto string http_request_method_name(long method)
  *
+ * Get the literal string representation of a standard or registered request method.
  */
 PHP_FUNCTION(http_request_method_name)
 {
@@ -1084,18 +1127,18 @@ PHP_FUNCTION(http_auth_basic)
                realm = "Restricted";
        }
 
-       if (SUCCESS != http_auth_credentials(&suser, &spass)) {
-               http_auth_header("Basic", realm);
+       if (SUCCESS != http_auth_basic_credentials(&suser, &spass)) {
+               http_auth_basic_header(realm);
                RETURN_FALSE;
        }
 
        if (strcasecmp(suser, user)) {
-               http_auth_header("Basic", realm);
+               http_auth_basic_header(realm);
                RETURN_FALSE;
        }
 
        if (strcmp(spass, pass)) {
-               http_auth_header("Basic", realm);
+               http_auth_basic_header(realm);
                RETURN_FALSE;
        }
 
@@ -1137,8 +1180,8 @@ PHP_FUNCTION(http_auth_basic_cb)
                realm = "Restricted";
        }
 
-       if (SUCCESS != http_auth_credentials(&user, &pass)) {
-               http_auth_header("Basic", realm);
+       if (SUCCESS != http_auth_basic_credentials(&user, &pass)) {
+               http_auth_basic_header(realm);
                RETURN_FALSE;
        }
        {
@@ -1161,7 +1204,7 @@ PHP_FUNCTION(http_auth_basic_cb)
                efree(zparams[1]);
 
                if (!result) {
-                       http_auth_header("Basic", realm);
+                       http_auth_basic_header(realm);
                }
 
                RETURN_BOOL(result);