Example #1
0
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;
}