  
      def verifyOpaque(self, opaque, nonce, clientip):
          """
-@@ -274,7 +318,7 @@
+@@ -274,7 +316,7 @@
                  'Invalid response, incompatible opaque/nonce too old')
  
          # Verify the digest

+            if expected == response:
+                return True
 
+        # And yet another IE hack...
+        # IE refuses to send Authorization headers with REPORT requests.
+        # So instead we're sending a POST, then telling the server it's a REPORT.
+        # When this happens, the client created the response with POST and the server
+        # compares it against a response made with REPORT, which of course won't match.
+        # So we try again telling the server to use POST instead.
+        if self.method == "REPORT":
+            expected = calcResponse(
+                calcHA1(algo, self.username, self.realm, password, nonce, cnonce),
+                algo, nonce, nc, cnonce, qop, "POST", uri, None
+            )
+            if expected == response:
+                return True
+            if nc is not None or cnonce is not None:
+                expected = calcResponse(
+                    calcHA1(algo, self.username, self.realm, password, nonce, cnonce),
+                    algo, nonce, None, None, qop, "POST", uri, None
+                )
+                if expected == response:
+                    return True
+
+        return False
+
     def checkHash(self, digestHash):
         response = self.fields.get('response')
         uri = self.fields.get('uri')
@@ -228,9 +272,9 @@
         # Now, what we do is encode the nonce, client ip and a timestamp
         # in the opaque value with a suitable digest
         key = "%s,%s,%s" % (nonce, clientip, str(int(self._getTime())))

 
     def decode(self, response, request):
         """
@@ -315,18 +358,18 @@
         @raise: L{error.LoginFailed} if the response does not contain a
             username, a nonce, an opaque, or if the opaque is invalid.
         """
