Example #1
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;
}
Example #2
0
HttpParseResult HttpRequest::parsePostData(HttpServer *server, pbuf* buf)
{
	int start = 0;
	tmpbuf += NetUtils::pbufStrCopy(buf, 0, buf->tot_len);
	// 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;
		tmpbuf = tmpbuf.substring(start, tmpbuf.length());
	}

	//parse if it is FormUrlEncoded - otherwise keep in buffer
	String contType = getContentType();
	contType.toLowerCase();
	if (contType.indexOf(ContentType::FormUrlEncoded) != -1)
	{
		tmpbuf = extractParsingItemsList(tmpbuf, 0, tmpbuf.length(), '&', ' ', requestPostParameters);
	}

	postDataProcessed += buf->tot_len - start ;

	if (postDataProcessed == getContentLength())
	{
		return eHPR_Successful;
	}
	else if (postDataProcessed > getContentLength())
	{
		//avoid bufferoverflow if client announces non-correct content-length
		debugf("NETWORK_MAX_HTTP_PARSING_LEN");
		return eHPR_Failed;
	}
	else
	{
		return eHPR_Wait;
	}
}
Example #3
0
HttpParseResult HttpRequest::parseHeader(HttpServer *server, pbuf* buf)
{
	int headerEnd = NetUtils::pbufFindStr(buf, "\r\n\r\n");
	if (headerEnd > NETWORK_MAX_HTTP_PARSING_LEN || headerDataProcessed > NETWORK_MAX_HTTP_PARSING_LEN \
		|| (headerEnd != -1 && buf->tot_len > NETWORK_MAX_HTTP_PARSING_LEN))
	{
		debugf("NETWORK_MAX_HTTP_PARSING_LEN");
		return eHPR_Failed;
	}
	int urlEnd = 0;
	tmpbuf += NetUtils::pbufStrCopy(buf, 0, buf->tot_len);
	if (requestHeaders == NULL) {
		// first time calling header
		requestHeaders = new HashMap<String, String>();

		int urlStart = tmpbuf.indexOf(" ")+1;
		urlEnd = tmpbuf.indexOf(" ", urlStart);
		if (urlStart == 0 || urlEnd == -1)
		{
			debugf("!BadRequest");
			return eHPR_Failed;
		}

		method = tmpbuf.substring(0, urlStart-1);
		int urlParamsStart = tmpbuf.indexOf("?", urlStart);
		if (urlParamsStart != -1 && urlParamsStart < urlEnd)
		{
			path = tmpbuf.substring(urlStart, urlParamsStart);
			if (requestGetParameters == NULL) requestGetParameters = new HashMap<String, String>();
			extractParsingItemsList(tmpbuf, urlParamsStart + 1, urlEnd, '&', ' ', requestGetParameters);
		}
		else
			path = tmpbuf.substring(urlStart, urlEnd);
		debugf("path=%s", path.c_str());
		urlEnd = tmpbuf.indexOf("\r\n", urlEnd)+2;
	}

	int line, nextLine;
	line = urlEnd;
	do
	{

		nextLine = tmpbuf.indexOf("\r\n", line);
		if (nextLine - line > 2)

		{
			int delim = tmpbuf.indexOf(":", line);
			if (delim != -1)
			{
				String name = tmpbuf.substring(line, delim);
				name.toLowerCase();
				if (server->isHeaderProcessingEnabled(name))
				{
					debugf("Name: %s", name.c_str());
					if (name == "cookie")
					{
						if (cookies == NULL) cookies = new HashMap<String, String>();
						extractParsingItemsList(tmpbuf, delim + 1, nextLine, ';', '\r', cookies);
					}
					else
					{
						String value = tmpbuf.substring(delim + 1, nextLine);
						value.trim();
						(*requestHeaders)[name] = value;
						debugf("%s === %s", name.c_str(), value.c_str());
					}

				}
			}

		}
		if (nextLine != -1) {
			line = nextLine + 2;
		}

	} while(nextLine != -1);

	if (headerEnd != -1)
	{
		tmpbuf = "";
		debugf("parsed");
		return eHPR_Successful;
	}
	headerDataProcessed += buf->tot_len;
	tmpbuf = tmpbuf.substring(line, buf->tot_len);
	return eHPR_Wait;
}
Example #4
0
HttpParseResult HttpRequest::parseHeader(HttpServer *server, pbuf* buf)
{
	int headerEnd = NetUtils::pbufFindStr(buf, "\r\n\r\n");
	if (headerEnd == -1) return eHPR_Wait;
	if (headerEnd > NETWORK_MAX_HTTP_PARSING_LEN)
	{
		debugf("NETWORK_MAX_HTTP_PARSING_LEN");
		return eHPR_Failed;
	}

	int urlStart = NetUtils::pbufFindChar(buf, ' ') + 1;
	int urlEnd = NetUtils::pbufFindChar(buf, ' ', urlStart);
	if (urlStart == 0 || urlEnd == -1)
	{
		debugf("!BadRequest");
		return eHPR_Failed;
	}
	method = NetUtils::pbufStrCopy(buf, 0, urlStart - 1);

	int urlParamsStart = NetUtils::pbufFindChar(buf, '?', urlStart);
	if (urlParamsStart != -1 && urlParamsStart < urlEnd)
	{
		path = NetUtils::pbufStrCopy(buf, urlStart, urlParamsStart - urlStart);
		if (requestGetParameters == NULL) requestGetParameters = new HashMap<String, String>();
		extractParsingItemsList(buf, urlParamsStart + 1, urlEnd, '&', ' ', requestGetParameters);
	}
	else
		path = NetUtils::pbufStrCopy(buf, urlStart, urlEnd - urlStart);
	debugf("path=%s", path.c_str());

	int line, nextLine;
	line = NetUtils::pbufFindStr(buf, "\r\n", urlEnd)  + 2;
	do
	{
		nextLine = NetUtils::pbufFindStr(buf, "\r\n", line);
		if (nextLine - line > 2)
		{
			int delim = NetUtils::pbufFindStr(buf, ":", line);
			if (delim != -1)
			{
				String name = NetUtils::pbufStrCopy(buf, line, delim - line);
				if (server->isHeaderProcessingEnabled(name))
				{
					if (name == "Cookie")
					{
						if (cookies == NULL) cookies = new HashMap<String, String>();
						extractParsingItemsList(buf, delim + 1, nextLine, ';', '\r', cookies);
					}
					else
					{
						String value = NetUtils::pbufStrCopy(buf, delim + 1, nextLine - (delim + 1));
						value.trim();
						if (requestHeaders == NULL) requestHeaders = new HashMap<String, String>();
						(*requestHeaders)[name] = value;
						debugf("%s === %s", name.c_str(), value.c_str());
					}
				}
			}
		}
		line = nextLine + 2;
	} while(nextLine != -1);

	if (headerEnd != -1)
	{
		debugf("parsed");
		return eHPR_Successful;
	}
	return eHPR_Wait;
}