]> diplodocus.org Git - nmh/blobdiff - uip/mhbuildsbr.c
Fix bug where single-character headers were sometimes missed.
[nmh] / uip / mhbuildsbr.c
index 26d8524d767a9f72005a641924ce4e2325135d57..3ef5022a9de09eae6659f0083a96f959fd81e8de 100644 (file)
@@ -1453,15 +1453,17 @@ scan_content (CT ct, size_t maxunencoded)
      * Decide what to check while scanning this content.  Note that
      * for text content we always check for 8bit characters if the
      * charset is unspecified, because that controls whether or not the
-     * character set is us-ascii or retrieved from the locale.
+     * character set is us-ascii or retrieved from the locale.  And
+     * we check even if the charset is specified, to allow setting
+     * the proper Content-Transfer-Encoding.
      */
 
     if (ct->c_type == CT_TEXT) {
        t = (struct text *) ct->c_ctparams;
        if (t->tx_charset == CHARSET_UNSPECIFIED) {
-           check8bit = 1;
            checknul = 1;
        }
+       check8bit = 1;
     }
 
     switch (ct->c_reqencoding) {
@@ -2225,6 +2227,7 @@ expand_pseudoheader (CT ct, CT *text_plain_ct, struct multipart *m,
     struct str2init *s2i;
     CT reply_ct;
     struct part *part;
+    int eightbit = 0;
     int status;
 
     type_p = getcpy (type);
@@ -2271,6 +2274,20 @@ expand_pseudoheader (CT ct, CT *text_plain_ct, struct multipart *m,
         return;
     }
 
+    /* For text content only, see if it is 8-bit text. */
+    if (reply_ct->c_type == CT_TEXT) {
+        int fd;
+
+        if ((fd = open (reply_file, O_RDONLY)) == NOTOK  ||
+            scan_input (fd, &eightbit) == NOTOK) {
+            free (reply_file);
+            admonish (NULL, "failed to read %s", reply_file);
+            return;
+        } else {
+            (void) close (fd);
+        }
+    }
+
     /* This sets reply_ct->c_ctparams, and reply_ct->c_termproc if the
        charset can't be handled natively. */
     for (s2i = str2cts; s2i->si_key; s2i++) {
@@ -2290,10 +2307,15 @@ expand_pseudoheader (CT ct, CT *text_plain_ct, struct multipart *m,
     } else {
         set_charset (reply_ct, -1);
         charset = get_param (reply_ct->c_ctinfo.ci_first_pm, "charset", '?', 1);
-        if (reply_ct->c_reqencoding == CE_UNKNOWN) {
-            /* Assume that 8bit is sufficient (for text). */
-            reply_ct->c_reqencoding =
-                strcasecmp (charset, "US-ASCII")  ?  CE_8BIT  :  CE_7BIT;
+        if (reply_ct->c_reqencoding == CE_UNKNOWN  &&
+            reply_ct->c_type == CT_TEXT) {
+            /* Assume that 8bit is sufficient (for text).  In other words,
+               don't allow it to be encoded as quoted printable if lines
+               are too long.  This also sidesteps the check for whether
+               it needs to be encoded as binary; instead, it relies on
+               the applicable mhbuild-convert-text directive to ensure
+               that the resultant text is not binary. */
+            reply_ct->c_reqencoding = eightbit  ?  CE_8BIT  :  CE_7BIT;
         }
     }
 
@@ -2308,9 +2330,14 @@ expand_pseudoheader (CT ct, CT *text_plain_ct, struct multipart *m,
                part. */
             set_charset (*text_plain_ct, -1);
             if ((*text_plain_ct)->c_reqencoding == CE_UNKNOWN) {
-                /* Assume that 8bit is sufficient (for text). */
+                /* Assume that 8bit is sufficient (for text).  In other words,
+                   don't allow it to be encoded as quoted printable if lines
+                   are too long.  This also sidesteps the check for whether
+                   it needs to be encoded as binary; instead, it relies on
+                   the applicable mhbuild-convert-text directive to ensure
+                   that the resultant text is not binary. */
                 (*text_plain_ct)->c_reqencoding =
-                    strcasecmp (charset, "US-ASCII")  ?  CE_8BIT  :  CE_7BIT;
+                    eightbit  ?  CE_8BIT  :  CE_7BIT;
             }
         }
 
@@ -2340,6 +2367,13 @@ expand_pseudoheader (CT ct, CT *text_plain_ct, struct multipart *m,
                                  reply_file);
                         if (close (text_plain_reply) == OK  &&
                             close (addl_reply) == OK) {
+                            /* If appended text needed 8-bit but first text didn't,
+                               propagate the 8-bit indication. */
+                            if ((*text_plain_ct)->c_reqencoding == CE_7BIT  &&
+                                reply_ct->c_reqencoding == CE_8BIT) {
+                                (*text_plain_ct)->c_reqencoding = CE_8BIT;
+                            }
+
                             if (reply_fp) { fclose (reply_fp); }
                             free (reply_file);
                             free_content (reply_ct);
@@ -2357,7 +2391,7 @@ expand_pseudoheader (CT ct, CT *text_plain_ct, struct multipart *m,
     reply_ct->c_cefile.ce_fp = reply_fp;
     reply_ct->c_cefile.ce_unlink = 1;
 
-    /* Attach the new part to the parent mulitpart/mixed, "m". */
+    /* Attach the new part to the parent multipart/mixed, "m". */
     part = (struct part *) mh_xcalloc (1, sizeof *part);
     part->mp_part = reply_ct;
     if (m->mp_parts) {