Fix CGI form/cookie data handling and CGI URL encode/decode

- CGIFormData: fix broken setSize()+read() double-length bug that
  corrupted every parsed body with a leading run of garbage bytes
  (setSize(contentLength) pre-set length before read()/write()
  appended on top of it); switch content-type checks from exact
  equality to startsWith() since a real multipart Content-Type
  always carries a boundary= parameter; implement the previously
  empty multipart/form-data branch (ordinary fields only, file
  uploads deferred to a separate upload mechanism per TODO.txt);
  restore operator[] real lookup logic (was hardcoded to echo the
  key back); default-initialize formdata to NULL; fix mismatched
  include guard (leftover from an IMFFormData.h copy-paste); drop
  the unused IMFHeader.h include that pulled in a broken,
  unrelated StreamReader.h dependency.
- CGIFormattedData: parameterize the split delimiter (was hardcoded
  to &, which silently broke cookie parsing since HTTP_COOKIE uses
  ; not &) and trim whitespace on each split token.
- MString::toCGI()/fromCGI(): were unimplemented stubs (always
  returned an empty string); implemented proper CGI percent-encode
  / percent-decode + space plus-encoding, and fixed the one caller
  that discarded fromCGIs return value instead of using it.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Brad ArantandClaude Sonnet 5 committed 2026-08-22 21:37:10 -07:00
1 parent 28feaff3d7
commit 94d4a30e88
5 files changed
+121 -34

No files matched your search

+46 -2
View File
@@ -432,13 +432,57 @@ namespace coreutils {
MString MString::toCGI() {
push();
reset();
MString target;
while(!eod()) {
char ch = nextChar();
if(ch == ' ') {
target.write('+');
} else if(isalnum((unsigned char)ch) || ch == '-' || ch == '_' || ch == '.' || ch == '~') {
target.write(ch);
} else {
target.write('%');
target.write(hexChar((ch >> 4) & 15));
target.write(hexChar(ch & 15));
}
}
pop();
return target;
}
MString MString::fromCGI() {
push();
reset();
MString target;
while(!eod()) {
char ch = nextChar();
if(ch == '+') {
target.write(' ');
} else if(ch == '%' && !eod()) {
char ch1 = nextChar();
ch1 -= 48;
if(ch1 > 9)
ch1 -= 7;
ch1 <<= 4;
ch1 &= 240;
if(!eod()) {
char ch2 = nextChar();
ch2 -= 48;
if(ch2 > 9)
ch2 -= 7;
ch2 &= 15;
ch1 |= ch2;
target.write(ch1);
} else {
target.write(ch1);
}
} else {
target.write(ch);
}
}
pop();
return target;
}