1
From: A <author@example.com>
2
Subject: [PATCH] mailinfo: support format=flowed
3
Message-ID: <aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa@example.com>
4
Date: Sat, 25 Aug 2018 22:04:50 +0200
5
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:60.0) Gecko/20100101
8
Content-Type: text/plain; charset=utf-8; format=flowed
10
Content-Transfer-Encoding: 7bit
13
mailinfo.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++--
14
1 file changed, 62 insertions(+), 2 deletions(-)
16
diff --git a/mailinfo.c b/mailinfo.c
17
index 3281a37d51..b395adbdf2 100644
20
@@ -237,11 +237,22 @@ static int slurp_attr(const char *line, const char
21
*name, struct strbuf *attr)
25
+static int has_attr_value(const char *line, const char *name, const
28
+ struct strbuf sb = STRBUF_INIT;
29
+ int rc = slurp_attr(line, name, &sb) && !strcasecmp(sb.buf, value);
34
static void handle_content_type(struct mailinfo *mi, struct strbuf *line)
36
struct strbuf *boundary = xmalloc(sizeof(struct strbuf));
37
strbuf_init(boundary, line->len);
39
+ mi->format_flowed = has_attr_value(line->buf, "format=", "flowed");
40
+ mi->delsp = has_attr_value(line->buf, "delsp=", "yes");
42
if (slurp_attr(line->buf, "boundary=", boundary)) {
43
strbuf_insert(boundary, 0, "--", 2);
44
if (++mi->content_top >= &mi->content[MAX_BOUNDARIES]) {
45
@@ -964,6 +975,52 @@ static int handle_boundary(struct mailinfo *mi,
50
+static void handle_filter_flowed(struct mailinfo *mi, struct strbuf *line,
53
+ size_t len = line->len;
56
+ if (!mi->format_flowed) {
57
+ handle_filter(mi, line);
61
+ if (line->buf[len - 1] == '\n') {
63
+ if (len && line->buf[len - 1] == '\r')
67
+ /* Keep signature separator as-is. */
68
+ if (skip_prefix(line->buf, "-- ", &rest) && rest - line->buf == len) {
70
+ handle_filter(mi, prev);
73
+ handle_filter(mi, line);
77
+ /* Unstuff space-stuffed line. */
78
+ if (len && line->buf[0] == ' ') {
79
+ strbuf_remove(line, 0, 1);
83
+ /* Save flowed line for later, but without the soft line break. */
84
+ if (len && line->buf[len - 1] == ' ') {
85
+ strbuf_add(prev, line->buf, len - !!mi->delsp);
89
+ /* Prepend any previous partial lines */
90
+ strbuf_insert(line, 0, prev->buf, prev->len);
93
+ handle_filter(mi, line);
96
static void handle_body(struct mailinfo *mi, struct strbuf *line)
98
struct strbuf prev = STRBUF_INIT;
99
@@ -1012,7 +1069,7 @@ static void handle_body(struct mailinfo *mi,
101
strbuf_addbuf(&prev, sb);
104
- handle_filter(mi, sb);
105
+ handle_filter_flowed(mi, sb, &prev);
108
* The partial chunk is saved in "prev" and will be
109
@@ -1022,13 +1079,16 @@ static void handle_body(struct mailinfo *mi,
114
- handle_filter(mi, line);
115
+ handle_filter_flowed(mi, line, &prev);
120
} while (!strbuf_getwholeline(line, mi->input, '\n'));
123
+ handle_filter(mi, &prev);
125
flush_inbody_header_accum(mi);