- remove const qualifier from url param in http_request_*()
authorMichael Wallner <mike@php.net>
Tue, 14 Jun 2005 19:17:55 +0000 (19:17 +0000)
committerMichael Wallner <mike@php.net>
Tue, 14 Jun 2005 19:17:55 +0000 (19:17 +0000)
- allow HttpRequestPools to be used only once

http_methods.c
http_request_api.c
http_request_pool_api.c
http_url_api.c
php_http_request_api.h
php_http_request_pool_api.h

index d71c2caa6d4d7a5f4756ac6baabea975c6eabba0..94a47573f3e69c164cb2fd85077649727eb7c77e 100644 (file)
@@ -2156,8 +2156,8 @@ PHP_METHOD(HttpRequest, send)
  *     }
  *     $pool->send();
  *     foreach ($urls as $url) {
- *         printf("%s (%s) is %s\n", 
- *             $url, $req[$url]->getResponseInfo('effective_url'), 
+ *         printf("%s (%s) is %s\n",
+ *             $url, $req[$url]->getResponseInfo('effective_url'),
  *             $r->getResponseCode() == 200 ? 'alive' : 'not alive'
  *         );
  *     }
@@ -2255,11 +2255,16 @@ PHP_METHOD(HttpRequestPool, detach)
  */
 PHP_METHOD(HttpRequestPool, send)
 {
+       STATUS status;
        getObject(http_requestpool_object, obj);
 
        NO_ARGS;
 
-       RETURN_SUCCESS(http_request_pool_send(&obj->pool));
+       SET_EH_THROW_HTTP();
+       status = http_request_pool_send(&obj->pool);
+       SET_EH_NORMAL();
+
+       RETURN_SUCCESS(status);
 }
 /* }}} */
 
index 2a4884ad9d2660f9419544464bae63a127d1dc16..5bc0f8fb3ae9a28537812402b9f0c29c6fbfcf46 100644 (file)
@@ -153,7 +153,8 @@ void *_http_request_data_copy(int type, void *data TSRMLS_DC)
        {
                case COPY_STRING:
                {
-                       char *new_str = estrdup((const char*) data);
+                       char *new_str = estrdup(data);
+                       //fprintf(stderr, "COPY STRING: %p (%s)\n", new_str, new_str);
                        zend_llist_add_element(&HTTP_G(request).copies.strings, &new_str);
                        return new_str;
                }
@@ -181,6 +182,7 @@ void *_http_request_data_copy(int type, void *data TSRMLS_DC)
 /* {{{ void http_request_data_free_string(char **) */
 void _http_request_data_free_string(void *string)
 {
+       //fprintf(stderr, "FREE STRING %p (%s)\n", *((char **)string), *((char **)string));
        efree(*((char **)string));
 }
 /* }}} */
@@ -318,7 +320,7 @@ PHP_HTTP_API void _http_request_body_free(http_request_body *body TSRMLS_DC)
 /* }}} */
 
 /* {{{ STATUS http_request_init(CURL *, http_request_method, char *, http_request_body *, HashTable *, phpstr *) */
-PHP_HTTP_API STATUS _http_request_init(CURL *ch, http_request_method meth, const char *url, http_request_body *body, HashTable *options, phpstr *response TSRMLS_DC)
+PHP_HTTP_API STATUS _http_request_init(CURL *ch, http_request_method meth, char *url, http_request_body *body, HashTable *options, phpstr *response TSRMLS_DC)
 {
        zval *zoption;
        zend_bool range_req = 0;
@@ -330,7 +332,7 @@ PHP_HTTP_API STATUS _http_request_init(CURL *ch, http_request_method meth, const
 
        /* set options */
        if (url) {
-               HTTP_CURL_OPT(URL, http_request_data_copy(COPY_STRING, (void *) url));
+               HTTP_CURL_OPT(URL, http_request_data_copy(COPY_STRING, url));
        }
 
        if (response) {
@@ -701,7 +703,7 @@ PHP_HTTP_API void _http_request_info(CURL *ch, HashTable *info TSRMLS_DC)
 /* }}} */
 
 /* {{{ STATUS http_request_ex(CURL *, http_request_method, char *, http_request_body, HashTable, HashTable, phpstr *) */
-PHP_HTTP_API STATUS _http_request_ex(CURL *ch, http_request_method meth, const char *url, http_request_body *body, HashTable *options, HashTable *info, phpstr *response TSRMLS_DC)
+PHP_HTTP_API STATUS _http_request_ex(CURL *ch, http_request_method meth, char *url, http_request_body *body, HashTable *options, HashTable *info, phpstr *response TSRMLS_DC)
 {
        STATUS status;
        zend_bool clean_curl;
index 610412ac24f28e4477f40c70aef8e7d96cd99b63..437530350af87b17d01aa332b11ba424209b726b 100644 (file)
@@ -59,6 +59,7 @@ PHP_HTTP_API http_request_pool *_http_request_pool_init(http_request_pool *pool
                }
        }
 
+       pool->sent = 0;
        pool->unfinished = 0;
        zend_llist_init(&pool->handles, sizeof(zval *), (llist_dtor_func_t) ZVAL_PTR_DTOR, 0);
        zend_llist_init(&pool->bodies, sizeof(http_request_body *), (llist_dtor_func_t) http_request_pool_freebody, 0);
@@ -108,7 +109,7 @@ PHP_HTTP_API STATUS _http_request_pool_detach(http_request_pool *pool, zval *req
 {
        getObjectEx(http_request_object, req, request);
 #if HTTP_DEBUG_REQPOOLS
-       fprintf(stderr, "Detaching request %p (pool: %p) from pool %p\n", req, req->pool, pool);
+       fprintf(stderr, "Detaching request %p from pool %p\n", req, pool);
 #endif
        if (req->pool != pool) {
                http_error(E_WARNING, HTTP_E_CURL, "HttpRequest object is not attached to this HttpRequestPool");
@@ -161,6 +162,12 @@ PHP_HTTP_API STATUS _http_request_pool_send(http_request_pool *pool TSRMLS_DC)
 #if HTTP_DEBUG_REQPOOLS
        fprintf(stderr, "Attempt to send requests of pool %p\n", pool);
 #endif
+       if (pool->sent) {
+               http_error(E_WARNING, HTTP_E_CURL, "HttpRequestPools can only be used once");
+               return FAILURE;
+       } else {
+               pool->sent = 1;
+       }
        while (http_request_pool_perform(pool)) {
 #if HTTP_DEBUG_REQPOOLS
                fprintf(stderr, "%d unfinished requests of pool %p remaining\n", pool->unfinished, pool);
index 83d295af4f58e92eb37c811fffcd6095c171c9a5..288abe445b1f88067777a33fa3dc90101923f2c1 100644 (file)
@@ -54,7 +54,7 @@ PHP_HTTP_API char *_http_absolute_url_ex(
        php_url *purl, furl = {NULL};
        size_t full_len = 0;
        zval *zhost = NULL;
-       char *scheme = NULL, *URL = ecalloc(1, HTTP_URI_MAXLEN + 1);
+       char *scheme = NULL, *uri, *URL = ecalloc(1, HTTP_URI_MAXLEN + 1);
 
        if ((!url || !url_len) && (
                        (!(url = SG(request_info).request_uri)) ||
@@ -63,7 +63,8 @@ PHP_HTTP_API char *_http_absolute_url_ex(
                return NULL;
        }
 
-       if (!(purl = php_url_parse((char *) url))) {
+       uri = estrndup(url, url_len);
+       if (!(purl = php_url_parse(uri))) {
                http_error_ex(E_WARNING, HTTP_E_PARSE, "Could not parse supplied URL: %s", url);
                return NULL;
        }
@@ -123,6 +124,7 @@ PHP_HTTP_API char *_http_absolute_url_ex(
                        efree(scheme); \
                } \
                php_url_free(purl); \
+               efree(uri); \
                return URL; \
        } else { \
                strcat(URL, add_string); \
@@ -172,6 +174,7 @@ PHP_HTTP_API char *_http_absolute_url_ex(
                efree(scheme);
        }
        php_url_free(purl);
+       efree(uri);
 
        return URL;
 }
index 2aee64d0117ad40f3acdc87419c32679cb858a17..c772b43aae15dbb97ee568588992b60462cbd21a 100644 (file)
@@ -120,7 +120,7 @@ PHP_HTTP_API void _http_request_body_dtor(http_request_body *body TSRMLS_DC);
 PHP_HTTP_API void _http_request_body_free(http_request_body *body TSRMLS_DC);
 
 #define http_request_init(ch, meth, url, body, options, response) _http_request_init((ch), (meth), (url), (body), (options), (response) TSRMLS_CC)
-PHP_HTTP_API STATUS _http_request_init(CURL *ch, http_request_method meth, const char *url, http_request_body *body, HashTable *options, phpstr *response TSRMLS_DC);
+PHP_HTTP_API STATUS _http_request_init(CURL *ch, http_request_method meth, char *url, http_request_body *body, HashTable *options, phpstr *response TSRMLS_DC);
 
 #define http_request_exec(ch, i) _http_request_exec((ch), (i) TSRMLS_CC)
 PHP_HTTP_API STATUS _http_request_exec(CURL *ch, HashTable *info TSRMLS_DC);
@@ -130,7 +130,7 @@ PHP_HTTP_API void _http_request_info(CURL *ch, HashTable *info TSRMLS_DC);
 
 #define http_request(meth, url, body, opt, info, resp) _http_request_ex(NULL, (meth), (url), (body), (opt), (info), (resp) TSRMLS_CC)
 #define http_request_ex(ch, meth, url, body, opt, info, resp) _http_request_ex((ch), (meth), (url), (body), (opt), (info), (resp) TSRMLS_CC)
-PHP_HTTP_API STATUS _http_request_ex(CURL *ch, http_request_method meth, const char *URL, http_request_body *body, HashTable *options, HashTable *info, phpstr *response TSRMLS_DC);
+PHP_HTTP_API STATUS _http_request_ex(CURL *ch, http_request_method meth, char *URL, http_request_body *body, HashTable *options, HashTable *info, phpstr *response TSRMLS_DC);
 
 #define http_get(u, o, i, r) _http_request_ex(NULL, HTTP_GET, (u), NULL, (o), (i), (r) TSRMLS_CC)
 #define http_get_ex(c, u, o, i, r) _http_request_ex((c), HTTP_GET, (u), NULL, (o), (i), (r) TSRMLS_CC)
index 3243de936e0ea672eaee399c1f2212335a96e17e..115cd3d5202f0c38bddadb1c3d65268b327778ff 100644 (file)
@@ -29,6 +29,7 @@
 
 typedef struct {
        CURLM *ch;
+       zend_bool sent;
        zend_llist handles;
        zend_llist bodies;
        int unfinished;