Fix codecs.EncodedFile which did not use file_encoding in 2.5.0, and
fix all codecs file wrappers to work correctly with the "with"
statement (bug #1586513).
 (backport from rev. 52517)
diff --git a/Lib/codecs.py b/Lib/codecs.py
index 1518d75..f834b8d 100644
--- a/Lib/codecs.py
+++ b/Lib/codecs.py
@@ -329,6 +329,12 @@
         """
         return getattr(self.stream, name)
 
+    def __enter__(self):
+        return self
+
+    def __exit__(self, type, value, tb):
+        self.stream.close()
+
 ###
 
 class StreamReader(Codec):
@@ -568,6 +574,12 @@
         """
         return getattr(self.stream, name)
 
+    def __enter__(self):
+        return self
+
+    def __exit__(self, type, value, tb):
+        self.stream.close()
+
 ###
 
 class StreamReaderWriter:
@@ -641,6 +653,14 @@
         """
         return getattr(self.stream, name)
 
+    # these are needed to make "with codecs.open(...)" work properly
+
+    def __enter__(self):
+        return self
+
+    def __exit__(self, type, value, tb):
+        self.stream.close()
+
 ###
 
 class StreamRecoder:
@@ -751,6 +771,12 @@
         """
         return getattr(self.stream, name)
 
+    def __enter__(self):
+        return self
+
+    def __exit__(self, type, value, tb):
+        self.stream.close()
+
 ### Shortcuts
 
 def open(filename, mode='rb', encoding=None, errors='strict', buffering=1):
@@ -824,9 +850,10 @@
     """
     if file_encoding is None:
         file_encoding = data_encoding
-    info = lookup(data_encoding)
-    sr = StreamRecoder(file, info.encode, info.decode,
-                       info.streamreader, info.streamwriter, errors)
+    data_info = lookup(data_encoding)
+    file_info = lookup(file_encoding)
+    sr = StreamRecoder(file, data_info.encode, data_info.decode,
+                       file_info.streamreader, file_info.streamwriter, errors)
     # Add attributes to simplify introspection
     sr.data_encoding = data_encoding
     sr.file_encoding = file_encoding