Skip to content

Commit f9bbf08

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

File tree

1 file changed

+62
-36
lines changed

1 file changed

+62
-36
lines changed

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

Lines changed: 62 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -23,52 +23,76 @@ 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;
54+
55+
// for (size_t i = 0; i < src.size(); i++) {
56+
// if (src[i] == CR) {
57+
// if (i + 1 < src.size() && src[i + 1] == LF) {
58+
// i++;
59+
// }
60+
// len += 2; // CRLF
61+
// } else if (src[i] == LF) {
62+
// len += 2; // CRLF
63+
// } else {
64+
// len += 1;
65+
// }
66+
// }
67+
68+
// return len;
4569
}
4670

4771
std::optional<size_t> compute_unencoded_normalized_len(JSContext *cx, JS::HandleString value) {
4872
auto linear = JS_EnsureLinearString(cx, value);
4973
if (!linear) {
5074
return std::nullopt;
5175
}
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-
};
76+
// auto extra_bytes_needed = [](const auto *chars, const auto len) {
77+
// size_t extra = 0;
78+
// for (size_t i = 0; i < len; i++) {
79+
// auto ch = chars[i];
80+
// if (ch == CR) {
81+
// if (i+1 < len) {
82+
// char16_t next = chars[i+1];
83+
// if (next == LF) {
84+
// i += 1;
85+
// // the character is already accounted for
86+
// continue;
87+
// }
88+
// }
89+
// extra += 1;
90+
// } else if (ch == LF) {
91+
// extra += 1;
92+
// }
93+
// }
94+
// return extra;
95+
// };
7296
auto len = JS::GetDeflatedUTF8StringLength(linear);
7397
size_t chars_len = JS::GetLinearStringLength(linear);
7498
JS::AutoCheckCannotGC nogc;
@@ -77,13 +101,15 @@ std::optional<size_t> compute_unencoded_normalized_len(JSContext *cx, JS::Handle
77101
if (!chars) {
78102
return std::nullopt;
79103
}
80-
len += extra_bytes_needed(chars, chars_len);
104+
// len += extra_bytes_needed(chars, chars_len);
105+
len += compute_extra_characters(chars, chars_len);
81106
} else {
82107
auto chars = JS::GetTwoByteLinearStringChars(nogc, linear);
83108
if (!chars) {
84109
return std::nullopt;
85110
}
86-
len += extra_bytes_needed(chars, chars_len);
111+
// len += extra_bytes_needed(chars, chars_len);
112+
len += compute_extra_characters(chars, chars_len);
87113
}
88114
return len;
89115
}

0 commit comments

Comments
 (0)