RFE [ 1216944 ] Add Error Code Dictionary to urllib2
diff --git a/Doc/lib/liburllib2.tex b/Doc/lib/liburllib2.tex
index 6f9395c..532c223 100644
--- a/Doc/lib/liburllib2.tex
+++ b/Doc/lib/liburllib2.tex
@@ -71,6 +71,15 @@
 \end{funcdesc}
 
 
+The following attribute is defined:
+
+\begin{datadesc}{httpresponses}
+A mapping between HTTP status codes and the W3C names.
+
+Example: \code{urllib2.httpresponses[404]} is \code{'Not Found'}.
+\versionadded{2.5}
+\end{datadesc}
+
 The following exceptions are raised as appropriate:
 
 \begin{excdesc}{URLError}
diff --git a/Lib/test/test_urllib2.py b/Lib/test/test_urllib2.py
index c68d244..1c0b7da 100644
--- a/Lib/test/test_urllib2.py
+++ b/Lib/test/test_urllib2.py
@@ -40,6 +40,10 @@
 
         buf = f.read()
         f.close()
+        
+    def test_statudict(self):
+        # test the new-in-2.5 httpresponses dictionary
+        self.assertEquals(urllib2.httpresponses[404], "Not Found")
 
 
 class MockOpener:
diff --git a/Lib/urllib2.py b/Lib/urllib2.py
index 13c1f1e..7202507 100644
--- a/Lib/urllib2.py
+++ b/Lib/urllib2.py
@@ -1293,3 +1293,52 @@
             if inspect.isclass(ph):
                 ph = ph()
             opener.add_handler(ph)
+
+# Mapping status codes to official W3C names
+httpresponses = {
+    100: 'Continue',
+    101: 'Switching Protocols',
+    
+    200: 'OK',
+    201: 'Created',
+    202: 'Accepted',
+    203: 'Non-Authoritative Information',
+    204: 'No Content',
+    205: 'Reset Content',
+    206: 'Partial Content',
+    
+    300: 'Multiple Choices',
+    301: 'Moved Permanently',
+    302: 'Found',
+    303: 'See Other',
+    304: 'Not Modified',
+    305: 'Use Proxy',
+    306: '(Unused)',
+    307: 'Temporary Redirect',
+    
+    400: 'Bad Request',
+    401: 'Unauthorized',
+    402: 'Payment Required',
+    403: 'Forbidden',
+    404: 'Not Found',
+    405: 'Method Not Allowed',
+    406: 'Not Acceptable',
+    407: 'Proxy Authentication Required',
+    408: 'Request Timeout',
+    409: 'Conflict',
+    410: 'Gone',
+    411: 'Length Required',
+    412: 'Precondition Failed',
+    413: 'Request Entity Too Large',
+    414: 'Request-URI Too Long',
+    415: 'Unsupported Media Type',
+    416: 'Requested Range Not Satisfiable',
+    417: 'Expectation Failed',
+    
+    500: 'Internal Server Error',
+    501: 'Not Implemented',
+    502: 'Bad Gateway',
+    503: 'Service Unavailable',
+    504: 'Gateway Timeout',
+    505: 'HTTP Version Not Supported',
+}
diff --git a/Misc/NEWS b/Misc/NEWS
index 13c7761..219586f 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -168,6 +168,9 @@
 Library
 -------
 
+- urllib2 has now an attribute 'httpresponses' mapping from HTTP status code
+  to W3C name (404 -> 'Not Found'). RFE #1216944.
+
 - Bug #1177468: Don't cache the /dev/urandom file descriptor for os.urandom,
   as this can cause problems with apps closing all file descriptors.