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>
This commit is contained in:

committed by
Junio C Hamano

parent
ffbea1816d
commit
f696a2b1c8
39
mailinfo.c
39
mailinfo.c
@ -549,23 +549,36 @@ release_return:
|
|||||||
mi->input_error = -1;
|
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,
|
static int check_header(struct mailinfo *mi,
|
||||||
const struct strbuf *line,
|
const struct strbuf *line,
|
||||||
struct strbuf *hdr_data[], int overwrite)
|
struct strbuf *hdr_data[], int overwrite)
|
||||||
{
|
{
|
||||||
int i, ret = 0;
|
int i, ret = 0;
|
||||||
struct strbuf sb = STRBUF_INIT;
|
struct strbuf sb = STRBUF_INIT;
|
||||||
const char *val;
|
|
||||||
|
|
||||||
/* search for the interesting parts */
|
/* search for the interesting parts */
|
||||||
for (i = 0; header[i]; i++) {
|
for (i = 0; header[i]; i++) {
|
||||||
if ((!hdr_data[i] || overwrite) &&
|
if ((!hdr_data[i] || overwrite) &&
|
||||||
skip_header(line, header[i], &val)) {
|
parse_header(line, header[i], mi, &sb)) {
|
||||||
/* Unwrap inline B and Q encoding, and optionally
|
|
||||||
* normalize the meta information to utf8.
|
|
||||||
*/
|
|
||||||
strbuf_addstr(&sb, val);
|
|
||||||
decode_header(mi, &sb);
|
|
||||||
handle_header(&hdr_data[i], &sb);
|
handle_header(&hdr_data[i], &sb);
|
||||||
ret = 1;
|
ret = 1;
|
||||||
goto check_header_out;
|
goto check_header_out;
|
||||||
@ -573,23 +586,17 @@ static int check_header(struct mailinfo *mi,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Content stuff */
|
/* Content stuff */
|
||||||
if (skip_header(line, "Content-Type", &val)) {
|
if (parse_header(line, "Content-Type", mi, &sb)) {
|
||||||
strbuf_addstr(&sb, val);
|
|
||||||
decode_header(mi, &sb);
|
|
||||||
handle_content_type(mi, &sb);
|
handle_content_type(mi, &sb);
|
||||||
ret = 1;
|
ret = 1;
|
||||||
goto check_header_out;
|
goto check_header_out;
|
||||||
}
|
}
|
||||||
if (skip_header(line, "Content-Transfer-Encoding", &val)) {
|
if (parse_header(line, "Content-Transfer-Encoding", mi, &sb)) {
|
||||||
strbuf_addstr(&sb, val);
|
|
||||||
decode_header(mi, &sb);
|
|
||||||
handle_content_transfer_encoding(mi, &sb);
|
handle_content_transfer_encoding(mi, &sb);
|
||||||
ret = 1;
|
ret = 1;
|
||||||
goto check_header_out;
|
goto check_header_out;
|
||||||
}
|
}
|
||||||
if (skip_header(line, "Message-Id", &val)) {
|
if (parse_header(line, "Message-Id", mi, &sb)) {
|
||||||
strbuf_addstr(&sb, val);
|
|
||||||
decode_header(mi, &sb);
|
|
||||||
if (mi->add_message_id)
|
if (mi->add_message_id)
|
||||||
mi->message_id = strbuf_detach(&sb, NULL);
|
mi->message_id = strbuf_detach(&sb, NULL);
|
||||||
ret = 1;
|
ret = 1;
|
||||||
|
Reference in New Issue
Block a user