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:
1 parent
28feaff3d7
commit
94d4a30e88
5 files changed
+121
-34
No files matched your search
+46
-2
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user