diff options
Diffstat (limited to 'src/uscxml/plugins/ioprocessor/basichttp')
-rw-r--r-- | src/uscxml/plugins/ioprocessor/basichttp/BasicHTTPIOProcessor.cpp | 230 | ||||
-rw-r--r-- | src/uscxml/plugins/ioprocessor/basichttp/BasicHTTPIOProcessor.h | 23 |
2 files changed, 4 insertions, 249 deletions
diff --git a/src/uscxml/plugins/ioprocessor/basichttp/BasicHTTPIOProcessor.cpp b/src/uscxml/plugins/ioprocessor/basichttp/BasicHTTPIOProcessor.cpp index 2f8f0aa..8f3d03e 100644 --- a/src/uscxml/plugins/ioprocessor/basichttp/BasicHTTPIOProcessor.cpp +++ b/src/uscxml/plugins/ioprocessor/basichttp/BasicHTTPIOProcessor.cpp @@ -23,10 +23,6 @@ #include "uscxml/messages/Event.h" #include "uscxml/util/DOM.h" -#include <event2/dns.h> -#include <event2/buffer.h> -#include <event2/keyvalq_struct.h> - #include <string.h> #include "uscxml/interpreter/Logging.h" @@ -62,12 +58,9 @@ bool pluginConnect(pluma::Host& host) { // see http://www.w3.org/TR/scxml/#BasicHTTPEventProcessor BasicHTTPIOProcessor::BasicHTTPIOProcessor() { - HTTPServer::getInstance(); } BasicHTTPIOProcessor::~BasicHTTPIOProcessor() { - HTTPServer* httpServer = HTTPServer::getInstance(); - httpServer->unregisterServlet(this); } @@ -87,231 +80,12 @@ std::shared_ptr<IOProcessorImpl> BasicHTTPIOProcessor::create(IOProcessorCallbac return io; } -Data BasicHTTPIOProcessor::getDataModelVariables() { - Data data; - - // we are not connected! - if(_url.length() == 0) - return data; - - data.compound["location"] = Data(_url, Data::VERBATIM); - - URL url(_url); - data.compound["host"] = Data(url.host(), Data::VERBATIM); - data.compound["port"] = Data(url.port(), Data::VERBATIM); - data.compound["path"] = Data(url.path(), Data::VERBATIM); - data.compound["scheme"] = Data(url.scheme(), Data::VERBATIM); - - std::list<std::string> pathComps = url.pathComponents(); - std::list<std::string>::const_iterator pathCompIter = pathComps.begin(); - while(pathCompIter != pathComps.end()) { - data.compound["pathComponents"].array.push_back(Data(*pathCompIter, Data::VERBATIM)); - pathCompIter++; - } - - return data; -} - bool BasicHTTPIOProcessor::requestFromHTTP(const HTTPServer::Request& req) { - Event event = req; - event.eventType = Event::EXTERNAL; - -// std::cout << req.raw << std::endl; - - /** - * If a single instance of the parameter '_scxmleventname' is present, the - * SCXML Processor must use its value as the name of the SCXML event that it - * raises. - */ - - { - // if we sent ourself an event it will end up here - // this will call the const subscript operator - if (req.data.at("content").hasKey("_scxmleventname")) { - event.name = req.data.at("content").at("_scxmleventname").atom; - } - if (req.data.at("content").hasKey("content")) { - event.data.atom = req.data.at("content").at("content").atom; - } - } - - // if we used wget, it will end up here - unify? - if (req.data.hasKey("content")) { - const Data& data = req.data["content"]; - for(std::map<std::string, Data>::const_iterator compIter = data.compound.begin(); - compIter!= data.compound.end(); compIter++) { - if (compIter->first == "content") { - event.data.atom = compIter->second.atom; - } else { - event.data[compIter->first] = compIter->second; - } - } - } - - if (req.data.hasKey("header")) { - const Data& data = req.data["header"]; - for(std::map<std::string, Data>::const_iterator compIter = data.compound.begin(); - compIter!= data.compound.end(); compIter++) { - if (compIter->first == "_scxmleventname") { - event.name = compIter->second.atom; - } - } - } - - // test 532 - if (event.name.length() == 0) - event.name = "http." + req.data.compound.at("type").atom; - - eventToSCXML(event, USCXML_IOPROC_BASICHTTP_TYPE, _url); + HTTPIOProcessor::requestFromHTTP(req); evhttp_send_reply(req.evhttpReq, 200, "OK", NULL); + getUnansweredRequests().erase(req.getUUID()); return true; } -bool BasicHTTPIOProcessor::isValidTarget(const std::string& target) { - try { - URL url(target); - if (url.scheme().compare("http") != 0) - return false; - - return true; - } catch (ErrorEvent e) { - } - return false; -} - -void BasicHTTPIOProcessor::eventFromSCXML(const std::string& target, const Event& event) { - - // TODO: is this still needed with isValidTarget()? - if (target.length() == 0) { - _callbacks->enqueueInternal(Event("error.communication", Event::PLATFORM)); - return; - } - - bool isLocal = target == _url; - URL targetURL(target); - std::stringstream kvps; - std::string kvpSeperator; - - // event name - if (event.name.size() > 0) { - char* eventNameCStr = evhttp_encode_uri("_scxmleventname"); - char* eventValueCStr = evhttp_encode_uri(event.name.c_str()); - kvps << kvpSeperator << eventNameCStr << "=" << eventValueCStr; - kvpSeperator = "&"; - targetURL.addOutHeader("_scxmleventname", eventValueCStr); - free(eventNameCStr); - free(eventValueCStr); - } - - // event namelist - if (event.namelist.size() > 0) { - std::map<std::string, Data>::const_iterator namelistIter = event.namelist.begin(); - while (namelistIter != event.namelist.end()) { - char* keyCStr = evhttp_encode_uri(namelistIter->first.c_str()); - // this is simplified - Data might be more elaborate than a simple string atom - char* valueCStr = evhttp_encode_uri(namelistIter->second.atom.c_str()); - kvps << kvpSeperator << keyCStr << "=" << valueCStr; - free(keyCStr); - free(valueCStr); - kvpSeperator = "&"; - targetURL.addOutHeader(namelistIter->first, namelistIter->second); - namelistIter++; - } - } - - // event params - if (event.params.size() > 0) { - std::multimap<std::string, Data>::const_iterator paramIter = event.params.begin(); - while (paramIter != event.params.end()) { - char* keyCStr = evhttp_encode_uri(paramIter->first.c_str()); - // this is simplified - Data might be more elaborate than a simple string atom - char* valueCStr = evhttp_encode_uri(paramIter->second.atom.c_str()); - kvps << kvpSeperator << keyCStr << "=" << valueCStr; - free(keyCStr); - free(valueCStr); - kvpSeperator = "&"; - targetURL.addOutHeader(paramIter->first, paramIter->second); - paramIter++; - } - } - - // try hard to find actual content - char* keyCStr = evhttp_encode_uri("content"); - if (!event.data.empty()) { - char* valueCStr = NULL; - if (event.data.atom.length() || event.data.array.size() || event.data.compound.size()) { - valueCStr = evhttp_encode_uri(Data::toJSON(event.data).c_str()); - } else if(event.data.node) { - std::stringstream xmlStream; - xmlStream << event.data.node; - valueCStr = evhttp_encode_uri(xmlStream.str().c_str()); - } else if(event.data.binary) { - valueCStr = evhttp_encode_uri(event.data.binary.base64().c_str()); - } - if (valueCStr != NULL) { - kvps << kvpSeperator << keyCStr << "=" << valueCStr; - free(valueCStr); - kvpSeperator = "&"; - } - } - free(keyCStr); - - targetURL.setOutContent(kvps.str()); - targetURL.addOutHeader("Content-Type", "application/x-www-form-urlencoded"); - - targetURL.setRequestType(URLRequestType::POST); - targetURL.addMonitor(this); - - _sendRequests[event.sendid] = std::make_pair(targetURL, event); - if (isLocal) { - // test201 use a blocking request with local communication - targetURL.download(true); - } else { - URLFetcher::fetchURL(targetURL); - } -} - -void BasicHTTPIOProcessor::downloadStarted(const URL& url) {} - -void BasicHTTPIOProcessor::downloadCompleted(const URL& url) { - std::map<std::string, std::pair<URL, Event> >::iterator reqIter = _sendRequests.begin(); - while(reqIter != _sendRequests.end()) { - if (reqIter->second.first == url) { - // test513 - std::string statusCode = url.getStatusCode(); - if (statusCode.length() > 0) { - std::string statusPrefix = statusCode.substr(0,1); - std::string statusRest = statusCode.substr(1); - Event event; - event.data = url; - event.name = "HTTP." + statusPrefix + "." + statusRest; - eventToSCXML(event, USCXML_IOPROC_BASICHTTP_TYPE, std::string(_url)); - } - _sendRequests.erase(reqIter); - return; - } - reqIter++; - } - assert(false); -} - -void BasicHTTPIOProcessor::downloadFailed(const URL& url, int errorCode) { - - std::map<std::string, std::pair<URL, Event> >::iterator reqIter = _sendRequests.begin(); - while(reqIter != _sendRequests.end()) { - if (reqIter->second.first == url) { - Event failEvent; - failEvent.name = "error.communication"; - eventToSCXML(failEvent, USCXML_IOPROC_BASICHTTP_TYPE, std::string(_url)); - - _sendRequests.erase(reqIter); - return; - } - reqIter++; - } - assert(false); - -} - } diff --git a/src/uscxml/plugins/ioprocessor/basichttp/BasicHTTPIOProcessor.h b/src/uscxml/plugins/ioprocessor/basichttp/BasicHTTPIOProcessor.h index bf64111..fb9ed3e 100644 --- a/src/uscxml/plugins/ioprocessor/basichttp/BasicHTTPIOProcessor.h +++ b/src/uscxml/plugins/ioprocessor/basichttp/BasicHTTPIOProcessor.h @@ -42,6 +42,7 @@ extern "C" { #include "uscxml/server/HTTPServer.h" #include "uscxml/interpreter/InterpreterImpl.h" #include "uscxml/plugins/IOProcessorImpl.h" +#include "uscxml/plugins/ioprocessor/http/HTTPIOProcessor.h" #ifndef _WIN32 #include <sys/time.h> @@ -59,7 +60,7 @@ namespace uscxml { * @ingroup ioproc * The basichttp I/O processor as per standard. */ -class USCXML_PLUGIN_API BasicHTTPIOProcessor : public IOProcessorImpl, public HTTPServlet, public URLMonitor { +class USCXML_PLUGIN_API BasicHTTPIOProcessor : public HTTPIOProcessor { public: BasicHTTPIOProcessor(); virtual ~BasicHTTPIOProcessor(); @@ -72,29 +73,9 @@ public: return names; } - virtual void eventFromSCXML(const std::string& target, const Event& event); - virtual bool isValidTarget(const std::string& target); - - Data getDataModelVariables(); - /// HTTPServlet bool requestFromHTTP(const HTTPServer::Request& req); - void setURL(const std::string& url) { - _url = url; - } - - bool canAdaptPath() { - return false; - } - - // URLMonitor - void downloadStarted(const URL& url); - void downloadCompleted(const URL& url); - void downloadFailed(const URL& url, int errorCode); -protected: - std::string _url; - std::map<std::string, std::pair<URL, Event> > _sendRequests; }; #ifdef BUILD_AS_PLUGINS |