-
- // We have the headers; parse them all
- std::string::size_type hbegin = 0, hend;
- while ((hend = reqbuffer.find("\r\n", hbegin)) != std::string::npos)
- {
- if (hbegin == hend)
- break;
-
- if (request_type.empty())
- {
- std::istringstream cheader(std::string(reqbuffer, hbegin, hend - hbegin));
- cheader >> request_type;
- cheader >> uri;
- cheader >> http_version;
-
- if (request_type.empty() || uri.empty() || http_version.empty())
- {
- SendHTTPError(400);
- return;
- }
-
- hbegin = hend + 2;
- continue;
- }
-
- std::string cheader = reqbuffer.substr(hbegin, hend - hbegin);
-
- std::string::size_type fieldsep = cheader.find(':');
- if ((fieldsep == std::string::npos) || (fieldsep == 0) || (fieldsep == cheader.length() - 1))
- {
- SendHTTPError(400);
- return;
- }
-
- headers.SetHeader(cheader.substr(0, fieldsep), cheader.substr(fieldsep + 2));
-
- hbegin = hend + 2;
- }
-
- reqbuffer.erase(0, reqend + 4);
-
- std::transform(request_type.begin(), request_type.end(), request_type.begin(), ::toupper);
- std::transform(http_version.begin(), http_version.end(), http_version.begin(), ::toupper);
-
- if ((http_version != "HTTP/1.1") && (http_version != "HTTP/1.0"))
- {
- SendHTTPError(505);
- return;
- }
-
- if (headers.IsSet("Content-Length") && (postsize = ConvToInt(headers.GetHeader("Content-Length"))) > 0)
- {
- InternalState = HTTP_SERVE_RECV_POSTDATA;
-
- if (reqbuffer.length() >= postsize)
- {
- postdata = reqbuffer.substr(0, postsize);
- reqbuffer.erase(0, postsize);
- }
- else if (!reqbuffer.empty())
- {
- postdata = reqbuffer;
- reqbuffer.clear();
- }
-
- if (postdata.length() >= postsize)
- ServeData();
-
- return;
- }
-
- ServeData();