1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 02:07:35 +00:00

LibIMAP: Simplify parsing one part body structure

Each branch was very similar, so let's merge common parts together for
clarity. Also added corresponding ABNF rules names while I'm here. :^)

No behavior change.
This commit is contained in:
Karol Kosek 2023-09-02 20:44:33 +02:00 committed by Andrew Kaster
parent 2eb9f3f639
commit a61a66c685

View file

@ -423,37 +423,35 @@ BodyStructure Parser::parse_body_structure()
return parse_one_part_body(); return parse_one_part_body();
} }
} }
// body-type-1part
BodyStructure Parser::parse_one_part_body() BodyStructure Parser::parse_one_part_body()
{ {
auto type = parse_string(); // NOTE: We share common parts between body-type-basic, body-type-msg and body-type-text types for readability.
consume(" "sv); BodyStructureData data;
auto subtype = parse_string();
consume(" "sv);
if (type.equals_ignoring_ascii_case("TEXT"sv)) {
// body-type-text
auto params = parse_body_fields_params();
consume(" "sv);
auto id = parse_nstring();
consume(" "sv);
auto description = parse_nstring();
consume(" "sv);
auto encoding = parse_string();
consume(" "sv);
auto num_octets = MUST(parse_number());
consume(" "sv);
auto num_lines = MUST(parse_number());
auto data = BodyStructureData { // media-basic / media-message / media-text
type, data.type = parse_string();
subtype, consume(" "sv);
Optional<DeprecatedString>(move(id)), data.subtype = parse_string();
Optional<DeprecatedString>(move(description)), consume(" "sv);
encoding,
params, // body-fields
num_octets, data.fields = parse_body_fields_params();
num_lines, consume(" "sv);
{} data.id = Optional<DeprecatedString>(parse_nstring());
}; consume(" "sv);
data.desc = Optional<DeprecatedString>(parse_nstring());
consume(" "sv);
data.encoding = parse_string();
consume(" "sv);
data.bytes = MUST(parse_number());
if (data.type.equals_ignoring_ascii_case("TEXT"sv)) {
// body-type-text
// NOTE: "media-text SP body-fields" part is already parsed.
consume(" "sv);
data.lines = MUST(parse_number());
if (!try_consume(")"sv)) { if (!try_consume(")"sv)) {
consume(" "sv); consume(" "sv);
@ -489,62 +487,17 @@ BodyStructure Parser::parse_one_part_body()
} }
} }
} }
} else if (data.type.equals_ignoring_ascii_case("MESSAGE"sv) && data.subtype.equals_ignoring_ascii_case("RFC822"sv)) {
return BodyStructure(move(data)); // body-type-msg
} else if (type.equals_ignoring_ascii_case("MESSAGE"sv) && subtype.equals_ignoring_ascii_case("RFC822"sv)) { // NOTE: "media-message SP body-fields" part is already parsed.
// body-type-message
auto params = parse_body_fields_params();
consume(" "sv); consume(" "sv);
auto id = parse_nstring(); data.envelope = parse_envelope();
consume(" "sv);
auto description = parse_nstring();
consume(" "sv);
auto encoding = parse_string();
consume(" "sv);
auto num_octets = MUST(parse_number());
consume(" "sv);
auto envelope = parse_envelope();
BodyStructureData data {
type,
subtype,
Optional<DeprecatedString>(move(id)),
Optional<DeprecatedString>(move(description)),
encoding,
params,
num_octets,
0,
envelope
};
return BodyStructure(move(data));
} else { } else {
// body-type-basic // body-type-basic
auto params = parse_body_fields_params(); // NOTE: "media-basic SP body-fields" is already parsed.
consume(" "sv);
auto id = parse_nstring();
consume(" "sv);
auto description = parse_nstring();
consume(" "sv);
auto encoding = parse_string();
consume(" "sv);
auto num_octets = MUST(parse_number());
consume(" "sv);
BodyStructureData data {
type,
subtype,
Optional<DeprecatedString>(move(id)),
Optional<DeprecatedString>(move(description)),
encoding,
params,
num_octets,
0,
{}
};
return BodyStructure(move(data));
} }
return BodyStructure(move(data));
} }
Vector<DeprecatedString> Parser::parse_langs() Vector<DeprecatedString> Parser::parse_langs()
{ {