+/* {{{ inline char *http_etag(void *, size_t, http_send_mode) */
+PHP_HTTP_API inline char *_http_etag(const void *data_ptr, const size_t data_len,
+ const http_send_mode data_mode TSRMLS_DC)
+{
+ char ssb_buf[128] = {0};
+ unsigned char digest[16];
+ PHP_MD5_CTX ctx;
+ char *new_etag = ecalloc(33, 1);
+
+ PHP_MD5Init(&ctx);
+
+ switch (data_mode)
+ {
+ case SEND_DATA:
+ PHP_MD5Update(&ctx, data_ptr, data_len);
+ break;
+
+ case SEND_RSRC:
+ if (!HTTP_G(ssb).sb.st_ino) {
+ if (php_stream_stat((php_stream *) data_ptr, &HTTP_G(ssb))) {
+ return NULL;
+ }
+ }
+ snprintf(ssb_buf, 127, "%ld=%ld=%ld",
+ HTTP_G(ssb).sb.st_mtime,
+ HTTP_G(ssb).sb.st_ino,
+ HTTP_G(ssb).sb.st_size
+ );
+ PHP_MD5Update(&ctx, ssb_buf, strlen(ssb_buf));
+ break;
+
+ default:
+ efree(new_etag);
+ return NULL;
+ break;
+ }
+
+ PHP_MD5Final(digest, &ctx);
+ make_digest(new_etag, digest);
+
+ return new_etag;
+}
+/* }}} */
+
+/* {{{ inline http_lmod(void *, http_send_mode) */
+PHP_HTTP_API inline time_t _http_lmod(const void *data_ptr, const http_send_mode data_mode TSRMLS_DC)
+{
+ switch (data_mode)
+ {
+ case SEND_DATA:
+ {
+ return time(NULL);
+ }
+
+ case SEND_RSRC:
+ {
+ if (!HTTP_G(ssb).sb.st_mtime) {
+ if (php_stream_stat((php_stream *) data_ptr, &HTTP_G(ssb))) {
+ return 0;
+ }
+ }
+ return HTTP_G(ssb).sb.st_mtime;
+ }
+
+ default:
+ {
+ zval mtime;
+ php_stat(Z_STRVAL_P((zval *) data_ptr), Z_STRLEN_P((zval *) data_ptr), FS_MTIME, &mtime TSRMLS_CC);
+ return Z_LVAL(mtime);
+ }
+ }
+}
+/* }}} */
+
+/* {{{inline int http_is_range_request(void) */
+PHP_HTTP_API inline int _http_is_range_request(TSRMLS_D)
+{
+ return zend_hash_exists(Z_ARRVAL_P(PG(http_globals)[TRACK_VARS_SERVER]),
+ "HTTP_RANGE", strlen("HTTP_RANGE") + 1);
+}
+/* }}} */
+