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; }
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; } }
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; }
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; }