fix: measure GBFS response cap in bytes, not string length (#45)

* fix: measure GBFS response cap in bytes, not string length

The 5 MB cap compared GBFS_MAX_BODY_BYTES against body.length, which is the
string's UTF-16 code-unit count rather than its byte size. Those match for
ASCII but diverge for multi-byte payloads, so a large non-ASCII response
could slip past the cap. Switched to Buffer.byteLength.

Closes #32

* docs(changelog): move the GBFS byte-cap entry into the current Unreleased section

---------

Co-authored-by: Bilawal Sidhu <106619546+bilawalsidhu@users.noreply.github.com>
Co-authored-by: Bilawal Sidhu <bilawal@metaversity.us>
This commit is contained in:
Prajwal Raj 2026-09-01 05:25:17 +05:30 committed by GitHub
parent 6b7bca2913
commit 9db0813daf
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 8 additions and 1 deletions

View File

@ -13,6 +13,13 @@ of current runtime behavior, see [`docs/CURRENT-STATE.md`](docs/CURRENT-STATE.md
global detections while reporting each dropped source twice, once as
successful with its real count and once as failed.
### Security
- GBFS proxy body-size cap now measures the response in bytes
(`Buffer.byteLength`) instead of JavaScript string length, so the
`GBFS_MAX_BODY_BYTES` limit holds for multi-byte payloads and cannot be
overrun by non-ASCII upstream responses.
## [0.1.0] — 2026-08-31 — One-click install, keyless boot, Provider Settings
### Added

View File

@ -3373,7 +3373,7 @@ function gbfsProxy() {
return;
}
const body = await upstream.text();
if (body.length > GBFS_MAX_BODY_BYTES) {
if (Buffer.byteLength(body, 'utf8') > GBFS_MAX_BODY_BYTES) {
res.writeHead(502, { 'Content-Type': 'application/json', 'Cache-Control': 'no-store' });
res.end(JSON.stringify({ error: 'GBFS upstream response too large' }));
return;