ConfigParser:
- ensure that option names in interpolations are handled by
  self.optionxform in the same way that other references to option
  names
- add tests, documentation
(closes SF bug #857881, patch #865455)
diff --git a/Lib/ConfigParser.py b/Lib/ConfigParser.py
index d32eae0..73acdd1 100644
--- a/Lib/ConfigParser.py
+++ b/Lib/ConfigParser.py
@@ -555,6 +555,7 @@
         while depth:                    # Loop through this until it's done
             depth -= 1
             if "%(" in value:
+                value = self._KEYCRE.sub(self._interpolation_replace, value)
                 try:
                     value = value % vars
                 except KeyError, e:
@@ -566,6 +567,15 @@
             raise InterpolationDepthError(option, section, rawval)
         return value
 
+    _KEYCRE = re.compile(r"%\(([^)]*)\)s|.")
+
+    def _interpolation_replace(self, match):
+        s = match.group(1)
+        if s is None:
+            return match.group()
+        else:
+            return "%%(%s)s" % self.optionxform(s)
+
 
 class SafeConfigParser(ConfigParser):
 
@@ -598,7 +608,7 @@
                 if m is None:
                     raise InterpolationSyntaxError(option, section,
                         "bad interpolation variable reference %r" % rest)
-                var = m.group(1)
+                var = self.optionxform(m.group(1))
                 rest = rest[m.end():]
                 try:
                     v = map[var]