From: Ken Hornstein Date: Tue, 25 Feb 2014 20:23:56 +0000 (-0500) Subject: First basic test of extended parameter output: working! X-Git-Url: https://diplodocus.org/git/nmh/commitdiff_plain/5aaf4f1c6bea2bffff48524e76bf9d03dd3e2dc6?hp=457f595e905f57b1424fc5e7d4159228cffb127e First basic test of extended parameter output: working! --- diff --git a/test/mhbuild/test-ext-params b/test/mhbuild/test-ext-params index 74253f41..a6c4b129 100755 --- a/test/mhbuild/test-ext-params +++ b/test/mhbuild/test-ext-params @@ -26,6 +26,7 @@ expected="$MH_TEST_DIR/$$.expected" cat > "$draft" < 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 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" diff --git a/uip/mhbuildsbr.c b/uip/mhbuildsbr.c index 0075c2b2..b013186d 100644 --- a/uip/mhbuildsbr.c +++ b/uip/mhbuildsbr.c @@ -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: diff --git a/uip/mhparse.c b/uip/mhparse.c index 79fbb716..1b83ae87 100644 --- a/uip/mhparse.c +++ b/uip/mhparse.c @@ -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)