]> diplodocus.org Git - nmh/commitdiff
First basic test of extended parameter output: working!
authorKen Hornstein <kenh@pobox.com>
Tue, 25 Feb 2014 20:23:56 +0000 (15:23 -0500)
committerKen Hornstein <kenh@pobox.com>
Tue, 25 Feb 2014 20:23:56 +0000 (15:23 -0500)
test/mhbuild/test-ext-params
uip/mhbuildsbr.c
uip/mhparse.c

index 74253f4167819119379084ff0e0b39fe7cb2471d..a6c4b1299a3cf9005e9b8acd4fd669853d05b3c2 100755 (executable)
@@ -26,6 +26,7 @@ expected="$MH_TEST_DIR/$$.expected"
 cat > "$draft" <<EOF
 To: Mr Test <mrtest@example.com>
 cc:
+Fcc: +outbox
 ------
 This is a test message
 #image/jpeg {attachment; filename="tïny.jpg"} ${srcdir}/test/mhbuild/tiny.jpg
@@ -38,12 +39,21 @@ To: Mr Test <mrtest@example.com>
 cc:
 Fcc: +outbox
 MIME-Version: 1.0
-Content-Type: image/jpeg; name="tiny.jpg"
-Content-Description: tiny.jpg
-Content-Disposition: attachment; filename="tiny.jpg"
+Content-Type: multipart/mixed; boundary="----- =_aaaaaaaaaa0"
+
+------- =_aaaaaaaaaa0
+Content-Type: text/plain; charset="us-ascii"
+
+This is a test message
+
+------- =_aaaaaaaaaa0
+Content-Type: image/jpeg
+Content-Disposition: attachment; filename*=UTF-8''t%C3%AFny.jpg
 Content-Transfer-Encoding: base64
 
 /9g=
+
+------- =_aaaaaaaaaa0--
 EOF
 
 check "$draft" "$expected"
index 0075c2b2ea83dd88176353d799139717ff5a0bf0..b013186d925559c8dbbf97f239b1b66376c32639 100644 (file)
@@ -1650,7 +1650,6 @@ build_headers (CT ct)
        vp = concat (" ", ct->c_id, NULL);
        add_header (ct, np, vp);
     }
-
     /*
      * output the Content-Description
      */
@@ -1661,12 +1660,22 @@ build_headers (CT ct)
     }
 
     /*
-     * output the Content-Disposition
+     * output the Content-Disposition.  If it's NULL but c_dispo_type is
+     * set, then we need to build it.
      */
     if (ct->c_dispo) {
        np = add (DISPO_FIELD, NULL);
        vp = concat (" ", ct->c_dispo, NULL);
        add_header (ct, np, vp);
+    } else if (ct->c_dispo_type) {
+       vp = concat (" ", ct->c_dispo_type, NULL);
+       len = strlen(DISPO_FIELD) + strlen(vp) + 1;
+       np = output_params(len, ct->c_dispo_first, NULL);
+       vp = add(np, vp);
+       vp = add("\n", vp);
+       if (np)
+           free(np);
+       add_header (ct, getcpy(DISPO_FIELD), vp);
     }
 
 skip_headers:
index 79fbb716fcbf77bedbfcf183bc5580121b0d52d3..1b83ae87e1c334d9060d5928469c466b286a11b6 100644 (file)
@@ -138,7 +138,7 @@ static int openURL (CT, char **);
 static size_t param_len(PM, int, size_t, int *);
 static size_t encode_param(PM, char *, size_t, size_t, size_t, int);
 static size_t normal_param(PM, char *, size_t, size_t, size_t);
-static int get_dispo (char *, CT);
+static int get_dispo (char *, CT, int);
 
 struct str2init str2cts[] = {
     { "application", CT_APPLICATION, InitApplication },
@@ -514,7 +514,7 @@ get_content (FILE *in, char *file, int toplevel)
        }
        else if (!strcasecmp (hp->name, DISPO_FIELD)) {
        /* Get Content-Disposition field */
-           if (get_dispo(hp->value, ct) == NOTOK)
+           if (get_dispo(hp->value, ct, 0) == NOTOK)
                goto out;
        }
 
@@ -837,7 +837,7 @@ magic_skip:
      * Get any {Content-Disposition} given in buffer.
      */
     if (magic && *cp == '{') {
-        ct->c_dispo = ++cp;
+        ++cp;
        for (dp = cp + strlen (cp) - 1; dp >= cp; dp--)
            if (*dp == '}')
                break;
@@ -849,10 +849,10 @@ magic_skip:
        
        c = *dp;
        *dp = '\0';
-       if (*ct->c_dispo)
-           ct->c_dispo = concat (ct->c_dispo, "\n", NULL);
-       else
-           ct->c_dispo = NULL;
+
+       if (get_dispo(cp, ct, 1) != OK)
+           return NOTOK;
+
        *dp++ = c;
        cp = dp;
 
@@ -936,15 +936,20 @@ magic_skip:
  * get_ctinfo().
  */
 static int
-get_dispo (char *cp, CT ct)
+get_dispo (char *cp, CT ct, int buildflag)
 {
-    char *dp;
+    char *dp, *dispoheader;
     char c;
     int status;
 
-    /* Save the whole copy of the Content-Disposition header */
+    /*
+     * Save the whole copy of the Content-Disposition header, unless we're
+     * processing a mhbuild directive.  A NULL c_dispo will be a flag to
+     * mhbuild that the disposition header needs to be generated at that
+     * time.
+     */
 
-    cp = ct->c_dispo = add(cp, NULL);
+    dispoheader = cp = add(cp, NULL);
 
     while (isspace ((unsigned char) *cp))      /* trim leading spaces */
        cp++;
@@ -962,8 +967,11 @@ get_dispo (char *cp, CT ct)
     if (debugsw)
        fprintf (stderr, "%s: %s\n", DISPO_FIELD, cp);
 
-    if (*cp == '(' && get_comment (ct->c_file, DISPO_FIELD, &cp, NULL) == NOTOK)
+    if (*cp == '(' && get_comment (ct->c_file, DISPO_FIELD, &cp, NULL) ==
+                                                       NOTOK) {
+       free(dispoheader);
        return NOTOK;
+    }
 
     for (dp = cp; istoken (*dp); dp++)
        continue;
@@ -977,15 +985,21 @@ get_dispo (char *cp, CT ct)
     if ((status = parse_header_attrs (ct->c_file, DISPO_FIELD, &cp,
                                      &ct->c_dispo_first, &ct->c_dispo_last,
                                      NULL)) != OK) {
-       return status == NOTOK ? NOTOK : OK;
-    }
-
-    if (*cp) {
+       if (status == NOTOK) {
+           free(dispoheader);
+           return NOTOK;
+       }
+    } else if (*cp) {
        advise (NULL,
                "extraneous information in message %s's %s: field\n%*s(%s)",
                     ct->c_file, DISPO_FIELD, strlen(invo_name) + 2, "", cp);
     }
 
+    if (buildflag)
+       free(dispoheader);
+    else
+       ct->c_dispo = dispoheader;
+
     return OK;
 }
 
@@ -3546,7 +3560,8 @@ output_params(size_t initialwidth, PM params, int *offsetout)
            q += snprintf(q, sizeof(line) - (q - line), "%s*%d",
                          params->pm_name, index);
        } else {
-           q = strncpy(q, params->pm_name, sizeof(line) - (q - line));
+           strncpy(q, params->pm_name, sizeof(line) - (q - line));
+           q += strlen(q);
        }
 
        if (eightbit)