requestValidator :: 
    B.ByteString    -- ^ AuthToken from your Twilio page
    -> Middleware
requestValidator authtoken app req respond = do
    -- strictRequestBody appears to work only once, so we re-insert result into request when validated.
    (body, rbody) <- readRequestBodyAndPushback req
    vs <- verifySignature authtoken body req    
    case vs of
        False -> respond $ responseLBS unauthorized401 [] "Invalid X-Twilio-Signature"
        True -> app (req {requestBody = rbody}) respond
requestValidator :: 
    B.ByteString    -- ^ AuthToken from your Twilio page
    -> Middleware
requestValidator authtoken app req respond = do
    -- strictRequestBody appears to work only once, so we re-insert result into request when validated.
    (body, rbody) <- readRequestBodyAndPushback req
    vs <- verifySignature authtoken body req    
    case vs of
        False -> respond $ responseLBS unauthorized401 [] "Invalid X-Twilio-Signature"
        True -> app (req {requestBody = rbody}) respond
requestValidator authtoken app req respond = do
    -- strictRequestBody appears to work only once, so we re-insert result into request when validated.
    (body, rbody) <- readRequestBodyAndPushback req
    vs <- verifySignature authtoken body req    
    case vs of
        False -> respond $ responseLBS unauthorized401 [] "Invalid X-Twilio-Signature"
        True -> app (req {requestBody = rbody}) respond