#include "rfc2231-parser.h"
#include "message-parser.h"
#include "message-header-decode.h"
+#include "message-address.h"
#include "message-decoder.h"
struct message_decoder_context {
} T_END;
buffer_set_used_size(ctx->buf, 0);
- message_header_decode_utf8(hdr->full_value, hdr->full_value_len,
- ctx->buf, ctx->normalizer);
+ if ((ctx->flags & MESSAGE_DECODER_FLAG_RAW_ADDRESS_HEADERS) != 0 &&
+ message_header_is_address(hdr->name)) {
+ /* Pass the raw header value through unchanged so the caller
+ can run message_address_parse() on the original bytes
+ (encoded-words intact) rather than on a string that may
+ contain RFC 5322 special characters after decoding. */
+ buffer_append(ctx->buf, hdr->full_value, hdr->full_value_len);
+ } else {
+ message_header_decode_utf8(hdr->full_value, hdr->full_value_len,
+ ctx->buf, ctx->normalizer);
+ }
value_len = ctx->buf->used;
if (ctx->normalizer != NULL) {
enum message_decoder_flags {
/* Return binary MIME parts as-is without any conversion. */
- MESSAGE_DECODER_FLAG_RETURN_BINARY = 0x02
+ MESSAGE_DECODER_FLAG_RETURN_BINARY = 0x02,
+ /* Don't decode RFC 2047 encoded-words in address headers (From, To,
+ Cc, etc.). The raw header value is passed through unchanged so the
+ caller can feed it to message_address_parse() and then decode the
+ normalised result itself. */
+ MESSAGE_DECODER_FLAG_RAW_ADDRESS_HEADERS = 0x04
};
struct message_block;