int CommandLineServer::svc(void) { for (bool active = true;active == true;) { char buf[2048]; ACE_Time_Value timeout; timeout.sec(3600); int i = 0; // Display prompt char prompt[] = "\r\n>"; peer().send(prompt, 3, MSG_NOSIGNAL); // Get one command line bool foundCRLF = false; while(active && !foundCRLF && i<2040) { ssize_t size = peer().recv(buf+i, 2040-i, &timeout); if (size == 0 || size == -1) { active = false; } else { for(int j=0; j<size && !foundCRLF;j++) { if(buf[i+j] == '\r' || buf[i+j] == '\n') { foundCRLF = true; buf[i+j] = '\0'; CStdString command(buf); try { CStdString className = SingleLineSerializer::FindClass(command); ObjectRef objRef = ObjectFactory::GetSingleton()->NewInstance(className); if (objRef.get()) { objRef->DeSerializeSingleLine(command); ObjectRef response = objRef->Process(); CStdString responseString = response->SerializeSingleLine(); peer().send((PCSTR)responseString, responseString.GetLength(), MSG_NOSIGNAL); } else { CStdString error = "Unrecognized command"; peer().send(error, error.GetLength(), MSG_NOSIGNAL); ; } } catch (CStdString& e) { peer().send(e, e.GetLength(), MSG_NOSIGNAL); ; } } } i += size; } } } return 0; }
int HttpServer::svc(void) { char buf[2048]; buf[2047] = '\0'; // security ACE_Time_Value timeout; timeout.sec(5); ssize_t size = peer().recv(buf, 2040, &timeout); if (size > 5) { try { int startUrlOffset = 5; // get rid of "GET /" from Http request, so skip 5 chars char* stopUrl = ACE_OS::strstr(buf+startUrlOffset, " HTTP"); // detect location of post-URL trailing stuff if(!stopUrl) { throw (CStdString("Malformed http request")); ; } *stopUrl = '\0'; // Remove post-URL trailing stuff CStdString url(buf+startUrlOffset); int queryOffset = url.Find("?"); if (queryOffset > 0) { // Strip beginning of URL in case the command is received as an URL "query" of the form: // http://hostname/service/command?type=ping url = url.Right(url.size() - queryOffset - 1); } CStdString className = UrlSerializer::FindClass(url); ObjectRef objRef = ObjectFactory::GetSingleton()->NewInstance(className); if (objRef.get()) { objRef->DeSerializeUrl(url); ObjectRef response = objRef->Process(); if(response.get() == NULL) { throw (CStdString("Command does not return a response:") + className); } else { DOMImplementation* impl = DOMImplementationRegistry::getDOMImplementation(XStr("Core").unicodeForm()); XERCES_CPP_NAMESPACE::DOMDocument* myDoc; myDoc = impl->createDocument( 0, // root element namespace URI. XStr("response").unicodeForm(), // root element name 0); // document type object (DTD). response->SerializeDom(myDoc); CStdString pingResponse = DomSerializer::DomNodeToString(myDoc); CStdString httpOk("HTTP/1.0 200 OK\r\nContent-type: text/xml\r\n\r\n"); peer().send(httpOk, httpOk.GetLength(), MSG_NOSIGNAL); peer().send(pingResponse, pingResponse.GetLength(), MSG_NOSIGNAL); myDoc->release(); } } else { throw (CStdString("Command not found:") + className); ; } } catch (CStdString &e) { CStdString error("HTTP/1.0 404 not found\r\nContent-type: text/html\r\n\r\nError\r\n"); error = error + e + "\r\n"; peer().send(error, error.GetLength(), MSG_NOSIGNAL); } catch(const XMLException& e) { CStdString error("HTTP/1.0 404 not found\r\nContent-type: text/html\r\n\r\nXML Error\r\n"); peer().send(error, error.GetLength(), MSG_NOSIGNAL); } } else { CStdString notFound("HTTP/1.0 404 not found\r\nContent-type: text/html\r\n\r\nNot found\r\n"); peer().send(notFound, notFound.GetLength(), MSG_NOSIGNAL); } return 0; }