1
0
mirror of https://github.com/godotengine/godot.git synced 2025-12-02 16:48:55 +00:00

[Web] Always return -1 as body length in HTTPClientWeb.

Body length cannot be reliably retrieved from the web.
Reading the "content-length" value will return a meaningless value when
the response is compressed, as reading will return uncompressed chunks
in any case, resulting in a mismatch between the detected body size and
the actual size returned by repeatedly calling read_response_body_chunk.

Additionally, while "content-length" is considered a safe CORS header,
"content-encoding" is not, so using the "content-encoding" to decide if
"content-length" is meaningful is not an option either.

We simply must accept the fact that browsers are awful when it comes to
networking APIs.

(cherry picked from commit f4713d235a)
This commit is contained in:
Fabio Alessandrelli
2023-07-24 08:32:44 +02:00
committed by Yuri Sizov
parent f2c8eea60e
commit 5eabd5e04a
4 changed files with 10 additions and 17 deletions

View File

@@ -50,22 +50,17 @@ const GodotFetch = {
return;
}
let chunked = false;
let bodySize = -1;
response.headers.forEach(function (value, header) {
const v = value.toLowerCase().trim();
const h = header.toLowerCase().trim();
if (h === 'transfer-encoding' && v === 'chunked') {
chunked = true;
}
if (h === 'content-length') {
bodySize = parseInt(v, 10);
}
});
obj.status = response.status;
obj.response = response;
obj.reader = response.body.getReader();
obj.chunked = chunked;
obj.bodySize = bodySize;
},
onerror: function (id, err) {
@@ -87,7 +82,6 @@ const GodotFetch = {
reading: false,
status: 0,
chunks: [],
bodySize: -1,
};
const id = IDHandler.add(obj);
const init = {
@@ -224,15 +218,6 @@ const GodotFetch = {
return p_buf_size - to_read;
},
godot_js_fetch_body_length_get__sig: 'ii',
godot_js_fetch_body_length_get: function (p_id) {
const obj = IDHandler.get(p_id);
if (!obj || !obj.response) {
return -1;
}
return obj.bodySize;
},
godot_js_fetch_is_chunked__sig: 'ii',
godot_js_fetch_is_chunked: function (p_id) {
const obj = IDHandler.get(p_id);