예제 #1
0
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);

}
예제 #2
0
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 */
예제 #3
0
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;
}
예제 #4
0
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;
}
예제 #5
0
파일: uri.c 프로젝트: lb1a/avfs
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;
}