]> git.ipfire.org Git - thirdparty/babel.git/commitdiff
Use email.Message for pofile header parsing
authorAarni Koskela <akx@iki.fi>
Tue, 10 May 2022 12:36:47 +0000 (15:36 +0300)
committerAarni Koskela <akx@iki.fi>
Tue, 10 May 2022 13:00:24 +0000 (15:00 +0200)
cgi.parse_header is due to be deprecated

Fixes #873

babel/messages/catalog.py
tests/messages/test_pofile.py

index 564b2c7c85e3e265d3c9c22a8399691427484c74..e43a28c02d8b531dc98349fb491f489aac73f733 100644 (file)
@@ -10,7 +10,6 @@
 
 import re
 
-from cgi import parse_header
 from collections import OrderedDict
 from datetime import datetime, time as time_
 from difflib import get_close_matches
@@ -225,6 +224,13 @@ DEFAULT_HEADER = u"""\
 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
 #"""
 
+def parse_separated_header(value: str):
+    # Adapted from https://peps.python.org/pep-0594/#cgi
+    from email.message import Message
+    m = Message()
+    m['content-type'] = value
+    return dict(m.get_params())
+
 
 class Catalog:
     """Representation of a message catalog."""
@@ -424,11 +430,11 @@ class Catalog:
             elif name == 'language-team':
                 self.language_team = value
             elif name == 'content-type':
-                mimetype, params = parse_header(value)
+                params = parse_separated_header(value)
                 if 'charset' in params:
                     self.charset = params['charset'].lower()
             elif name == 'plural-forms':
-                _, params = parse_header(' ;' + value)
+                params = parse_separated_header(' ;' + value)
                 self._num_plurals = int(params.get('nplurals', 2))
                 self._plural_expr = params.get('plural', '(n != 1)')
             elif name == 'pot-creation-date':
index 73a7b0ebb9d5767ce4561964586abbfe470543f5..99e59babca7b5287d93132e96e9a9a6b96103dcd 100644 (file)
@@ -69,6 +69,17 @@ msgstr "bär"'''.encode('iso-8859-1'))
         catalog = pofile.read_po(buf, locale='de_DE')
         assert catalog.get('foo').string == 'bär'
 
+    def test_encoding_header_read(self):
+        buf = BytesIO(b'msgid ""\nmsgstr ""\n"Content-Type: text/plain; charset=mac_roman\\n"\n')
+        catalog = pofile.read_po(buf, locale='xx_XX')
+        assert catalog.charset == 'mac_roman'
+
+    def test_plural_forms_header_parsed(self):
+        buf = BytesIO(b'msgid ""\nmsgstr ""\n"Plural-Forms: nplurals=42; plural=(n % 11);\\n"\n')
+        catalog = pofile.read_po(buf, locale='xx_XX')
+        assert catalog.plural_expr == '(n % 11)'
+        assert catalog.num_plurals == 42
+
     def test_read_multiline(self):
         buf = StringIO(r'''msgid ""
 "Here's some text that\n"