/** * Returns the content of the resource as an string * Optionally a base path where the resource is located can be set * * @param string $basePath * @return string */ PHP_METHOD(Phalcon_Assets_Resource, getContent){ zval *base_path = NULL, *source_path = NULL, *complete_path; zval *local, *exception_message = NULL, *content; PHALCON_MM_GROW(); phalcon_fetch_params(1, 0, 1, &base_path); if (!base_path) { PHALCON_INIT_VAR(base_path); } PHALCON_OBS_VAR(source_path); phalcon_read_property_this(&source_path, this_ptr, SL("_sourcePath"), PH_NOISY_CC); if (PHALCON_IS_EMPTY(source_path)) { PHALCON_OBS_NVAR(source_path); phalcon_read_property_this(&source_path, this_ptr, SL("_path"), PH_NOISY_CC); } /** * A base path for resources can be set in the assets manager */ PHALCON_INIT_VAR(complete_path); PHALCON_CONCAT_VV(complete_path, base_path, source_path); PHALCON_OBS_VAR(local); phalcon_read_property_this(&local, this_ptr, SL("_local"), PH_NOISY_CC); /** * Local resources are loaded from the local disk */ if (zend_is_true(local)) { /** * Check first if the file is readable */ if (phalcon_file_exists(complete_path TSRMLS_CC) == FAILURE) { PHALCON_INIT_VAR(exception_message); PHALCON_CONCAT_SVS(exception_message, "Resource's content for \"", complete_path, "\" cannot be loaded"); PHALCON_THROW_EXCEPTION_ZVAL(phalcon_assets_exception_ce, exception_message); return; } } /** * Use file_get_contents to respect the openbase_dir. Access urls must be enabled */ PHALCON_INIT_VAR(content); phalcon_file_get_contents(content, complete_path TSRMLS_CC); if (PHALCON_IS_FALSE(content)) { PHALCON_INIT_NVAR(exception_message); PHALCON_CONCAT_SVS(exception_message, "Resource's content for \"", complete_path, "\" cannot be read"); PHALCON_THROW_EXCEPTION_ZVAL(phalcon_assets_exception_ce, exception_message); return; } RETURN_CCTOR(content); }
/** * Gets HTTP raw request body * * @return string */ PHP_METHOD(Phalcon_Http_Request, getRawBody){ zval *raw_body, *input, *contents; PHALCON_MM_GROW(); PHALCON_OBS_VAR(raw_body); phalcon_read_property_this(&raw_body, this_ptr, SL("_rawBody"), PH_NOISY_CC); if (PHALCON_IS_EMPTY(raw_body)) { PHALCON_INIT_VAR(input); ZVAL_STRING(input, "php://input", 1); PHALCON_INIT_VAR(contents); phalcon_file_get_contents(contents, input TSRMLS_CC); /** * We need store the read raw body because it can't be read again */ phalcon_update_property_this(this_ptr, SL("_rawBody"), contents TSRMLS_CC); RETURN_CCTOR(contents); } RETURN_CCTOR(raw_body); }
/** * Returns a cached content * * @param int|string $keyName * @param long $lifetime * @return mixed */ PHP_METHOD(Phalcon_Cache_Backend_File, get){ zval *key_name, *lifetime = NULL; zval *options, *prefix, *prefixed_key, *cache_dir; zval *cache_file, *tmp = NULL; zval *modified_time; zval *cached_content, *exception_message; long int now, ttl, mtime, diff; int expired; PHALCON_MM_GROW(); phalcon_fetch_params(1, 1, 1, &key_name, &lifetime); options = phalcon_fetch_nproperty_this(this_ptr, SL("_options"), PH_NOISY TSRMLS_CC); prefix = phalcon_fetch_nproperty_this(this_ptr, SL("_prefix"), PH_NOISY TSRMLS_CC); PHALCON_INIT_VAR(prefixed_key); PHALCON_CONCAT_VV(prefixed_key, prefix, key_name); phalcon_update_property_this(this_ptr, SL("_lastKey"), prefixed_key TSRMLS_CC); if (unlikely(!phalcon_array_isset_string_fetch(&cache_dir, options, SS("cacheDir")))) { PHALCON_THROW_EXCEPTION_STR(phalcon_cache_exception_ce, "Unexpected inconsistency in options"); return; } PHALCON_INIT_VAR(cache_file); PHALCON_CONCAT_VV(cache_file, cache_dir, prefixed_key); if (phalcon_file_exists(cache_file TSRMLS_CC) == SUCCESS) { zval *frontend = phalcon_fetch_nproperty_this(this_ptr, SL("_frontend"), PH_NOISY TSRMLS_CC); /** * Check if the file has expired */ now = (long int)time(NULL); /** * Take the lifetime from the frontend or read it from the set in start() */ if (!lifetime || Z_TYPE_P(lifetime) == IS_NULL) { zval *last_lifetime = phalcon_fetch_nproperty_this(this_ptr, SL("_lastLifetime"), PH_NOISY TSRMLS_CC); if (Z_TYPE_P(last_lifetime) == IS_NULL) { PHALCON_CALL_METHOD(&tmp, frontend, "getlifetime"); ttl = phalcon_get_intval(tmp); } else { ttl = phalcon_get_intval(last_lifetime); } } else { ttl = phalcon_get_intval(lifetime); } PHALCON_INIT_VAR(modified_time); phalcon_filemtime(modified_time, cache_file TSRMLS_CC); if (unlikely(Z_TYPE_P(modified_time) != IS_LONG)) { convert_to_long(modified_time); } mtime = Z_LVAL_P(modified_time); diff = now - ttl; expired = diff > mtime; /** * The content is only retrieved if the content has not expired */ if (!expired) { /** * Use file-get-contents to control that the openbase_dir can't be skipped */ PHALCON_INIT_VAR(cached_content); phalcon_file_get_contents(cached_content, cache_file TSRMLS_CC); if (PHALCON_IS_FALSE(cached_content)) { PHALCON_INIT_VAR(exception_message); PHALCON_CONCAT_SVS(exception_message, "Cache file ", cache_file, " could not be opened"); PHALCON_THROW_EXCEPTION_ZVAL(phalcon_cache_exception_ce, exception_message); return; } if (phalcon_is_numeric(cached_content)) { RETURN_CCTOR(cached_content); } else { /** * Use the frontend to process the content of the cache */ PHALCON_RETURN_CALL_METHOD(frontend, "afterretrieve", cached_content); } RETURN_MM(); } } RETURN_MM_NULL(); }
/** * Returns a cached content * * @param int|string $keyName * @param long $lifetime * @return mixed */ PHP_METHOD(Phalcon_Cache_Backend_File, get){ zval *key_name, *lifetime = NULL, *options, *prefix, *prefixed_key; zval *cache_dir, *cache_file, *frontend, *timestamp; zval *ttl = NULL, *modified_time, *difference, *not_expired; zval *cached_content, *exception_message; PHALCON_MM_GROW(); phalcon_fetch_params(1, 1, 1, &key_name, &lifetime); if (!lifetime) { PHALCON_INIT_VAR(lifetime); } else { PHALCON_SEPARATE_PARAM(lifetime); } PHALCON_OBS_VAR(options); phalcon_read_property_this(&options, this_ptr, SL("_options"), PH_NOISY_CC); PHALCON_OBS_VAR(prefix); phalcon_read_property_this(&prefix, this_ptr, SL("_prefix"), PH_NOISY_CC); PHALCON_INIT_VAR(prefixed_key); PHALCON_CONCAT_VV(prefixed_key, prefix, key_name); phalcon_update_property_this(this_ptr, SL("_lastKey"), prefixed_key TSRMLS_CC); PHALCON_OBS_VAR(cache_dir); phalcon_array_fetch_string(&cache_dir, options, SL("cacheDir"), PH_NOISY); PHALCON_INIT_VAR(cache_file); PHALCON_CONCAT_VV(cache_file, cache_dir, prefixed_key); if (phalcon_file_exists(cache_file TSRMLS_CC) == SUCCESS) { PHALCON_OBS_VAR(frontend); phalcon_read_property_this(&frontend, this_ptr, SL("_frontend"), PH_NOISY_CC); /** * Check if the file has expired */ PHALCON_INIT_VAR(timestamp); ZVAL_LONG(timestamp, (long) time(NULL)); /** * Take the lifetime from the frontend or read it from the set in start() */ if (Z_TYPE_P(lifetime) == IS_NULL) { PHALCON_OBS_NVAR(lifetime); phalcon_read_property_this(&lifetime, this_ptr, SL("_lastLifetime"), PH_NOISY_CC); if (Z_TYPE_P(lifetime) == IS_NULL) { PHALCON_INIT_VAR(ttl); phalcon_call_method(ttl, frontend, "getlifetime"); } else { PHALCON_CPY_WRT(ttl, lifetime); } } else { PHALCON_CPY_WRT(ttl, lifetime); } PHALCON_INIT_VAR(modified_time); phalcon_call_func_p1(modified_time, "filemtime", cache_file); PHALCON_INIT_VAR(difference); sub_function(difference, timestamp, ttl TSRMLS_CC); PHALCON_INIT_VAR(not_expired); is_smaller_function(not_expired, difference, modified_time TSRMLS_CC); /** * The content is only retrieved if the content has not expired */ if (PHALCON_IS_TRUE(not_expired)) { /** * Use file-get-contents to control that the openbase_dir can't be skipped */ PHALCON_INIT_VAR(cached_content); phalcon_file_get_contents(cached_content, cache_file TSRMLS_CC); if (PHALCON_IS_FALSE(cached_content)) { PHALCON_INIT_VAR(exception_message); PHALCON_CONCAT_SVS(exception_message, "Cache file ", cache_file, " could not be opened"); PHALCON_THROW_EXCEPTION_ZVAL(phalcon_cache_exception_ce, exception_message); return; } /** * Use the frontend to process the content of the cache */ phalcon_call_method_p1(return_value, frontend, "afterretrieve", cached_content); RETURN_MM(); } } RETURN_MM_NULL(); }