Get rid of dict.has_key(). Boy this has a lot of repercussions!
Not all code has been fixed yet; this is just a checkpoint...
The C API still has PyDict_HasKey() and _HasKeyString(); not sure
if I want to change those just yet.
diff --git a/Lib/wsgiref/handlers.py b/Lib/wsgiref/handlers.py
index cc3a805..fb81bf3 100644
--- a/Lib/wsgiref/handlers.py
+++ b/Lib/wsgiref/handlers.py
@@ -159,7 +159,7 @@
 
         Subclasses can extend this to add other defaults.
         """
-        if not self.headers.has_key('Content-Length'):
+        if 'Content-Length' not in self.headers:
             self.set_content_length()
 
     def start_response(self, status, headers,exc_info=None):
@@ -194,11 +194,11 @@
         if self.origin_server:
             if self.client_is_modern():
                 self._write('HTTP/%s %s\r\n' % (self.http_version,self.status))
-                if not self.headers.has_key('Date'):
+                if 'Date' not in self.headers:
                     self._write(
                         'Date: %s\r\n' % format_date_time(time.time())
                     )
-                if self.server_software and not self.headers.has_key('Server'):
+                if self.server_software and 'Server' not in self.headers:
                     self._write('Server: %s\r\n' % self.server_software)
         else:
             self._write('Status: %s\r\n' % self.status)
diff --git a/Lib/wsgiref/headers.py b/Lib/wsgiref/headers.py
index 016eb86..934a645 100644
--- a/Lib/wsgiref/headers.py
+++ b/Lib/wsgiref/headers.py
@@ -80,12 +80,10 @@
 
 
 
-    def has_key(self, name):
+    def __contains__(self, name):
         """Return true if the message contains the header."""
         return self.get(name) is not None
 
-    __contains__ = has_key
-
 
     def get_all(self, name):
         """Return a list of all the values for the named field.
diff --git a/Lib/wsgiref/util.py b/Lib/wsgiref/util.py
index 9009b87..17fdff6 100644
--- a/Lib/wsgiref/util.py
+++ b/Lib/wsgiref/util.py
@@ -166,7 +166,7 @@
     'connection':1, 'keep-alive':1, 'proxy-authenticate':1,
     'proxy-authorization':1, 'te':1, 'trailers':1, 'transfer-encoding':1,
     'upgrade':1
-}.has_key
+}.__contains__
 
 def is_hop_by_hop(header_name):
     """Return true if 'header_name' is an HTTP/1.1 "Hop-by-Hop" header"""
diff --git a/Lib/wsgiref/validate.py b/Lib/wsgiref/validate.py
index 23ab9f8..43784f9 100644
--- a/Lib/wsgiref/validate.py
+++ b/Lib/wsgiref/validate.py
@@ -345,7 +345,7 @@
             "Invalid CONTENT_LENGTH: %r" % environ['CONTENT_LENGTH'])
 
     if not environ.get('SCRIPT_NAME'):
-        assert_(environ.has_key('PATH_INFO'),
+        assert_('PATH_INFO' in environ,
             "One of SCRIPT_NAME or PATH_INFO are required (PATH_INFO "
             "should at least be '/' if SCRIPT_NAME is empty)")
     assert_(environ.get('SCRIPT_NAME') != '/',