+/* {{{ void http_ob_etaghandler(char *, uint, char **, uint *, int) */
+PHP_HTTP_API void _http_ob_etaghandler(char *output, uint output_len,
+ char **handled_output, uint *handled_output_len, int mode TSRMLS_DC)
+{
+ char etag[41] = { 0 };
+ unsigned char digest[20];
+
+ if (mode & PHP_OUTPUT_HANDLER_START) {
+ if (HTTP_G(etag).started) {
+ http_error(HE_WARNING, HTTP_E_RUNTIME, "ob_etaghandler can only be used once");
+ return;
+ }
+ HTTP_G(etag).started = 1;
+ HTTP_G(etag).ctx = http_etag_init();
+ }
+
+ http_etag_update(HTTP_G(etag).ctx, output, output_len);
+
+ if (mode & PHP_OUTPUT_HANDLER_END) {
+ char *etag = http_etag_finish(HTTP_G(etag).ctx);
+
+ /* just do that if desired */
+ if (HTTP_G(etag).started) {
+ char *sent_header = NULL;
+
+ http_send_cache_control(HTTP_DEFAULT_CACHECONTROL, lenof(HTTP_DEFAULT_CACHECONTROL));
+ http_send_etag_ex(etag, strlen(etag), &sent_header);
+
+ if (http_match_etag("HTTP_IF_NONE_MATCH", etag)) {
+ efree(etag);
+ http_exit_ex(304, sent_header, NULL, 0);
+ } else {
+ STR_FREE(sent_header);
+ }
+ }
+ efree(etag);
+ }
+
+ *handled_output_len = output_len;
+ *handled_output = estrndup(output, output_len);
+}
+/* }}} */