String HttpRequest::extractParsingItemsList(String& buf, int startPos, int endPos, char delimChar, char endChar, HashMap<String, String>* resultItems) { int delimItem, nextItem, startItem = startPos; do { delimItem = buf.indexOf("=", startItem); nextItem = buf.indexOf(delimChar, startItem); //debugf("item %i - delim %i - next %i", startItem, delimItem, nextItem); if (nextItem == -1) nextItem = buf.indexOf(endChar, delimItem+1); if (nextItem == -1) nextItem = endPos; if (nextItem > endPos || delimItem == -1) nextItem = endPos; if (delimItem == -1) break; String ItemName = buf.substring(startItem, delimItem); String ItemValue = buf.substring(delimItem+1, nextItem); char* nam = uri_unescape(NULL, 0, ItemName.c_str(), -1); ItemName = nam; free(nam); char* val = uri_unescape(NULL, 0, ItemValue.c_str(), -1); ItemValue = val; free(val); ItemName.trim(); debugf("Item: Name = %s, Size = %d, Value = %s",ItemName.c_str(),ItemValue.length(),ItemValue.substring(0,80).c_str()); (*resultItems)[ItemName] = ItemValue; if (nextItem == endPos) break; startItem = nextItem + 1; } while (nextItem != -1); return tmpbuf.substring(startItem, nextItem); }
static int param_parse_keyval (param_list_t *pl, char *keyval) /* {{{ */ { char *key_raw; char *value_raw; char *key; char *value; key_raw = keyval; value_raw = strchr (key_raw, '='); if (value_raw == NULL) return (EINVAL); *value_raw = 0; value_raw++; key = uri_unescape (key_raw); if (key == NULL) return (ENOMEM); value = uri_unescape (value_raw); if (value == NULL) { free (key); return (ENOMEM); } param_set (pl, key, value); free (key); free (value); return (0); } /* }}} int param_parse_keyval */
bool HttpRequest::extractParsingItemsList(pbuf* buf, int startPos, int endPos, char delimChar, char endChar, HashMap<String, String>* resultItems) { bool continued = false; int delimItem, nextItem, startItem = startPos; while (startItem < endPos) { delimItem = NetUtils::pbufFindStr(buf, "=", startItem); if (delimItem == -1 || delimItem > endPos) break; nextItem = NetUtils::pbufFindChar(buf, delimChar, delimItem + 1); if (nextItem == -1) nextItem = NetUtils::pbufFindChar(buf, endChar, delimItem + 1); if (nextItem > endPos) break; if (nextItem == -1) { nextItem = endPos; continued = true; } String ItemName = NetUtils::pbufStrCopy(buf, startItem, delimItem - startItem); String ItemValue = NetUtils::pbufStrCopy(buf, delimItem + 1, nextItem - delimItem - 1); char* nam = uri_unescape(NULL, 0, ItemName.c_str(), -1); ItemName = nam; free(nam); char* val = uri_unescape(NULL, 0, ItemValue.c_str(), -1); ItemValue = val; free(val); ItemName.trim(); if (!continued) ItemValue.trim(); debugf("Item: Name = %s, Size = %d, Value = %s",ItemName.c_str(),ItemValue.length(),ItemValue.substring(0,80).c_str()); (*resultItems)[ItemName] = ItemValue; startItem = nextItem + 1; } return continued; }
HttpParseResult HttpRequest::parsePostData(HttpServer *server, pbuf* buf) { int start = 0; // First enter if (requestPostParameters == NULL) { int headerEnd = NetUtils::pbufFindStr(buf, "\r\n\r\n"); if (headerEnd == -1) return eHPR_Failed; if (headerEnd + getContentLength() > NETWORK_MAX_HTTP_PARSING_LEN) { debugf("NETWORK_MAX_HTTP_PARSING_LEN"); return eHPR_Failed; } requestPostParameters = new HashMap<String, String>(); start = headerEnd + 4; combinePostFrag = false; } else if (combinePostFrag) { String cur = requestPostParameters->keyAt(requestPostParameters->count() - 1); debugf("Continue POST frag %s", cur.c_str()); int delimItem = NetUtils::pbufFindChar(buf, '&', 0); if (delimItem == -1) delimItem = buf->tot_len; else combinePostFrag = false; String itemValue = NetUtils::pbufStrCopy(buf, 0, delimItem); //debugf("Continue POST len %d", itemValue.length()); char* buf = uri_unescape(NULL, 0, itemValue.c_str(), -1); itemValue = buf; free(buf); (*requestPostParameters)[cur] += itemValue; start = delimItem + 1; postDataProcessed += start; } bool notFinished = extractParsingItemsList(buf, start, buf->tot_len, '&', ' ', requestPostParameters); if (notFinished) combinePostFrag = true; // continue reading this parameter value //TODO: continue for param name postDataProcessed += buf->tot_len - start; if (postDataProcessed == getContentLength()) return eHPR_Successful; else return eHPR_Wait; }
int main(int argc, char *argv[]) { char *tmp; if (argc<2 || argc>3) { printf("Usage:\nuritest uria [urib]\n" "e.g. uritest \"/this/is/a silly<filename>/but/hey\"\n"); exit(-1); } if (argv[2]) { printf("uri_compare: %s with %s: %s\n", argv[1], argv[2], uri_compare(argv[1], argv[2])==0?"true":"false"); } else { printf("Input URI: %s\n", argv[1]); tmp = uri_abspath_escape(argv[1]); printf("Encoded: %s\n", tmp); printf("Decoded: %s\n", uri_unescape(tmp)); } return 0; }