X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_api.c;h=b77dd19b182c7fe02f1433fdeabd5a1d89c98066;hp=a2a7f6ce71cfb0601392e46574e85dfdb74cc334;hb=0e0def98a4ea4463bf8c21c6f161b2b37aa8c49d;hpb=6aca56d611a22eb559098f3c02c31634a6f9ff9f diff --git a/http_api.c b/http_api.c index a2a7f6c..b77dd19 100644 --- a/http_api.c +++ b/http_api.c @@ -67,15 +67,16 @@ PHP_HTTP_API long _http_support(long feature) /* char *pretty_key(char *, size_t, zend_bool, zend_bool) */ char *_http_pretty_key(char *key, size_t key_len, zend_bool uctitle, zend_bool xhyphen) { + size_t i; + int wasalpha; + if (key && key_len) { - size_t i; - int wasalpha; - if ((wasalpha = isalpha((int) key[0]))) { - key[0] = (char) (uctitle ? toupper((int) key[0]) : tolower((int) key[0])); + if ((wasalpha = HTTP_IS_CTYPE(alpha, key[0]))) { + key[0] = (char) (uctitle ? HTTP_TO_CTYPE(upper, key[0]) : HTTP_TO_CTYPE(lower, key[0])); } for (i = 1; i < key_len; i++) { - if (isalpha((int) key[i])) { - key[i] = (char) (((!wasalpha) && uctitle) ? toupper((int) key[i]) : tolower((int) key[i])); + if (HTTP_IS_CTYPE(alpha, key[i])) { + key[i] = (char) (((!wasalpha) && uctitle) ? HTTP_TO_CTYPE(upper, key[i]) : HTTP_TO_CTYPE(lower, key[i])); wasalpha = 1; } else { if (xhyphen && (key[i] == '_')) { @@ -211,7 +212,7 @@ STATUS _http_exit_ex(int status, char *header, char *body, zend_bool send_header { if ( (send_header && (SUCCESS != http_send_status_header(status, header))) || (status && (SUCCESS != http_send_status(status)))) { - http_error_ex(HE_WARNING, HTTP_E_HEADER, "Failed to exit with status/header: %d - %s", status, header ? header : ""); + http_error_ex(HE_WARNING, HTTP_E_HEADER, "Failed to exit with status/header: %d - %s", status, STR_PTR(header)); STR_FREE(header); STR_FREE(body); return FAILURE; @@ -255,8 +256,8 @@ STATUS _http_check_method_ex(const char *method, const char *methods) const char *found; if ( (found = strstr(methods, method)) && - (found == method || !isalpha(found[-1])) && - (strlen(found) >= strlen(method) && !isalpha(found[strlen(method)]))) { + (found == method || !HTTP_IS_CTYPE(alpha, found[-1])) && + (strlen(found) >= strlen(method) && !HTTP_IS_CTYPE(alpha, found[strlen(method)]))) { return SUCCESS; } return FAILURE; @@ -583,6 +584,70 @@ failure: } /* }}} */ +/* {{{ array_join */ +int apply_array_append_func(void *pDest, int num_args, va_list args, zend_hash_key *hash_key) +{ + int flags; + char *key = NULL; + HashTable *dst; + zval **data = NULL, **value = (zval **) pDest; + + dst = va_arg(args, HashTable *); + flags = va_arg(args, int); + + if ((!(flags & ARRAY_JOIN_STRONLY)) || hash_key->nKeyLength) { + if ((flags & ARRAY_JOIN_PRETTIFY) && hash_key->nKeyLength) { + key = pretty_key(estrndup(hash_key->arKey, hash_key->nKeyLength - 1), hash_key->nKeyLength - 1, 1, 1); + zend_hash_find(dst, key, hash_key->nKeyLength, (void *) &data); + } else { + zend_hash_quick_find(dst, hash_key->arKey, hash_key->nKeyLength, hash_key->h, (void *) &data); + } + + ZVAL_ADDREF(*value); + if (data) { + if (Z_TYPE_PP(data) != IS_ARRAY) { + convert_to_array(*data); + } + add_next_index_zval(*data, *value); + } else if (key) { + zend_hash_add(dst, key, hash_key->nKeyLength, value, sizeof(zval *), NULL); + } else { + zend_hash_quick_add(dst, hash_key->arKey, hash_key->nKeyLength, hash_key->h, value, sizeof(zval *), NULL); + } + + if (key) { + efree(key); + } + } + + return ZEND_HASH_APPLY_KEEP; +} + +int apply_array_merge_func(void *pDest, int num_args, va_list args, zend_hash_key *hash_key) +{ + int flags; + char *key = NULL; + HashTable *dst; + zval **value = (zval **) pDest; + + dst = va_arg(args, HashTable *); + flags = va_arg(args, int); + + if ((!(flags & ARRAY_JOIN_STRONLY)) || hash_key->nKeyLength) { + ZVAL_ADDREF(*value); + if ((flags & ARRAY_JOIN_PRETTIFY) && hash_key->nKeyLength) { + key = pretty_key(estrndup(hash_key->arKey, hash_key->nKeyLength - 1), hash_key->nKeyLength - 1, 1, 1); + zend_hash_update(dst, key, hash_key->nKeyLength, (void *) value, sizeof(zval *), NULL); + efree(key); + } else { + zend_hash_quick_update(dst, hash_key->arKey, hash_key->nKeyLength, hash_key->h, (void *) value, sizeof(zval *), NULL); + } + } + + return ZEND_HASH_APPLY_KEEP; +} +/* }}} */ + /* * Local variables: * tab-width: 4