module Hack.Contrib.Middleware.ETag (etag) where

import Hack
import Hack.Contrib.Utils
import Hack.Contrib.Response
import Hack.Contrib.Constants

import MPSUTF8
import Prelude hiding ((.), (^), (>))

import Data.Digest.Pure.MD5
import Data.ByteString.Lazy.Char8 as C


etag :: Middleware
etag app = \env -> do
  r <- app env
  
  if r.has_header _ETag
    then r.return
    else r.set_header _ETag (r.tag) .return
  
  where 
    tag = 
          body
        > C.pack
        > md5
        > show