- char *t;
- char *tmp;
- char *headers;
- char *tag, *value;
- char scratch[HUGE_STRING];
-
- int taglen;
-
- string_list_t **last = &e->userhdrs;
-
- if (!(t = strchr (src, ':')))
- return -1;
-
- if ((tmp = m_strdup(t + 1)) == NULL)
- return -1;
-
- if ((headers = strchr (tmp, '?')))
- *headers++ = '\0';
-
- url_decode(tmp);
- e->to = rfc822_parse_adrlist(e->to, tmp);
-
- tag = headers ? strtok (headers, "&") : NULL;
-
- for (; tag; tag = strtok(NULL, "&")) {
- if ((value = strchr (tag, '=')))
- *value++ = '\0';
- if (!value || !*value)
- continue;
-
- url_decode (tag);
- url_decode (value);
-
- if (mime_which_token(tag, -1) == MIME_BODY) {
- if (body)
- m_strreplace(body, value);
- } else {
-#define SAFEPFX (option(OPTSTRICTMAILTO) ? "" : "X-Mailto-")
- taglen = m_strlen(tag) + strlen(SAFEPFX);
- /* mutt_parse_rfc822_line makes some assumptions */
- snprintf(scratch, sizeof(scratch), "%s%s: %s", SAFEPFX, tag, value);
-#undef SAVEPFX
- scratch[taglen] = '\0';
- value = vskipspaces(&scratch[taglen + 1]);
- last = mutt_parse_rfc822_line (e, NULL, scratch, value, 0, 0, last);
- /* if $strict_mailto is set, force editing headers to let
- * users have a look at what we got */
- if (!option (OPTSTRICTMAILTO)) {
- set_option (OPTXMAILTO);
- set_option (OPTEDITHDRS);
- }
- }
- }