X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=src%2Fphp_http_etag.c;h=7e309f22636bdd4db813919da9bd669dc0e218e5;hp=8c6a5485f0bd2a8247d0b0f7c220aba23d803656;hb=c13070d6868ec03633930c0744c319306790ca7d;hpb=faf7a7899fa8ffb24f8105a921f359d6b97ec34e diff --git a/src/php_http_etag.c b/src/php_http_etag.c index 8c6a548..7e309f2 100644 --- a/src/php_http_etag.c +++ b/src/php_http_etag.c @@ -12,41 +12,32 @@ #include "php_http_api.h" -#ifdef PHP_HTTP_HAVE_HASH -# include "php_hash.h" -#endif - +#include "ext/hash/php_hash.h" #include "ext/standard/crc32.h" #include "ext/standard/sha1.h" #include "ext/standard/md5.h" +#if PHP_VERSION_ID >= 80100 +# define HASH_INIT_ARGS ,NULL +#else +# define HASH_INIT_ARGS +#endif + php_http_etag_t *php_http_etag_init(const char *mode) { - void *ctx; php_http_etag_t *e; + zend_string *mode_str = zend_string_init(mode, strlen(mode), 0); + const php_hash_ops *eho = php_hash_fetch_ops(mode_str); - if (mode && (!strcasecmp(mode, "crc32b"))) { - ctx = emalloc(sizeof(uint)); - *((uint *) ctx) = ~0; - } else if (mode && !strcasecmp(mode, "sha1")) { - PHP_SHA1Init(ctx = emalloc(sizeof(PHP_SHA1_CTX))); - } else if (mode && !strcasecmp(mode, "md5")) { - PHP_MD5Init(ctx = emalloc(sizeof(PHP_MD5_CTX))); - } else { -#ifdef PHP_HTTP_HAVE_HASH - const php_hash_ops *eho = NULL; - - if (mode && (eho = php_hash_fetch_ops(mode, strlen(mode)))) { - ctx = emalloc(eho->context_size); - eho->hash_init(ctx); - } else -#endif + if (!eho) { + zend_string_release(mode_str); return NULL; } + zend_string_release(mode_str); - e = emalloc(sizeof(*e)); - e->ctx = ctx; - e->mode = estrdup(mode); + e = emalloc(sizeof(*e) + eho->context_size - 1); + e->ops = eho; + eho->hash_init(e->ctx HASH_INIT_ARGS); return e; } @@ -54,40 +45,10 @@ php_http_etag_t *php_http_etag_init(const char *mode) char *php_http_etag_finish(php_http_etag_t *e) { unsigned char digest[128] = {0}; - char *etag = NULL; - - if (!strcasecmp(e->mode, "crc32b")) { - unsigned char buf[4]; - - *((uint *) e->ctx) = ~*((uint *) e->ctx); -#ifdef WORDS_BIGENDIAN - etag = php_http_etag_digest((unsigned char *) e->ctx, 4); -#else - buf[0] = ((unsigned char *) e->ctx)[3]; - buf[1] = ((unsigned char *) e->ctx)[2]; - buf[2] = ((unsigned char *) e->ctx)[1]; - buf[3] = ((unsigned char *) e->ctx)[0]; - etag = php_http_etag_digest(buf, 4); -#endif - } else if ((!strcasecmp(e->mode, "sha1"))) { - PHP_SHA1Final(digest, e->ctx); - etag = php_http_etag_digest(digest, 20); - } else if ((!strcasecmp(e->mode, "md5"))) { - PHP_MD5Final(digest, e->ctx); - etag = php_http_etag_digest(digest, 16); - } else { -#ifdef PHP_HTTP_HAVE_HASH - const php_hash_ops *eho = NULL; - - if (e->mode && (eho = php_hash_fetch_ops(e->mode, strlen(e->mode)))) { - eho->hash_final(digest, e->ctx); - etag = php_http_etag_digest(digest, eho->digest_size); - } -#endif - } + char *etag; - efree(e->ctx); - efree(e->mode); + e->ops->hash_final(digest, e->ctx); + etag = php_http_etag_digest(digest, e->ops->digest_size); efree(e); return etag; @@ -95,25 +56,7 @@ char *php_http_etag_finish(php_http_etag_t *e) size_t php_http_etag_update(php_http_etag_t *e, const char *data_ptr, size_t data_len) { - if (!strcasecmp(e->mode, "crc32b")) { - uint i, c = *((uint *) e->ctx); - for (i = 0; i < data_len; ++i) { - CRC32(c, data_ptr[i]); - } - *((uint *) e->ctx) = c; - } else if ((!strcasecmp(e->mode, "sha1"))) { - PHP_SHA1Update(e->ctx, (const unsigned char *) data_ptr, data_len); - } else if ((!strcasecmp(e->mode, "md5"))) { - PHP_MD5Update(e->ctx, (const unsigned char *) data_ptr, data_len); - } else { -#ifdef PHP_HTTP_HAVE_HASH - const php_hash_ops *eho = NULL; - - if (e->mode && (eho = php_hash_fetch_ops(e->mode, strlen(e->mode)))) { - eho->hash_update(e->ctx, (const unsigned char *) data_ptr, data_len); - } -#endif - } + e->ops->hash_update(e->ctx, (const unsigned char *) data_ptr, data_len); return data_len; } @@ -127,4 +70,3 @@ size_t php_http_etag_update(php_http_etag_t *e, const char *data_ptr, size_t dat * vim600: noet sw=4 ts=4 fdm=marker * vim<600: noet sw=4 ts=4 */ -