X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_functions.c;h=617d223f1f335d381bdd085c04c7654c48a0dfa8;hp=ae27b5ea7f213ad46bb174b6a70c060b933c7ff1;hb=6c4e793316be7f98f5400e24f498336db0d07af4;hpb=f0b91eef34357ee6146faa2a2f88d4fac7c0d66c diff --git a/http_functions.c b/http_functions.c index ae27b5e..617d223 100644 --- a/http_functions.c +++ b/http_functions.c @@ -31,9 +31,9 @@ #include "php_http.h" #include "php_http_std_defs.h" #include "php_http_api.h" -#include "php_http_auth_api.h" #include "php_http_request_api.h" #include "php_http_cache_api.h" +#include "php_http_request_method_api.h" #include "php_http_request_api.h" #include "php_http_date_api.h" #include "php_http_headers_api.h" @@ -408,7 +408,7 @@ PHP_FUNCTION(ob_etaghandler) } Z_TYPE_P(return_value) = IS_STRING; - http_ob_etaghandler(data, data_len, &Z_STRVAL_P(return_value), &Z_STRLEN_P(return_value), mode); + http_ob_etaghandler(data, data_len, &Z_STRVAL_P(return_value), (uint *) &Z_STRLEN_P(return_value), mode); } /* }}} */ @@ -461,9 +461,7 @@ PHP_FUNCTION(http_redirect) size_t query_len = 0; zend_bool session = 0, permanent = 0, free_params = 0; zval *params = NULL; - char *query = NULL, *url = NULL, *URI, - LOC[HTTP_URI_MAXLEN + sizeof("Location: ")], - RED[HTTP_URI_MAXLEN * 2 + sizeof("Redirecting to %s?%s.\n")]; + char *query = NULL, *url = NULL, *URI, *LOC, *RED = NULL; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|sa!/bb", &url, &url_len, ¶ms, &session, &permanent) != SUCCESS) { RETURN_FALSE; @@ -527,11 +525,15 @@ PHP_FUNCTION(http_redirect) URI = http_absolute_uri(url); if (query_len) { - snprintf(LOC, HTTP_URI_MAXLEN + sizeof("Location: "), "Location: %s?%s", URI, query); - sprintf(RED, "Redirecting to %s?%s.\n", URI, query, URI, query); + spprintf(&LOC, 0, "Location: %s?%s", URI, query); + if (SG(request_info).request_method && strcmp(SG(request_info).request_method, "HEAD")) { + spprintf(&RED, 0, "Redirecting to %s?%s.\n", URI, query, URI, query); + } } else { - snprintf(LOC, HTTP_URI_MAXLEN + sizeof("Location: "), "Location: %s", URI); - sprintf(RED, "Redirecting to %s.\n", URI, URI); + spprintf(&LOC, 0, "Location: %s", URI); + if (SG(request_info).request_method && strcmp(SG(request_info).request_method, "HEAD")) { + spprintf(&RED, 0, "Redirecting to %s.\n", URI, URI); + } } efree(URI); @@ -543,13 +545,7 @@ PHP_FUNCTION(http_redirect) FREE_ZVAL(params); } - if ((SUCCESS == http_send_header_string(LOC)) && (SUCCESS == http_send_status((permanent ? 301 : 302)))) { - if (SG(request_info).request_method && strcmp(SG(request_info).request_method, "HEAD")) { - PHPWRITE(RED, strlen(RED)); - } - RETURN_TRUE; - } - RETURN_FALSE; + RETURN_SUCCESS(http_exit_ex(permanent ? 301 : 302, LOC, RED, 1)); } /* }}} */ @@ -619,104 +615,21 @@ PHP_FUNCTION(http_send_stream) PHP_FUNCTION(http_chunked_decode) { char *encoded = NULL, *decoded = NULL; - int encoded_len = 0, decoded_len = 0; + size_t decoded_len = 0; + int encoded_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &encoded, &encoded_len) != SUCCESS) { RETURN_FALSE; } if (NULL != http_chunked_decode(encoded, encoded_len, &decoded, &decoded_len)) { - RETURN_STRINGL(decoded, decoded_len, 0); + RETURN_STRINGL(decoded, (int) decoded_len, 0); } else { RETURN_FALSE; } } /* }}} */ -/* {{{ proto array http_split_response(string http_response) - * - * This function splits an HTTP response into an array with headers and the - * content body. The returned array may look simliar to the following example: - * - *
- *  array(
- *         'Response Status' => '200 Ok',
- *         'Content-Type' => 'text/plain',
- *         'Content-Language' => 'en-US'
- *     ),
- *     1 => "Hello World!"
- * );
- * ?>
- * 
- */ -PHP_FUNCTION(http_split_response) -{ - char *response, *body; - int response_len; - size_t body_len; - zval *zheaders; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &response, &response_len) != SUCCESS) { - RETURN_FALSE; - } - - MAKE_STD_ZVAL(zheaders); - array_init(zheaders); - - if (SUCCESS != http_split_response(response, response_len, Z_ARRVAL_P(zheaders), &body, &body_len)) { - RETURN_FALSE; - } - - array_init(return_value); - add_index_zval(return_value, 0, zheaders); - add_index_stringl(return_value, 1, body, body_len, 0); -} -/* }}} */ - -static void http_message_toobject_recursive(http_message *msg, zval *obj TSRMLS_DC) -{ - zval *headers; - - add_property_long(obj, "type", msg->type); - switch (msg->type) - { - case HTTP_MSG_RESPONSE: - add_property_double(obj, "httpVersion", msg->info.response.http_version); - add_property_long(obj, "responseCode", msg->info.response.code); - break; - - case HTTP_MSG_REQUEST: - add_property_double(obj, "httpVersion", msg->info.request.http_version); - add_property_string(obj, "requestMethod", msg->info.request.method, 1); - add_property_string(obj, "requestUri", msg->info.request.URI, 1); - break; - } - - MAKE_STD_ZVAL(headers); - array_init(headers); - zend_hash_copy(Z_ARRVAL_P(headers), &msg->hdrs, (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *)); - add_property_zval(obj, "headers", headers); - zval_ptr_dtor(&headers); - - add_property_stringl(obj, "body", PHPSTR_VAL(msg), PHPSTR_LEN(msg), 1); - - if (msg->parent) { - zval *parent; - - MAKE_STD_ZVAL(parent); - object_init(parent); - add_property_zval(obj, "parentMessage", parent); - http_message_toobject_recursive(msg->parent, parent TSRMLS_CC); - zval_ptr_dtor(&parent); - } else { - add_property_null(obj, "parentMessage"); - } - http_message_dtor(msg); - efree(msg); -} - /* {{{ proto object http_parse_message(string message) * * Parses (a) http_message(s) into a simple recursive object structure: @@ -766,7 +679,8 @@ PHP_FUNCTION(http_parse_message) if (msg = http_message_parse(message, message_len)) { object_init(return_value); - http_message_toobject_recursive(msg, return_value TSRMLS_CC); + http_message_tostruct_recursive(msg, return_value); + http_message_free(&msg); } else { RETURN_NULL(); } @@ -908,7 +822,6 @@ PHP_FUNCTION(http_match_request_header) * 'content_type' => 'text/html; charset=iso-8859-1', * 'redirect_time' => 0, * 'redirect_count' => 0, - * 'private' => '', * 'http_connectcode' => 0, * 'httpauth_avail' => 0, * 'proxyauth_avail' => 0, @@ -934,7 +847,7 @@ PHP_FUNCTION(http_get) phpstr_init_ex(&response, HTTP_CURLBUF_SIZE, 0); if (SUCCESS == http_get(URL, options ? Z_ARRVAL_P(options) : NULL, info ? Z_ARRVAL_P(info) : NULL, &response)) { - RETURN_PHPSTR_VAL(response); + RETURN_PHPSTR_VAL(&response); } else { RETURN_FALSE; } @@ -965,14 +878,14 @@ PHP_FUNCTION(http_head) phpstr_init_ex(&response, HTTP_CURLBUF_SIZE, 0); if (SUCCESS == http_head(URL, options ? Z_ARRVAL_P(options) : NULL, info ? Z_ARRVAL_P(info) : NULL, &response)) { - RETURN_PHPSTR_VAL(response); + RETURN_PHPSTR_VAL(&response); } else { RETURN_FALSE; } } /* }}} */ -/* {{{ proto string http_post_data(string url, string data[, array options[, &info]]) +/* {{{ proto string http_post_data(string url, string data[, array options[, array &info]]) * * Performs an HTTP POST request, posting data. * Returns the HTTP response as string. @@ -1001,7 +914,7 @@ PHP_FUNCTION(http_post_data) 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); + RETVAL_PHPSTR_VAL(&response); } else { RETVAL_FALSE; } @@ -1037,7 +950,7 @@ PHP_FUNCTION(http_post_fields) 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); + RETVAL_PHPSTR_VAL(&response); } else { RETVAL_FALSE; } @@ -1084,7 +997,7 @@ PHP_FUNCTION(http_put_file) 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); + RETVAL_PHPSTR_VAL(&response); } else { RETVAL_FALSE; } @@ -1128,7 +1041,7 @@ PHP_FUNCTION(http_put_stream) 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); + RETURN_PHPSTR_VAL(&response); } else { RETURN_NULL(); } @@ -1244,116 +1157,6 @@ PHP_FUNCTION(http_request_method_name) #endif /* }}} HAVE_CURL */ - -/* {{{ proto bool http_auth_basic(string user, string pass[, string realm = "Restricted"]) - * - * Example: - *
- * Authorization failed!');
- * }
- * ?>
- * 
- */ -PHP_FUNCTION(http_auth_basic) -{ - char *realm = NULL, *user, *pass, *suser, *spass; - int r_len, u_len, p_len; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|s", &user, &u_len, &pass, &p_len, &realm, &r_len) != SUCCESS) { - RETURN_FALSE; - } - - if (!realm) { - realm = "Restricted"; - } - - if (SUCCESS != http_auth_basic_credentials(&suser, &spass)) { - http_auth_basic_header(realm); - RETURN_FALSE; - } - - if (strcasecmp(suser, user)) { - http_auth_basic_header(realm); - RETURN_FALSE; - } - - if (strcmp(spass, pass)) { - http_auth_basic_header(realm); - RETURN_FALSE; - } - - RETURN_TRUE; -} -/* }}} */ - -/* {{{ proto bool http_auth_basic_cb(mixed callback[, string realm = "Restricted"]) - * - * Example: - *
- * quoteSmart($user);
- *     if (strlen($realpass = $db->getOne($query)) {
- *         return $pass === $realpass;
- *     }
- *     return false;
- * }
- * if (!http_auth_basic_cb('auth_cb')) {
- *     die('

Authorization failed

'); - * } - * ?> - *
- */ -PHP_FUNCTION(http_auth_basic_cb) -{ - zval *cb; - char *realm = NULL, *user, *pass; - int r_len; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|s", &cb, &realm, &r_len) != SUCCESS) { - RETURN_FALSE; - } - - if (!realm) { - realm = "Restricted"; - } - - if (SUCCESS != http_auth_basic_credentials(&user, &pass)) { - http_auth_basic_header(realm); - RETURN_FALSE; - } - { - zval *zparams[2] = {NULL, NULL}, retval; - int result = 0; - - MAKE_STD_ZVAL(zparams[0]); - MAKE_STD_ZVAL(zparams[1]); - ZVAL_STRING(zparams[0], user, 0); - ZVAL_STRING(zparams[1], pass, 0); - - if (SUCCESS == call_user_function(EG(function_table), NULL, cb, - &retval, 2, zparams TSRMLS_CC)) { - result = Z_LVAL(retval); - } - - efree(user); - efree(pass); - efree(zparams[0]); - efree(zparams[1]); - - if (!result) { - http_auth_basic_header(realm); - } - - RETURN_BOOL(result); - } -} -/* }}}*/ - /* {{{ Sara Golemons http_build_query() */ #ifndef ZEND_ENGINE_2 @@ -1381,12 +1184,12 @@ PHP_FUNCTION(http_build_query) formstr = phpstr_new(); if (SUCCESS != http_urlencode_hash_implementation_ex(HASH_OF(formdata), formstr, arg_sep, prefix, prefix_len, NULL, 0, NULL, 0, (Z_TYPE_P(formdata) == IS_OBJECT ? formdata : NULL))) { - phpstr_free(formstr); + phpstr_free(&formstr); RETURN_FALSE; } if (!formstr->used) { - phpstr_free(formstr); + phpstr_free(&formstr); RETURN_NULL(); }