#include "./ProtocolRPCRQ.hpp" #include <stdlib.h> #include <stdio.h> #include <signal.h> #include <setjmp.h> #include <iostream> #include <fstream> #include <base/ProtocolConfig.hpp> #include <base/ProcessingState.hpp> #include <utils/LogHelper.hpp> using namespace rum::public_sdk; sigjmp_buf mark; void segfault_sigaction(int signal) { ; } RPCRQProcessor::RPCRQProcessor( const char* name, IProtocolProcessor* next ) : ProtocolProcessorBase( name, next, "protocols.RPCRQProcessor" ) { } void RPCRQProcessor::initialize( const ProtocolConfig& config ) { ; } /*override*/ void RPCRQProcessor::process( ProtocolEvent& event, ProcessingState& ps, ProcessingMode mode ) { bool isParsed; try { if (mode != PROCESSING_FULL ) { forwardToNextProcessor( event, ps, mode); return; } EventParsingContext eventContext( event ); isParsed = doAllParsingWork( ps.getRequest(), ps.getResponse(), eventContext); if (isParsed) { forwardToNextProcessor(event, ps, mode); } else return; } catch (...) { LOG4PROBE_ERROR( getDefaultLogger(), "logger1"); } } String RPCRQProcessor::search_substring(String data, String start, String stop) { String empty = ""; try { size_t start_pos = data.find(start); if (start_pos!=std::string::npos) data = data.substr(start_pos+start.length()); size_t stop_pos = data.find(stop); if (stop_pos!=std::string::npos) data = data.substr(0,stop_pos); if (data.find("xmlns")!=std::string::npos) return empty; if ((start_pos==std::string::npos) || (stop_pos==std::string::npos)) return empty; else return data; } catch (...) {return empty;} } String RPCRQProcessor::stream_to_string(DataStream& stream,int offset) { String rumstring = ""; String empty = ""; int i = 0; try { while ( (!stream.eof()) && (i<10000)) { i++; if (stream.peek()!=0xff) { unsigned char value = stream.get(); if ((value!=0) && (value!=0xff)) rumstring += value; } else { stream.skip(1); } } } catch (...) {return empty;} if (rumstring.length()>offset) return rumstring.substr(offset); else return empty; } bool RPCRQProcessor::doAllParsingWork( DataStream& request, DataStream& response, EventParsingContext &context ) { try { rum::public_sdk::ActionInfo iactionInfo = context.getActionInfo(); String schema = " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">"; String strdata = stream_to_string(request,45); String message = search_substring(strdata,"<message type=\"RPC_","</message>"); if (message!="") { String msgType = search_substring(strdata,"<message type=\"","\">"); String origMsgID = search_substring(message,"<origMsgID>","</origMsgID>"); if (origMsgID=="") origMsgID = search_substring(message,"<origMsgID"+schema,"</origMsgID>"); String origSysID = search_substring(message,"<origSysID>","</origSysID>"); if (origSysID=="") origSysID = search_substring(message,"<origSysID"+schema,"</origSysID>"); String targSysID = search_substring(message,"<targSysID>","</targSysID>"); if (targSysID=="") targSysID = search_substring(message,"<targSysID"+schema,"</targSysID>"); String origPrcID = search_substring(message,"<origPrcID>","</origPrcID>"); if (origPrcID=="") origPrcID = search_substring(message,"<origPrcID"+schema,"</origPrcID>"); String timeStamp = search_substring(message,"<timeStamp>","</timeStamp>"); if (timeStamp=="") timeStamp = search_substring(message,"<timeStamp"+schema,"</timeStamp>"); String CmdName = search_substring(message,"<command name=\"","\">"); if (CmdName=="") CmdName = "PARSING_ERROR"; iactionInfo.addKeyValue("msgType" , msgType , false ); iactionInfo.addKeyValue("origMsgID", origMsgID, false ); iactionInfo.addKeyValue("origSysID", origSysID, false ); iactionInfo.addKeyValue("targSysID", targSysID, false ); iactionInfo.addKeyValue("origPrcID", origPrcID, false ); iactionInfo.addKeyValue("timeStamp", timeStamp, false ); iactionInfo.addKeyValue("CmdName" , CmdName, false ); iactionInfo.addKeyValue("x-action-descriptor" , CmdName, false ); iactionInfo.setDescriptor(CmdName); String respstrdata = stream_to_string(response,45); String resmessage = search_substring(respstrdata,"<message type=\"RPC_","</message>"); if (resmessage!="") { String retCode = search_substring(resmessage,"<retCode>","</retCode>"); if (retCode!="") { iactionInfo.addKeyValue("retCode" , retCode, false ); if (retCode.find("OK") != std::string::npos) { context.getEvent().setStatusCode(0); } else context.getEvent().setStatusCode(1); } else { iactionInfo.addKeyValue("retCode" , "NOTFOUND", false ); context.getEvent().setStatusCode(2); } } } if (message=="") return false; else return true; } catch (...) { LOG4PROBE_ERROR( getDefaultLogger(), "exception in RPCRQProcessor" ); context.getEvent().setStatusCode(3); } } ////////////////////////////////////////////////////////////// // class MyProtocolParser::EventParsingContext ////////////////////////////////////////////////////////////// RPCRQProcessor::EventParsingContext::EventParsingContext( ProtocolEvent& event ) : _event(event) { try { _connectionContext = _event.getSessionContext(); if ( NULL == _connectionContext.get() ) { _connectionContext = new ConnectionInfo(); _event.setSessionContext( _connectionContext.get() ); } } catch (...) { std::ofstream fileSTRINGTEST; fileSTRINGTEST.open("/home/rum/fileSTRINGTEST_error2.out",std::ios::out|std::ios::app|std::ios::binary); fileSTRINGTEST << "--------------------------------\n"; fileSTRINGTEST.close(); } } // Declaring Factory for creating processor RUM_PROBE_EXPORT_PROCESSOR( RPCRQProcessor, getRPCRQProcessor);