git-svn-id: https://svn.middleware.georgetown.edu/cpp-xmltooling/trunk@374
de75baf8-a10c-0410-a50a-
987c0e22f00f
#include <xmltooling/Lockable.h>
#include <xmltooling/PluginManager.h>
#include <xmltooling/Lockable.h>
#include <xmltooling/PluginManager.h>
+#include <xmltooling/soap/SOAPTransport.h>
#include <xmltooling/util/ParserPool.h>
#ifndef XMLTOOLING_NO_XMLSEC
#include <xmltooling/util/ParserPool.h>
#ifndef XMLTOOLING_NO_XMLSEC
- class XMLTOOL_API SOAPTransport;
class XMLTOOL_API TemplateEngine;
class XMLTOOL_API URLEncoder;
#ifndef XMLTOOLING_LITE
class XMLTOOL_API TemplateEngine;
class XMLTOOL_API URLEncoder;
#ifndef XMLTOOLING_LITE
*
* <p>The factory interface takes a peer name/endpoint pair.
*/
*
* <p>The factory interface takes a peer name/endpoint pair.
*/
- PluginManager<SOAPTransport,std::string,std::pair<const char*,const char*> > SOAPTransportManager;
+ PluginManager<SOAPTransport,std::string,SOAPTransport::Address> SOAPTransportManager;
/**
* Sends the supplied envelope to the identified recipient/endpoint.
/**
* Sends the supplied envelope to the identified recipient/endpoint.
* <p>The client object will instantiate a transport layer object
* appropriate for the endpoint URL provided and supply it to the
* prepareTransport() method below.
* <p>The client object will instantiate a transport layer object
* appropriate for the endpoint URL provided and supply it to the
* prepareTransport() method below.
* in a subclass-specific version of the prepareTransport() method.
*
* @param env SOAP envelope to send
* in a subclass-specific version of the prepareTransport() method.
*
* @param env SOAP envelope to send
- * @param peerName name of peer
- * @param endpoint URL of endpoint to recieve message
+ * @param addr addressing information
- virtual void send(const Envelope& env, const char* peerName, const char* endpoint);
+ virtual void send(const Envelope& env, const xmltooling::SOAPTransport::Address& addr);
/**
* Returns the response message, if any. As long as a response is
/**
* Returns the response message, if any. As long as a response is
SOAPTransport() {}
public:
virtual ~SOAPTransport() {}
SOAPTransport() {}
public:
virtual ~SOAPTransport() {}
+
+ /**
+ * A simple structure to capture SOAP addressing information.
+ */
+ struct XMLTOOL_API Address {
+ /**
+ * Constructor.
+ *
+ * @param from name of sender
+ * @param to name of recipient
+ * @param endpoint endpoint URL
+ */
+ Address(const char* from, const char* to, const char* endpoint) : m_from(from), m_to(to), m_endpoint(endpoint) {
+ }
+
+ /** Name of sender. */
+ const char* m_from;
+
+ /** Name of recipient. */
+ const char* m_to;
+
+ /** Endpoint URL. */
+ const char* m_endpoint;
+ };
+
/**
* Indicates whether transport provides confidentiality.
*
/**
* Indicates whether transport provides confidentiality.
*
m_log(Category::getInstance(XMLTOOLING_LOGCAT".SOAPTransport.CURLPool")) {}
~CURLPool();
m_log(Category::getInstance(XMLTOOLING_LOGCAT".SOAPTransport.CURLPool")) {}
~CURLPool();
- CURL* get(const char* to, const char* endpoint);
- void put(const char* to, const char* endpoint, CURL* handle);
+ CURL* get(const SOAPTransport::Address& addr);
+ void put(const char* from, const char* to, const char* endpoint, CURL* handle);
private:
typedef map<string,vector<CURL*> > poolmap_t;
private:
typedef map<string,vector<CURL*> > poolmap_t;
class XMLTOOL_DLLLOCAL CURLSOAPTransport : public HTTPSOAPTransport, public OpenSSLSOAPTransport
{
public:
class XMLTOOL_DLLLOCAL CURLSOAPTransport : public HTTPSOAPTransport, public OpenSSLSOAPTransport
{
public:
- CURLSOAPTransport(const char* peerName, const char* endpoint)
- : m_peerName(peerName ? peerName : ""), m_endpoint(endpoint), m_handle(NULL), m_headers(NULL),
+ CURLSOAPTransport(const Address& addr)
+ : m_sender(addr.m_from ? addr.m_from : ""), m_peerName(addr.m_to ? addr.m_to : ""), m_endpoint(addr.m_endpoint),
+ m_handle(NULL), m_headers(NULL),
#ifndef XMLTOOLING_NO_XMLSEC
m_cred(NULL), m_trustEngine(NULL), m_peerResolver(NULL), m_mandatory(false),
#endif
m_ssl_callback(NULL), m_ssl_userptr(NULL), m_chunked(true), m_secure(false) {
#ifndef XMLTOOLING_NO_XMLSEC
m_cred(NULL), m_trustEngine(NULL), m_peerResolver(NULL), m_mandatory(false),
#endif
m_ssl_callback(NULL), m_ssl_userptr(NULL), m_chunked(true), m_secure(false) {
- m_handle = g_CURLPool->get(peerName, endpoint);
- curl_easy_setopt(m_handle,CURLOPT_URL,endpoint);
+ m_handle = g_CURLPool->get(addr);
+ curl_easy_setopt(m_handle,CURLOPT_URL,addr.m_endpoint);
curl_easy_setopt(m_handle,CURLOPT_CONNECTTIMEOUT,15);
curl_easy_setopt(m_handle,CURLOPT_TIMEOUT,30);
curl_easy_setopt(m_handle,CURLOPT_HTTPAUTH,0);
curl_easy_setopt(m_handle,CURLOPT_CONNECTTIMEOUT,15);
curl_easy_setopt(m_handle,CURLOPT_TIMEOUT,30);
curl_easy_setopt(m_handle,CURLOPT_HTTPAUTH,0);
curl_slist_free_all(m_headers);
curl_easy_setopt(m_handle,CURLOPT_ERRORBUFFER,NULL);
curl_easy_setopt(m_handle,CURLOPT_PRIVATE,m_secure ? "secure" : NULL); // Save off security "state".
curl_slist_free_all(m_headers);
curl_easy_setopt(m_handle,CURLOPT_ERRORBUFFER,NULL);
curl_easy_setopt(m_handle,CURLOPT_PRIVATE,m_secure ? "secure" : NULL); // Save off security "state".
- g_CURLPool->put(m_peerName.c_str(), m_endpoint.c_str(), m_handle);
+ g_CURLPool->put(m_sender.c_str(), m_peerName.c_str(), m_endpoint.c_str(), m_handle);
}
bool isConfidential() const {
}
bool isConfidential() const {
private:
// per-call state
private:
// per-call state
- string m_peerName,m_endpoint,m_simplecreds;
+ string m_sender,m_peerName,m_endpoint,m_simplecreds;
CURL* m_handle;
stringstream m_stream;
struct curl_slist* m_headers;
CURL* m_handle;
stringstream m_stream;
struct curl_slist* m_headers;
int XMLTOOL_DLLLOCAL verify_callback(X509_STORE_CTX* x509_ctx, void* arg);
#endif
int XMLTOOL_DLLLOCAL verify_callback(X509_STORE_CTX* x509_ctx, void* arg);
#endif
- SOAPTransport* CURLSOAPTransportFactory(const pair<const char*,const char*>& dest)
+ SOAPTransport* CURLSOAPTransportFactory(const SOAPTransport::Address& addr)
- return new CURLSOAPTransport(dest.first, dest.second);
+ return new CURLSOAPTransport(addr);
-CURL* CURLPool::get(const char* to, const char* endpoint)
+CURL* CURLPool::get(const SOAPTransport::Address& addr)
{
#ifdef _DEBUG
xmltooling::NDC("get");
#endif
{
#ifdef _DEBUG
xmltooling::NDC("get");
#endif
- m_log.debug("getting connection handle to %s", endpoint);
+ m_log.debug("getting connection handle to %s", addr.m_endpoint);
+ string key(addr.m_endpoint);
+ if (addr.m_from)
+ key = key + '|' + addr.m_from;
+ if (addr.m_to)
+ key = key + '|' + addr.m_to;
- poolmap_t::iterator i=m_bindingMap.find(string(to) + "|" + endpoint);
+ poolmap_t::iterator i=m_bindingMap.find(key);
if (i!=m_bindingMap.end()) {
// Move this pool to the front of the list.
if (i!=m_bindingMap.end()) {
// Move this pool to the front of the list.
-void CURLPool::put(const char* to, const char* endpoint, CURL* handle)
+void CURLPool::put(const char* from, const char* to, const char* endpoint, CURL* handle)
- string key = string(to) + "|" + endpoint;
+ string key(endpoint);
+ if (from)
+ key = key + '|' + from;
+ if (to)
+ key = key + '|' + to;
m_lock->lock();
poolmap_t::iterator i=m_bindingMap.find(key);
if (i==m_bindingMap.end())
m_lock->lock();
poolmap_t::iterator i=m_bindingMap.find(key);
if (i==m_bindingMap.end())
-void SOAPClient::send(const Envelope& env, const char* peerName, const char* endpoint)
+void SOAPClient::send(const Envelope& env, const SOAPTransport::Address& addr)
{
// Prepare a transport object.
{
// Prepare a transport object.
- const char* pch = strchr(endpoint,':');
+ const char* pch = strchr(addr.m_endpoint,':');
if (!pch)
throw IOException("SOAP endpoint was not a URL.");
if (!pch)
throw IOException("SOAP endpoint was not a URL.");
- string scheme(endpoint, pch-endpoint);
- m_transport = XMLToolingConfig::getConfig().SOAPTransportManager.newPlugin(scheme.c_str(), make_pair(peerName,endpoint));
+ string scheme(addr.m_endpoint, pch-addr.m_endpoint);
+ m_transport = XMLToolingConfig::getConfig().SOAPTransportManager.newPlugin(scheme.c_str(), addr);
prepareTransport(*m_transport);
// Serialize envelope.
prepareTransport(*m_transport);
// Serialize envelope.