int Parser(clientSock *client,requestLine *argu) { char cmpletReq[BUF_SIZE]; if(bufParse(client,argu,cmpletReq)==1) { if( (cmpletReq != NULL) && argu->status != 411) { httpParser(cmpletReq,argu); } return 1; } else{ return 0; } }
void CheckHttpContent::CheckImpl(const char *address, const XML::CXML & parameters, XML::CXML & results, StatusNotifyClient *statusNotifyClient) { const XML::CXML *xmlSocket = parameters.FindFirstChild("Socket"); if (xmlSocket == 0) throw CheckMethodError("Must supply socket information"); std::auto_ptr<HttpSocket> sock = HttpSocketFactory::Instance().CreateObject(*this, *xmlSocket); if (ShouldAbort()) return; if (statusNotifyClient) statusNotifyClient->SetStatus("Connecting"); int res = sock->Connect(address); if (res != 0) throw CheckMethodError("Cannot connect"); if (ShouldAbort()) return; if (statusNotifyClient) statusNotifyClient->SetStatus("Sending request"); std::string request = sock->CreateRequest(address, HttpSocket::get); if (sock->Send(request) != request.length()) throw CheckMethodError("Cannot send request completely"); if (ShouldAbort()) return; if (statusNotifyClient) statusNotifyClient->SetStatus("Receiving data"); std::string data = sock->Receive(); if (ShouldAbort()) return; if (data.empty()) throw CheckMethodError("Receive returned with no data"); if (statusNotifyClient) statusNotifyClient->SetStatus("Processing data"); Util::HttpParser httpParser(data); WEBWATCH_CHECKHTTPMETHOD_PERFORM_HEADER_CHECK(httpParser); std::string content = httpParser.GetContent(); Filter(content, parameters); const XML::CXML *mode = parameters.FindFirstChild("Mode"); if (mode) { const char *type = mode->GetParamText("Type"); if (strcmp(type, "GetContent") == 0) { std::string xmlContent = XML::MultilineToXML(content); results.CreateChild("Content", xmlContent.c_str()); } } // cout << content << endl; if (ShouldAbort()) return; const XML::CXML *xmlRegex = parameters.FindFirstChild("Regex"); if (xmlRegex) { while (xmlRegex) { const char *expression = xmlRegex->GetText(); if (!*expression) throw CheckMethodError("No regular expression text specified in Regex field in parameters"); SearchRegex(content, expression, results); xmlRegex = parameters.FindNextChild("Regex"); } } else { unsigned char digest[SHA1_SIGNATURE_LENGTH]; SHA1_CTX sha1; SHA1Init(&sha1); SHA1Update(&sha1, content.c_str(), static_cast<int>(content.length())); SHA1Final(digest, &sha1); XML::CXML *xmlHash = results.CreateChild("Hash"); xmlHash->SetParam("Type", "SHA1"); std::string hash; for (int i = 0; i < SHA1_SIGNATURE_LENGTH; i++) { char digit[8]; std::sprintf(digit, "%02X", digest[i]); hash += digit; } xmlHash->SetText(hash.c_str()); } }