- char etag[33] = { 0 };
- unsigned char digest[16];
-
- if (mode & PHP_OUTPUT_HANDLER_START) {
- HTTP_G(etag_started) = 1;
- PHP_MD5Init(&HTTP_G(etag_md5));
- }
-
- PHP_MD5Update(&HTTP_G(etag_md5), output, output_len);
-
- if (mode & PHP_OUTPUT_HANDLER_END) {
- PHP_MD5Final(digest, &HTTP_G(etag_md5));
-
- /* just do that if desired */
- if (HTTP_G(etag_started)) {
- make_digest(etag, digest);
- http_send_header("Cache-Control: " HTTP_DEFAULT_CACHECONTROL);
- http_send_etag(etag, 32);
-
+ /* passthru */
+ *handled_output_len = output_len;
+ *handled_output = estrndup(output, output_len);
+
+ /* are we supposed to run? */
+ if (HTTP_G->etag.started) {
+ /* initialize the etag context */
+ if (mode & PHP_OUTPUT_HANDLER_START) {
+ HTTP_G->etag.ctx = http_etag_init();
+ }
+
+ /* update */
+ http_etag_update(HTTP_G->etag.ctx, output, output_len);
+
+ /* finish */
+ if (mode & PHP_OUTPUT_HANDLER_END) {
+ char *sent_header = NULL;
+ char *etag = http_etag_finish(HTTP_G->etag.ctx);
+
+ HTTP_G->etag.ctx = NULL;
+
+ http_send_cache_control(HTTP_DEFAULT_CACHECONTROL, lenof(HTTP_DEFAULT_CACHECONTROL));
+ http_send_etag_ex(etag, strlen(etag), &sent_header);
+