bool Inventory::Send(const char* serverUrl) { HTTP httpObject; // Send Prolog std::cerr << "Inventory::Send(): Prolog... "; tinyxml2::XMLDocument prolog; _WriteProlog(prolog); char* prologData = NULL; size_t prologLength = 0; if (!XML::Compress(prolog, prologData, prologLength)) { std::cerr << "error compressing prolog XML" << std::endl; return false; } std::string inventoryUrl(serverUrl); HTTPRequestHeader requestHeader; requestHeader.SetRequest("POST", inventoryUrl); requestHeader.SetValue("Pragma", "no-cache"); requestHeader.SetValue("Keep-Alive", "300"); requestHeader.SetValue("Connection", "Keep-Alive, TE"); requestHeader.SetValue("TE", "deflate, gzip"); requestHeader.SetContentType("application/x-compress"); requestHeader.SetContentLength(prologLength); requestHeader.SetUserAgent(USER_AGENT); if (httpObject.Request(requestHeader, prologData, prologLength) != 0) { delete[] prologData; std::cerr << "cannot send prolog: "; std::cerr << httpObject.ErrorString() << std::endl; return false; } delete[] prologData; std::cerr << "OK!" << std::endl; std::cerr << "Inventory::Send(): waiting for server response... "; const HTTPResponseHeader& responseHeader = httpObject.LastResponse(); if (responseHeader.StatusCode() != HTTP_OK || !responseHeader.HasContentLength()) { std::cout << responseHeader.ToString() << std::endl; return false; } size_t contentLength = ::strtol(responseHeader.Value(HTTPContentLength).c_str(), NULL, 10); char* resultData = new char[contentLength]; if (httpObject.Read(resultData, contentLength) < (int)contentLength) { delete[] resultData; std::cerr << "failed to read XML response: "; std::cerr << httpObject.ErrorString() << std::endl; return false; } std::cerr << "OK!" << std::endl; std::cerr << "Inventory::Send(): Decompressing XML... "; tinyxml2::XMLDocument document; bool uncompress = XML::Uncompress(resultData, contentLength, document); delete[] resultData; if (!uncompress) { std::cerr << "failed to decompress XML" << std::endl; return false; } std::cerr << "OK!" << std::endl; std::string serverResponse = XML::GetTextElementValue(document, "RESPONSE"); std::cerr << "Inventory::Send(): server replied " << serverResponse; if (serverResponse != "SEND") { std::cerr << ": server not ready to accept inventory" << std::endl; return false; } std::cerr << ": OK!" << std::endl; std::cerr << "Inventory::Send(): Compressing XML inventory data... "; char* compressedData = NULL; size_t compressedSize; if (!XML::Compress(*fDocument, compressedData, compressedSize)) { std::cerr << "error compressing inventory XML" << std::endl; return false; } std::cerr << "OK!" << std::endl; std::cerr << "Inventory::Send(): Sending inventory..."; requestHeader.Clear(); requestHeader.SetRequest("POST", inventoryUrl); requestHeader.SetValue("Pragma", "no-cache"); requestHeader.SetValue("Keep-Alive", "300"); requestHeader.SetValue("Connection", "Keep-Alive, TE"); requestHeader.SetValue("TE", "deflate, gzip"); requestHeader.SetContentType("application/x-compress"); requestHeader.SetContentLength(compressedSize); requestHeader.SetUserAgent(USER_AGENT); if (httpObject.Request(requestHeader, compressedData, compressedSize) != 0) { delete[] compressedData; std::cerr << "cannot send inventory: "; std::cerr << httpObject.ErrorString() << std::endl; return false; } std::cerr << "OK!" << std::endl; delete[] compressedData; return true; }