String StringUtil::HtmlEncode(CStrRef input, QuoteStyle quoteStyle, const char *charset, bool nbsp) { if (input.empty()) return input; assert(charset); bool utf8 = true; if (strcasecmp(charset, "ISO-8859-1") == 0) { utf8 = false; } else if (strcasecmp(charset, "UTF-8")) { throw NotImplementedException(charset); } int len = input.size(); char *ret = string_html_encode(input.data(), len, quoteStyle != QuoteStyle::No, quoteStyle == QuoteStyle::Both, utf8, nbsp); if (!ret) { raise_error("HtmlEncode called on too large input (%d)", len); } return String(ret, len, AttachString); }
String StringUtil::ToUpper(CStrRef input, ToUpperType type /*= ToUpperType::All */) { if (input.empty()) return input; int len = input.size(); char *ret = nullptr; switch (type) { case ToUpperType::All: ret = string_to_upper(input.data(), len); break; case ToUpperType::First: ret = string_to_upper_first(input.data(), len); break; case ToUpperType::Words: ret = string_to_upper_words(input.data(), len); break; default: assert(false); break; } return String(ret, len, AttachString); }
int f_xml_parse_into_struct(CObjRef parser, CStrRef data, Variant values, Variant index /* = null */) { int ret; XmlParser * p = parser.getTyped<XmlParser>(); values = Array::Create(); p->data = ref(values); index = Array::Create(); p->info = ref(index); p->level = 0; p->ltags = (char**)malloc(XML_MAXLEVEL * sizeof(char*)); XML_SetDefaultHandler(p->parser, _xml_defaultHandler); XML_SetElementHandler(p->parser, _xml_startElementHandler, _xml_endElementHandler); XML_SetCharacterDataHandler(p->parser, _xml_characterDataHandler); p->isparsing = 1; ret = XML_Parse(p->parser, (const XML_Char*)data.data(), data.size(), 1); p->isparsing = 0; return ret; }
bool XboxServer::PostMessage(CStrRef message, CStrRef host /* = "localhost" */) { if (isLocalHost(host)) { Lock l(s_dispatchMutex); if (!s_dispatcher) { return false; } XboxTransport *job = new XboxTransport(message); job->incRefCount(); // paired with worker's decRefCount() assert(s_dispatcher); s_dispatcher->enqueue(job); return true; } else { // remote string url = "http://"; url += host.data(); url += "/xbox_post_message"; vector<string> headers; string hostStr(host.data()); LibEventHttpClientPtr http = LibEventHttpClient::Get(hostStr, RuntimeOption::XboxServerPort); if (http->send(url, headers, 0, false, message.data(), message.size())) { int code = http->getCode(); if (code > 0) { int len = 0; char *response = http->recv(len); String sresponse(response, len, AttachString); if (code == 200 && same(unserialize_from_string(sresponse), true)) { return true; } } } } return false; }
virtual File* open(CStrRef filename, CStrRef mode, int options, CVarRef context) { static const char cz[] = "phar://"; if (strncmp(filename.data(), cz, sizeof(cz) - 1)) { return nullptr; } static Func* f = SystemLib::s_PharClass->lookupMethod(s_openPhar.get()); Variant ret; g_vmContext->invokeFunc( ret.asTypedValue(), f, CREATE_VECTOR1(filename), nullptr, SystemLib::s_PharClass ); CStrRef contents = ret.toString(); MemFile* file = NEWOBJ(MemFile)(contents.data(), contents.size()); return file; }
bool PDOSqliteConnection::preparer(CStrRef sql, sp_PDOStatement *stmt, CVarRef options) { if (options.toArray().exists(PDO_ATTR_CURSOR) && options[PDO_ATTR_CURSOR].toInt64() != PDO_CURSOR_FWDONLY) { m_einfo.errcode = SQLITE_ERROR; handleError(__FILE__, __LINE__); return false; } const char *tail; sqlite3_stmt *rawstmt = NULL; if (sqlite3_prepare(m_db, sql.data(), sql.size(), &rawstmt, &tail) == SQLITE_OK) { PDOSqliteStatement *s = new PDOSqliteStatement(m_db, rawstmt); *stmt = s; return true; } handleError(__FILE__, __LINE__); return false; }
static Variant php_hash_do_hash(CStrRef algo, CStrRef data, bool isfilename, bool raw_output) { HashEnginePtr ops = php_hash_fetch_ops(algo); if (!ops) { raise_warning("Unknown hashing algorithm: %s", algo.data()); return false; } Variant f; if (isfilename) { f = f_fopen(data, "rb"); if (same(f, false)) { return false; } } void *context = malloc(ops->context_size); ops->hash_init(context); if (isfilename) { for (Variant chunk = f_fread(f, 1024); !is_empty_string(chunk); chunk = f_fread(f, 1024)) { String schunk = chunk.toString(); ops->hash_update(context, (unsigned char *)schunk.data(), schunk.size()); } } else { ops->hash_update(context, (unsigned char *)data.data(), data.size()); } String raw = String(ops->digest_size, ReserveString); char *digest = raw.mutableSlice().ptr; ops->hash_final((unsigned char *)digest, context); free(context); raw.setSize(ops->digest_size); if (raw_output) { return raw; } return StringUtil::HexEncode(raw); }
String StringUtil::Implode(CArrRef items, CStrRef delim) { int size = items.size(); if (size == 0) return ""; String* sitems = (String*)smart_malloc(size * sizeof(String)); int len = 0; int lenDelim = delim.size(); int i = 0; for (ArrayIter iter(items); iter; ++iter) { new (&sitems[i]) String(iter.second().toString()); len += sitems[i].size() + lenDelim; i++; } len -= lenDelim; // always one delimiter less than count of items assert(i == size); String s = String(len, ReserveString); char *buffer = s.mutableSlice().ptr; const char *sdelim = delim.data(); char *p = buffer; for (int i = 0; i < size; i++) { String &item = sitems[i]; if (i && lenDelim) { memcpy(p, sdelim, lenDelim); p += lenDelim; } int lenItem = item.size(); if (lenItem) { memcpy(p, item.data(), lenItem); p += lenItem; } sitems[i].~String(); } smart_free(sitems); assert(p - buffer == len); return s.setSize(len); }
String StringUtil::Implode(CArrRef items, CStrRef delim) { int size = items.size(); if (size == 0) return ""; vector<String> sitems; sitems.reserve(size); int len = 0; int lenDelim = delim.size(); for (ArrayIter iter(items); iter; ++iter) { String item = iter.second().toString(); sitems.push_back(item); len += lenDelim; len += item.size(); } len -= lenDelim; // always one delimiter less than count of items ASSERT((int)sitems.size() == size); char *buffer = (char *)malloc(len + 1); const char *sdelim = delim.data(); char *p = buffer; for (int i = 0; i < size; i++) { String &item = sitems[i]; if (i && lenDelim) { memcpy(p, sdelim, lenDelim); p += lenDelim; } int lenItem = item.size(); if (lenItem) { memcpy(p, item.data(), lenItem); p += lenItem; } } *p = '\0'; ASSERT(p - buffer == len); return String(buffer, len, AttachString); }
bool DateInterval::setInterval(CStrRef date_interval) { timelib_rel_time *di = NULL; timelib_error_container *errors = NULL; #ifdef TIMELIB_HAVE_INTERVAL timelib_time *start = NULL, *end = NULL; int r = 0; timelib_strtointerval((char*)date_interval.data(), date_interval.size(), &start, &end, &di, &r, &errors); #else throw NotImplementedException("timelib too old"); #endif int error_count = errors->error_count; DateTime::setLastErrors(errors); if (error_count > 0) { timelib_rel_time_dtor(di); return false; } else { m_di = DateIntervalPtr(di, dateinterval_deleter()); return true; } }
/** * Counts the number of words inside a string. If format of 1 is specified, * then the function will return an array containing all the words * found inside the string. If format of 2 is specified, then the function * will return an associated array where the position of the word is the key * and the word itself is the value. * * For the purpose of this function, 'word' is defined as a locale dependent * string containing alphabetic characters, which also may contain, but not * start with "'" and "-" characters. */ Variant f_str_word_count(CStrRef str, int64 format /* = 0 */, CStrRef charlist /* = "" */) { int str_len = str.size(); switch (format) { case 1: case 2: if (!str_len) { return Array::Create(); } break; case 0: if (!str_len) { return 0LL; } break; default: throw_invalid_argument("format: %d", format); return false; } char ch[256]; const char *char_list = charlist; if (*char_list) { string_charmask(charlist, charlist.size(), ch); } else { char_list = NULL; } int word_count = 0; const char *s0 = str; const char *p = s0; const char *e = p + str_len; // first character cannot be ' or -, unless explicitly allowed by the user if ((*p == '\'' && (!char_list || !ch[(int)'\''])) || (*p == '-' && (!char_list || !ch[(int)'-']))) { p++; } // last character cannot be -, unless explicitly allowed by the user if (*(e - 1) == '-' && (!char_list || !ch[(int)'-'])) { e--; } Array ret; while (p < e) { const char *s = p; while (p < e && (isalpha(*p) || (char_list && ch[(unsigned char)*p]) || *p == '\'' || *p == '-')) { p++; } if (p > s) { switch (format) { case 1: ret.append(String(s, p - s, CopyString)); break; case 2: ret.set((int)(s - s0), String(s, p - s, CopyString)); break; default: word_count++; break; } } p++; } if (!format) { return word_count; } return ret; }
void StringBuffer::append(CStrRef s) { append(s.data(), s.size()); #ifdef TAINTED propagate_tainting2_buf(s, *this, *this); #endif }
bool ConcurrentTableSharedStore::store(CStrRef key, CVarRef val, int64 ttl, bool overwrite /* = true */) { bool stats = RuntimeOption::EnableStats && RuntimeOption::EnableAPCStats; bool statsDetail = RuntimeOption::EnableAPCSizeStats && RuntimeOption::EnableAPCSizeGroup; StoreValue *sval; SharedVariant* var = construct(key, val); ReadLock l(m_lock); const char *kcp = strdup(key.data()); bool present; time_t expiry; { Map::accessor acc; present = !m_vars.insert(acc, kcp); sval = &acc->second; if (present) { free((void *)kcp); if (overwrite || sval->expired()) { if (statsDetail) { SharedStoreStats::onDelete(key.get(), sval->var, true); } sval->var->decRef(); if (RuntimeOption::EnableAPCSizeStats && !check_skip(key.data())) { int32 size = var->getSpaceUsage(); SharedStoreStats::updateDirect(sval->size, size); sval->size = size; } } else { var->decRef(); return false; } } else { if (RuntimeOption::EnableAPCSizeStats) { int32 size = var->getSpaceUsage(); SharedStoreStats::addDirect(key.size(), size); sval->size = size; } } sval->set(var, ttl); expiry = sval->expiry; if (statsDetail) { SharedStoreStats::onStore(key.get(), var, ttl, false); } } if (RuntimeOption::ApcExpireOnSets) { if (ttl) { addToExpirationQueue(key.data(), expiry); } purgeExpired(); } if (stats) { if (present) { ServerStats::Log("apc.update", 1); } else { ServerStats::Log("apc.new", 1); if (RuntimeOption::EnableStats && RuntimeOption::EnableAPCKeyStats) { string prefix = "apc.new."; prefix += GetSkeleton(key); ServerStats::Log(prefix, 1); } } } return true; }
Variant f_strcspn(CStrRef str1, CStrRef str2, int start /* = 0 */, int length /* = 0x7FFFFFFF */) { String s = str1.substr(start, length); if (s.isNull()) return false; return string_cspan(s, s.size(), str2, str2.size()); }
Variant f_gzinflate(CStrRef data, int limit /* = 0 */) { return gzinflate(data.data(), data.size(), limit); }
static Variant php_mcrypt_do_crypt(CStrRef cipher, CStrRef key, CStrRef data, CStrRef mode, CStrRef iv, bool dencrypt) { MCRYPT td = mcrypt_module_open((char*)cipher.data(), (char*)MCG(algorithms_dir).data(), (char*)mode.data(), (char*)MCG(modes_dir).data()); if (td == MCRYPT_FAILED) { raise_warning(MCRYPT_OPEN_MODULE_FAILED); return false; } /* Checking for key-length */ int max_key_length = mcrypt_enc_get_key_size(td); if (key.size() > max_key_length) { raise_warning("Size of key is too large for this algorithm"); } int count; int *key_length_sizes = mcrypt_enc_get_supported_key_sizes(td, &count); int use_key_length; char *key_s = NULL; if (count == 0 && key_length_sizes == NULL) { // all lengths 1 - k_l_s = OK use_key_length = key.size(); key_s = (char*)malloc(use_key_length); memcpy(key_s, key.data(), use_key_length); } else if (count == 1) { /* only m_k_l = OK */ key_s = (char*)malloc(key_length_sizes[0]); memset(key_s, 0, key_length_sizes[0]); memcpy(key_s, key.data(), MIN(key.size(), key_length_sizes[0])); use_key_length = key_length_sizes[0]; } else { /* dertermine smallest supported key > length of requested key */ use_key_length = max_key_length; /* start with max key length */ for (int i = 0; i < count; i++) { if (key_length_sizes[i] >= key.size() && key_length_sizes[i] < use_key_length) { use_key_length = key_length_sizes[i]; } } key_s = (char*)malloc(use_key_length); memset(key_s, 0, use_key_length); memcpy(key_s, key.data(), MIN(key.size(), use_key_length)); } mcrypt_free(key_length_sizes); /* Check IV */ char *iv_s = NULL; int iv_size = mcrypt_enc_get_iv_size(td); /* IV is required */ if (mcrypt_enc_mode_has_iv(td) == 1) { if (!iv.empty()) { if (iv_size != iv.size()) { raise_warning("The IV parameter must be as long as the blocksize"); } else { iv_s = (char*)malloc(iv_size + 1); memcpy(iv_s, iv.data(), iv_size); } } else { raise_warning("Attempt to use an empty IV, which is NOT recommended"); iv_s = (char*)malloc(iv_size + 1); memset(iv_s, 0, iv_size + 1); } } int block_size; unsigned long int data_size; String s; char *data_s; /* Check blocksize */ if (mcrypt_enc_is_block_mode(td) == 1) { /* It's a block algorithm */ block_size = mcrypt_enc_get_block_size(td); data_size = (((data.size() - 1) / block_size) + 1) * block_size; s = String(data_size, ReserveString); data_s = (char*)s.mutableSlice().ptr; memset(data_s, 0, data_size); memcpy(data_s, data.data(), data.size()); } else { /* It's not a block algorithm */ data_size = data.size(); s = String(data_size, ReserveString); data_s = (char*)s.mutableSlice().ptr; memcpy(data_s, data.data(), data.size()); } if (mcrypt_generic_init(td, key_s, use_key_length, iv_s) < 0) { raise_warning("Mcrypt initialisation failed"); return false; } if (dencrypt) { mdecrypt_generic(td, data_s, data_size); } else { mcrypt_generic(td, data_s, data_size); } /* freeing vars */ mcrypt_generic_end(td); if (key_s != NULL) { free(key_s); } if (iv_s != NULL) { free(iv_s); } return s.setSize(data_size); }
int64_t f_hphp_murmurhash(CStrRef key, int len, int seed) { len = std::max(std::min(len, key.size()), 0); return murmur_hash_64A(key, len, seed); }
bool f_hash_update(CObjRef context, CStrRef data) { HashContext *hash = context.getTyped<HashContext>(); hash->ops->hash_update(hash->context, (unsigned char *)data.data(), data.size()); return true; }
static Variant php_intl_idn_to(CStrRef domain, VRefParam errorcode, int mode) { long option = 0; UChar* ustring = NULL; int ustring_len = 0; UErrorCode status; char *converted_utf8 = NULL; int32_t converted_utf8_len; UChar* converted = NULL; int32_t converted_ret_len; // Convert the string to UTF-16 status = U_ZERO_ERROR; intl_convert_utf8_to_utf16(&ustring, &ustring_len, (char*)domain.data(), domain.size(), &status); if (U_FAILURE(status)) { free(ustring); errorcode = status; return false; } // Call the appropriate IDN function int converted_len = (ustring_len > 1) ? ustring_len : 1; for (;;) { UParseError parse_error; status = U_ZERO_ERROR; converted = (UChar*)malloc(sizeof(UChar)*converted_len); // If the malloc failed, bail out if (!converted) { free(ustring); errorcode = U_MEMORY_ALLOCATION_ERROR; return false; } if (mode == INTL_IDN_TO_ASCII) { converted_ret_len = uidna_IDNToASCII(ustring, ustring_len, converted, converted_len, (int32_t)option, &parse_error, &status); } else { converted_ret_len = uidna_IDNToUnicode(ustring, ustring_len, converted, converted_len, (int32_t)option, &parse_error, &status); } if (status != U_BUFFER_OVERFLOW_ERROR) break; // If we have a buffer overflow error, try again with a larger buffer free(converted); converted = NULL; converted_len = converted_len * 2; } free(ustring); if (U_FAILURE(status)) { free(converted); errorcode = status; return false; } // Convert the string back to UTF-8 status = U_ZERO_ERROR; intl_convert_utf16_to_utf8(&converted_utf8, &converted_utf8_len, converted, converted_ret_len, &status); free(converted); if (U_FAILURE(status)) { free(converted_utf8); errorcode = status; return false; } // Return the string return String(converted_utf8, converted_utf8_len, AttachString); }
Array f_getopt(CStrRef options, CVarRef longopts /* = null_variant */) { opt_struct *opts, *orig_opts; int len = parse_opts(options.data(), options.size(), &opts); if (!longopts.isNull()) { Array arropts = longopts.toArray(); int count = arropts.size(); /* the first <len> slots are filled by the one short ops * we now extend our array and jump to the new added structs */ opts = (opt_struct *)realloc(opts, sizeof(opt_struct) * (len + count + 1)); orig_opts = opts; opts += len; memset(opts, 0, count * sizeof(opt_struct)); for (ArrayIter iter(arropts); iter; ++iter) { String entry = iter.second().toString(); opts->need_param = 0; opts->opt_name = strdup(entry.data()); len = strlen(opts->opt_name); if ((len > 0) && (opts->opt_name[len - 1] == ':')) { opts->need_param++; opts->opt_name[len - 1] = '\0'; if ((len > 1) && (opts->opt_name[len - 2] == ':')) { opts->need_param++; opts->opt_name[len - 2] = '\0'; } } opts->opt_char = 0; opts++; } } else { opts = (opt_struct*) realloc(opts, sizeof(opt_struct) * (len + 1)); orig_opts = opts; opts += len; } /* php_getopt want to identify the last param */ opts->opt_char = '-'; opts->need_param = 0; opts->opt_name = NULL; static const StaticString s_argv("argv"); GlobalVariables *g = get_global_variables(); Array vargv = g->get(s_argv).toArray(); int argc = vargv.size(); char **argv = (char **)malloc((argc+1) * sizeof(char*)); vector<String> holders; int index = 0; for (ArrayIter iter(vargv); iter; ++iter) { String arg = iter.second().toString(); holders.push_back(arg); argv[index++] = (char*)arg.data(); } argv[index] = NULL; Array ret = Array::Create(); /* after our pointer arithmetic jump back to the first element */ opts = orig_opts; int o; char *php_optarg = NULL; int php_optind = 1; Variant val; int optchr = 0; int dash = 0; /* have already seen the - */ char opt[2] = { '\0' }; char *optname; int optname_len = 0; int php_optidx; while ((o = php_getopt(argc, argv, opts, &php_optarg, &php_optind, 0, 1, optchr, dash, php_optidx)) != -1) { /* Skip unknown arguments. */ if (o == '?') { continue; } /* Prepare the option character and the argument string. */ if (o == 0) { optname = opts[php_optidx].opt_name; } else { if (o == 1) { o = '-'; } opt[0] = o; optname = opt; } if (php_optarg != NULL) { /* keep the arg as binary, since the encoding is not known */ val = String(php_optarg, CopyString); } else { val = false; } /* Add this option / argument pair to the result hash. */ optname_len = strlen(optname); if (!(optname_len > 1 && optname[0] == '0') && is_numeric_string(optname, optname_len, NULL, NULL, 0) == KindOfInt64) { /* numeric string */ int optname_int = atoi(optname); if (ret.exists(optname_int)) { Variant &e = ret.lvalAt(optname_int); if (!e.isArray()) { ret.set(optname_int, CREATE_VECTOR2(e, val)); } else { e.append(val); } } else { ret.set(optname_int, val); } } else { /* other strings */ String key(optname, strlen(optname), CopyString); if (ret.exists(key)) { Variant &e = ret.lvalAt(key); if (!e.isArray()) { ret.set(key, CREATE_VECTOR2(e, val)); } else { e.append(val); } } else { ret.set(key, val); } } php_optarg = NULL; } free_longopts(orig_opts); free(orig_opts); free(argv); return ret; }
Variant c_Normalizer::ti_normalize(const char* cls , CStrRef input, int64 form /* = q_Normalizer___FORM_C */) { STATIC_METHOD_INJECTION_BUILTIN(Normalizer, Normalizer::normalize); s_intl_error->m_error.clear(); int expansion_factor = 1; switch(form) { case UNORM_NONE: case UNORM_NFC: case UNORM_NFKC: break; case UNORM_NFD: case UNORM_NFKD: expansion_factor = 3; break; default: s_intl_error->m_error.code = U_ILLEGAL_ARGUMENT_ERROR; s_intl_error->m_error.custom_error_message = "normalizer_normalize: illegal normalization form"; return null; } /* First convert the string to UTF-16. */ UChar* uinput = NULL; int uinput_len = 0; UErrorCode status = U_ZERO_ERROR; intl_convert_utf8_to_utf16(&uinput, &uinput_len, input.data(), input.size(), &status); if (U_FAILURE(status)) { s_intl_error->m_error.code = status; s_intl_error->m_error.custom_error_message = "Error converting string to UTF-16."; free(uinput); return null; } /* Allocate memory for the destination buffer for normalization */ int uret_len = uinput_len * expansion_factor; UChar *uret_buf = (UChar*)malloc((uret_len + 1) * sizeof(UChar)); /* normalize */ int size_needed = unorm_normalize(uinput, uinput_len, (UNormalizationMode)form, (int32_t) 0, uret_buf, uret_len, &status); /* Bail out if an unexpected error occured. * (U_BUFFER_OVERFLOW_ERROR means that *target buffer is not large enough). * (U_STRING_NOT_TERMINATED_WARNING usually means that the input string * is empty). */ if (U_FAILURE(status) && status != U_BUFFER_OVERFLOW_ERROR && status != U_STRING_NOT_TERMINATED_WARNING) { free(uret_buf); free(uinput); return null; } if (size_needed > uret_len) { /* realloc does not seem to work properly - memory is corrupted * uret_buf = eurealloc(uret_buf, size_needed + 1); */ free(uret_buf); uret_buf = (UChar*)malloc((size_needed + 1) * sizeof(UChar)); uret_len = size_needed; status = U_ZERO_ERROR; /* try normalize again */ size_needed = unorm_normalize( uinput, uinput_len, (UNormalizationMode)form, (int32_t) 0, uret_buf, uret_len, &status); /* Bail out if an unexpected error occured. */ if (U_FAILURE(status)) { /* Set error messages. */ s_intl_error->m_error.code = status; s_intl_error->m_error.custom_error_message = "Error normalizing string"; free(uret_buf); free(uinput); return null; } } free(uinput); /* the buffer we actually used */ uret_len = size_needed; /* Convert normalized string from UTF-16 to UTF-8. */ char* ret_buf = NULL; int ret_len = 0; intl_convert_utf16_to_utf8(&ret_buf, &ret_len, uret_buf, uret_len, &status); free(uret_buf); if (U_FAILURE(status)) { s_intl_error->m_error.code = status; s_intl_error->m_error.custom_error_message = "normalizer_normalize: error converting normalized text UTF-8"; return null; } return String(ret_buf, ret_len, AttachString); }
void f_parse_str(CStrRef str, Variant arr /* = null */) { HttpProtocol::DecodeParameters(arr, str.data(), str.size()); }
bool Transport::setCookie(CStrRef name, CStrRef value, int64_t expire /* = 0 */, CStrRef path /* = "" */, CStrRef domain /* = "" */, bool secure /* = false */, bool httponly /* = false */, bool encode_url /* = true */) { if (!name.empty() && strpbrk(name.data(), "=,; \t\r\n\013\014")) { Logger::Warning("Cookie names can not contain any of the following " "'=,; \\t\\r\\n\\013\\014'"); return false; } if (!encode_url && !value.empty() && strpbrk(value.data(), ",; \t\r\n\013\014")) { Logger::Warning("Cookie values can not contain any of the following " "',; \\t\\r\\n\\013\\014'"); return false; } char *encoded_value = nullptr; int len = 0; if (!value.empty() && encode_url) { int encoded_value_len = value.size(); encoded_value = url_encode(value.data(), encoded_value_len); len += encoded_value_len; } else if (!value.empty()) { encoded_value = strdup(value.data()); len += value.size(); } len += path.size(); len += domain.size(); std::string cookie; cookie.reserve(len + 100); if (value.empty()) { /* * MSIE doesn't delete a cookie when you set it to a null value * so in order to force cookies to be deleted, even on MSIE, we * pick an expiry date in the past */ String sdt = DateTime(1, true).toString(DateTime::DateFormat::Cookie); cookie += name.data(); cookie += "=deleted; expires="; cookie += sdt.data(); } else { cookie += name.data(); cookie += "="; cookie += encoded_value ? encoded_value : ""; if (expire > 0) { if (expire > 253402300799LL) { raise_warning("Expiry date cannot have a year greater then 9999"); return false; } cookie += "; expires="; String sdt = DateTime(expire, true).toString(DateTime::DateFormat::Cookie); cookie += sdt.data(); } } if (encoded_value) { free(encoded_value); } if (!path.empty()) { cookie += "; path="; cookie += path.data(); } if (!domain.empty()) { cookie += "; domain="; cookie += domain.data(); } if (secure) { cookie += "; secure"; } if (httponly) { cookie += "; httponly"; } m_responseCookies[name.data()] = cookie; return true; }
static Variant php_intl_idn_to(CStrRef domain, int64_t options, IdnVariant idn_variant, VRefParam idna_info, int mode) { UChar* ustring = NULL; int ustring_len = 0; UErrorCode status; char *converted_utf8 = NULL; int32_t converted_utf8_len; UChar* converted = NULL; int32_t converted_ret_len; if (idn_variant != INTL_IDN_VARIANT_2003) { #ifdef HAVE_46_API if (idn_variant == INTL_IDN_VARIANT_UTS46) { return php_intl_idn_to_46(domain, options, idn_variant, ref(idna_info), mode); } #endif return false; } // Convert the string to UTF-16 status = U_ZERO_ERROR; intl_convert_utf8_to_utf16(&ustring, &ustring_len, (char*)domain.data(), domain.size(), &status); if (U_FAILURE(status)) { free(ustring); return false; } // Call the appropriate IDN function int converted_len = (ustring_len > 1) ? ustring_len : 1; for (;;) { UParseError parse_error; status = U_ZERO_ERROR; converted = (UChar*)malloc(sizeof(UChar)*converted_len); // If the malloc failed, bail out if (!converted) { free(ustring); return false; } if (mode == INTL_IDN_TO_ASCII) { converted_ret_len = uidna_IDNToASCII(ustring, ustring_len, converted, converted_len, (int32_t)options, &parse_error, &status); } else { converted_ret_len = uidna_IDNToUnicode(ustring, ustring_len, converted, converted_len, (int32_t)options, &parse_error, &status); } if (status != U_BUFFER_OVERFLOW_ERROR) break; // If we have a buffer overflow error, try again with a larger buffer free(converted); converted = NULL; converted_len = converted_len * 2; } free(ustring); if (U_FAILURE(status)) { free(converted); return false; } // Convert the string back to UTF-8 status = U_ZERO_ERROR; intl_convert_utf16_to_utf8(&converted_utf8, &converted_utf8_len, converted, converted_ret_len, &status); free(converted); if (U_FAILURE(status)) { free(converted_utf8); return false; } // Return the string return String(converted_utf8, converted_utf8_len, AttachString); }
int64_t f_furchash_hphp_ext(CStrRef key, int len, int nPart) { len = std::max(std::min(len, key.size()), 0); return furc_hash(key, len, nPart); }
Variant f_gzcompress(CStrRef data, int level /* = -1 */) { return gzcompress(data.data(), data.size(), level); }
String String::replace(int start, int length, CStrRef replacement) const { int len = size(); char *ret = string_replace(data(), len, start, length, replacement.data(), replacement.size()); return String(ret, len, AttachString); }
Variant f_gzuncompress(CStrRef data, int limit /* = 0 */) { return gzuncompress(data.data(), data.size(), limit); }
bool ZendArray::exists(CStrRef k) const { return find(k.data(), k.size(), k->hash()); }
Variant f_gzdeflate(CStrRef data, int level /* = -1 */) { return gzdeflate(data.data(), data.size(), level); }