summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLibravatar Jeff King <peff@peff.net>2020-02-11 12:20:05 -0500
committerLibravatar Junio C Hamano <gitster@pobox.com>2020-02-11 10:21:43 -0800
commitf696a2b1c850c81130740945835beec72727debf (patch)
tree5fb85a3f0d7c4ef95ee15055a4a18f44717916d7
parentmailinfo: be more liberal with header whitespace (diff)
downloadtgif-f696a2b1c850c81130740945835beec72727debf.tar.xz
mailinfo: factor out some repeated header handling
We do the same thing for each header: match it, copy it to a strbuf, and decode it. Let's put that in a helper function to avoid repetition. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--mailinfo.c39
1 files changed, 23 insertions, 16 deletions
diff --git a/mailinfo.c b/mailinfo.c
index 78f06da524..cf92255515 100644
--- a/mailinfo.c
+++ b/mailinfo.c
@@ -549,23 +549,36 @@ release_return:
mi->input_error = -1;
}
+/*
+ * Returns true if "line" contains a header matching "hdr", in which case "val"
+ * will contain the value of the header with any RFC2047 B and Q encoding
+ * unwrapped, and optionally normalize the meta information to utf8.
+ */
+static int parse_header(const struct strbuf *line,
+ const char *hdr,
+ struct mailinfo *mi,
+ struct strbuf *val)
+{
+ const char *val_str;
+
+ if (!skip_header(line, hdr, &val_str))
+ return 0;
+ strbuf_addstr(val, val_str);
+ decode_header(mi, val);
+ return 1;
+}
+
static int check_header(struct mailinfo *mi,
const struct strbuf *line,
struct strbuf *hdr_data[], int overwrite)
{
int i, ret = 0;
struct strbuf sb = STRBUF_INIT;
- const char *val;
/* search for the interesting parts */
for (i = 0; header[i]; i++) {
if ((!hdr_data[i] || overwrite) &&
- skip_header(line, header[i], &val)) {
- /* Unwrap inline B and Q encoding, and optionally
- * normalize the meta information to utf8.
- */
- strbuf_addstr(&sb, val);
- decode_header(mi, &sb);
+ parse_header(line, header[i], mi, &sb)) {
handle_header(&hdr_data[i], &sb);
ret = 1;
goto check_header_out;
@@ -573,23 +586,17 @@ static int check_header(struct mailinfo *mi,
}
/* Content stuff */
- if (skip_header(line, "Content-Type", &val)) {
- strbuf_addstr(&sb, val);
- decode_header(mi, &sb);
+ if (parse_header(line, "Content-Type", mi, &sb)) {
handle_content_type(mi, &sb);
ret = 1;
goto check_header_out;
}
- if (skip_header(line, "Content-Transfer-Encoding", &val)) {
- strbuf_addstr(&sb, val);
- decode_header(mi, &sb);
+ if (parse_header(line, "Content-Transfer-Encoding", mi, &sb)) {
handle_content_transfer_encoding(mi, &sb);
ret = 1;
goto check_header_out;
}
- if (skip_header(line, "Message-Id", &val)) {
- strbuf_addstr(&sb, val);
- decode_header(mi, &sb);
+ if (parse_header(line, "Message-Id", mi, &sb)) {
if (mi->add_message_id)
mi->message_id = strbuf_detach(&sb, NULL);
ret = 1;