// . parse cgi fields contained in s // . s points to the stuff immediately after the ? // . we should have already replaced all &'s in s with /0's // . we also replace the last \r with a \0 void HttpRequest::parseFields ( char *s , int32_t slen ) { // . are we a multipart/form-data? // . many of form tags for event submission forms are this // <form enctype="multipart/form-data" ...> char *cd = strncasestr ( s , "\r\nContent-Disposition:", slen ); if ( cd ) { parseFieldsMultipart ( s , slen ); return; } // should be NULL terminated since we replaced &'s w/ 0's in set() char *send = s + slen ; // reset field count int32_t n = m_numFields; while ( s && s < send ) { // watch out for overflow if ( n >= MAX_CGI_PARMS ) { log("http: Received more than %" PRId32" CGI parms. " "Truncating.",(int32_t)MAX_CGI_PARMS); break; } // set the nth field name in this cgi string m_fields [ n ] = s; // point to = sign char *equal = strchr ( s , '=' ); // try next field if none here if ( ! equal ) { s += strlen ( s ) + 1; continue; } // if no equal sign, maybe it is one of diffbot's valueless // fields, so support that now if ( ! equal ) { // just set value to NULL char *end = strchr(s,'&'); int32_t len = end - s; if ( ! end ) len = strlen(s); m_fieldLens[n] = len; s[len] = '\0'; m_fieldValues[n] = NULL; n++; // skip over the '&' too s += len + 1; continue; } // set field len m_fieldLens [ n ] = equal - s; // set = to \0 so getField() returns NULL terminated field name *equal = '\0'; // set value (may be \0) m_fieldValues [ n ] = equal + 1; // count the number of field/value pairs we get n++; // skip: // point to next field s = equal + 1 + strlen ( equal + 1 ) + 1 ; } m_numFields = n; }
// . parse cgi fields contained in s // . s points to the stuff immediately after the ? // . we should have already replaced all &'s in s with /0's // . we also replace the last \r with a \0 void HttpRequest::parseFields ( char *s , long slen ) { // . are we a multipart/form-data? // . many of form tags for event submission forms are this // <form enctype="multipart/form-data" ...> char *cd = strncasestr ( s , "\r\nContent-Disposition:", slen ); if ( cd ) { parseFieldsMultipart ( s , slen ); return; } // should be NULL terminated since we replaced &'s w/ 0's in set() char *send = s + slen ; // reset field count long n = m_numFields; while ( s && s < send ) { // watch out for overflow if ( n >= MAX_CGI_PARMS ) { log("http: Received more than %li CGI parms. " "Truncating.",(long)MAX_CGI_PARMS); break; } // set the nth field name in this cgi string m_fields [ n ] = s; // point to = sign char *equal = strchr ( s , '=' ); // try next field if none here if ( ! equal ) { s += gbstrlen ( s ) + 1; continue; } // set field len m_fieldLens [ n ] = equal - s; // set = to \0 so getField() returns NULL terminated field name *equal = '\0'; // set value (may be \0) m_fieldValues [ n ] = equal + 1; // count the number of field/value pairs we get n++; // skip: // point to next field s = equal + 1 + gbstrlen ( equal + 1 ) + 1 ; } m_numFields = n; }