Skip to content

Commit 9ea48dd

Browse files
committed
fixup! fix(formData): Stop encoding values to calculate length
1 parent e3ab659 commit 9ea48dd

File tree

1 file changed

+25
-36
lines changed

1 file changed

+25
-36
lines changed

builtins/web/form-data/form-data-encoder.cpp

Lines changed: 25 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -23,24 +23,33 @@ const char LF = '\n';
2323
const char CR = '\r';
2424
const char *CRLF = "\r\n";
2525

26-
// Computes the length of a string after normalizing its newlines.
27-
// Converts CR, LF, and CRLF into a CRLF sequence.
28-
size_t compute_normalized_len(std::string_view src) {
29-
size_t len = 0;
30-
31-
for (size_t i = 0; i < src.size(); i++) {
32-
if (src[i] == CR) {
33-
if (i + 1 < src.size() && src[i + 1] == LF) {
34-
i++;
26+
template<typename CH>
27+
size_t compute_extra_characters(CH *chars, size_t len) {
28+
size_t extra = 0;
29+
for (size_t i = 0; i < len; i++) {
30+
auto ch = chars[i];
31+
if (ch == CR) {
32+
if (i + 1 < len) {
33+
char16_t next = chars[i + 1];
34+
if (next == LF) {
35+
i += 1;
36+
// the character is already accounted for
37+
continue;
38+
}
3539
}
36-
len += 2; // CRLF
37-
} else if (src[i] == LF) {
38-
len += 2; // CRLF
39-
} else {
40-
len += 1;
40+
extra += 1;
41+
} else if (ch == LF) {
42+
extra += 1;
4143
}
4244
}
45+
return extra;
46+
}
4347

48+
// Computes the length of a string after normalizing its newlines.
49+
// Converts CR, LF, and CRLF into a CRLF sequence.
50+
size_t compute_normalized_len(std::string_view src) {
51+
size_t len = src.size();
52+
len += compute_extra_characters(src.data(), len);
4453
return len;
4554
}
4655

@@ -49,26 +58,6 @@ std::optional<size_t> compute_unencoded_normalized_len(JSContext *cx, JS::Handle
4958
if (!linear) {
5059
return std::nullopt;
5160
}
52-
auto extra_bytes_needed = [](const auto *chars, const auto len) {
53-
size_t extra = 0;
54-
for (size_t i = 0; i < len; i++) {
55-
auto ch = chars[i];
56-
if (ch == CR) {
57-
if (i+1 < len) {
58-
char16_t next = chars[i+1];
59-
if (next == LF) {
60-
i += 1;
61-
// the character is already accounted for
62-
continue;
63-
}
64-
}
65-
extra += 1;
66-
} else if (ch == LF) {
67-
extra += 1;
68-
}
69-
}
70-
return extra;
71-
};
7261
auto len = JS::GetDeflatedUTF8StringLength(linear);
7362
size_t chars_len = JS::GetLinearStringLength(linear);
7463
JS::AutoCheckCannotGC nogc;
@@ -77,13 +66,13 @@ std::optional<size_t> compute_unencoded_normalized_len(JSContext *cx, JS::Handle
7766
if (!chars) {
7867
return std::nullopt;
7968
}
80-
len += extra_bytes_needed(chars, chars_len);
69+
len += compute_extra_characters(chars, chars_len);
8170
} else {
8271
auto chars = JS::GetTwoByteLinearStringChars(nogc, linear);
8372
if (!chars) {
8473
return std::nullopt;
8574
}
86-
len += extra_bytes_needed(chars, chars_len);
75+
len += compute_extra_characters(chars, chars_len);
8776
}
8877
return len;
8978
}

0 commit comments

Comments
 (0)