You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
81 lines
2.2 KiB
C++
81 lines
2.2 KiB
C++
#include "webcc/soap_server.h"
|
|
|
|
#include "webcc/logger.h"
|
|
#include "webcc/soap_request.h"
|
|
#include "webcc/soap_response.h"
|
|
|
|
namespace webcc {
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
bool SoapRequestHandler::RegisterService(SoapServicePtr service,
|
|
const std::string& url) {
|
|
assert(service);
|
|
|
|
url_service_map_[url] = service;
|
|
return true;
|
|
}
|
|
|
|
HttpStatus::Enum SoapRequestHandler::HandleSession(HttpSessionPtr session) {
|
|
SoapServicePtr service = GetServiceByUrl(session->request().url());
|
|
if (!service) {
|
|
session->SetResponseStatus(HttpStatus::kBadRequest);
|
|
session->SendResponse();
|
|
return HttpStatus::kBadRequest;
|
|
}
|
|
|
|
// Parse the SOAP request XML.
|
|
SoapRequest soap_request;
|
|
if (!soap_request.FromXml(session->request().content())) {
|
|
session->SetResponseStatus(HttpStatus::kBadRequest);
|
|
session->SendResponse();
|
|
return HttpStatus::kBadRequest;
|
|
}
|
|
|
|
// TODO: Error handling.
|
|
SoapResponse soap_response;
|
|
service->Handle(soap_request, &soap_response);
|
|
|
|
std::string content;
|
|
soap_response.ToXml(&content);
|
|
|
|
session->SetResponseStatus(HttpStatus::kOK);
|
|
session->SetResponseContent(kTextXmlUtf8,
|
|
content.length(),
|
|
std::move(content));
|
|
session->SendResponse();
|
|
|
|
return HttpStatus::kOK;
|
|
}
|
|
|
|
SoapServicePtr SoapRequestHandler::GetServiceByUrl(const std::string& url) {
|
|
UrlServiceMap::const_iterator it = url_service_map_.find(url);
|
|
|
|
if (it != url_service_map_.end()) {
|
|
LOG_VERB("Service matches the URL: %s", url.c_str());
|
|
return it->second;
|
|
}
|
|
|
|
LOG_WARN("No service matches the URL: %s", url.c_str());
|
|
|
|
return SoapServicePtr();
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
SoapServer::SoapServer(unsigned short port, std::size_t workers)
|
|
: HttpServer(port, workers)
|
|
, request_handler_(new SoapRequestHandler()) {
|
|
}
|
|
|
|
SoapServer::~SoapServer() {
|
|
delete request_handler_;
|
|
}
|
|
|
|
bool SoapServer::RegisterService(SoapServicePtr service,
|
|
const std::string& url) {
|
|
return request_handler_->RegisterService(service, url);
|
|
}
|
|
|
|
} // namespace webcc
|