#include "CGIFormData.h" #include "malloc.h" namespace coreutils { CGIFormData::CGIFormData(int fd, ZString contentType, int contentLength, ZString boundary) : contentType(contentType) { if(contentType.startsWith("application/x-www-form-urlencoded")) { read(fd, contentLength); formdata = new CGIFormattedData(*this); } else if(contentType.startsWith("multipart/form-data")) { read(fd, contentLength); formdata = new CGIFormattedData(); MString delimiter; delimiter << "--" << boundary; ZString body(*this); body.split(delimiter); for(int ix = 0; ix < body.getList().size(); ++ix) { ZString part = body[ix]; if(part.getLength() == 0 || part.startsWith("--")) continue; int headerEnd = part.find("\r\n\r\n"); if(headerEnd == -1) continue; ZString headers = part.substring(0, headerEnd); if(headers.find("filename=\"") != -1) // file uploads are out of scope here; handled via a separate upload mechanism. continue; int namePos = headers.find("name=\""); if(namePos == -1) continue; ZString afterName = headers.substring(namePos + 6); int nameEnd = afterName.find("\""); if(nameEnd == -1) continue; ZString name = afterName.substring(0, nameEnd); ZString value = part.substring(headerEnd + 4); value.trimCRLF(); formdata->data[name] = value; } } } MString CGIFormData::operator[](ZString name) { if(formdata == NULL) return MString(); return (*formdata).data[name]; } }