Files
CoreUtils/CGIFormattedData.cpp
Brad ArantandClaude Sonnet 5 94d4a30e88 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>
2026-08-22 21:37:10 -07:00

37 lines
862 B
C++

#include "CGIFormattedData.h"
#include "ZString.h"
namespace coreutils {
CGIFormattedData::CGIFormattedData() {}
CGIFormattedData::CGIFormattedData(ZString cgiData) {
parse(cgiData);
}
CGIFormattedData::CGIFormattedData(ZString cgiData, ZString delimiter) : delimiter(delimiter) {
parse(cgiData);
}
void CGIFormattedData::setDelimiter(ZString delimiter) {
this->delimiter = delimiter;
}
void CGIFormattedData::parse(ZString cgiData) {
if(cgiData != "") {
cgiData.split(delimiter);
for(int ix = 0; ix < cgiData.getList().size(); ++ix) {
ZString pair = cgiData[ix].trim();
pair.split("=");
data[pair[0]] = pair[1];
data[pair[0]] = data[pair[0]].fromCGI();
}
}
}
ZString CGIFormattedData::operator=(ZString cgiData) {
parse(cgiData);
return cgiData;
}
}