From: Scott Cantor Date: Tue, 24 Aug 2010 02:02:54 +0000 (+0000) Subject: https://issues.shibboleth.net/jira/browse/SSPCPP-297 X-Git-Tag: 1.4RC1~45 X-Git-Url: http://www.project-moonshot.org/gitweb/?p=shibboleth%2Fcpp-xmltooling.git;a=commitdiff_plain;h=7a1733085b19894b581d8e63fccf4910438728d4 https://issues.shibboleth.net/jira/browse/SSPCPP-297 --- diff --git a/xmltooling/XMLToolingConfig.h b/xmltooling/XMLToolingConfig.h index 2bdc59b..f23f62c 100644 --- a/xmltooling/XMLToolingConfig.h +++ b/xmltooling/XMLToolingConfig.h @@ -55,7 +55,7 @@ namespace xmltooling { /** * Singleton object that manages library startup/shutdown.configuration. * - * A locking interface is supplied as a convenience for code that wants to + *

A locking interface is supplied as a convenience for code that wants to * obtain a global system lock, but the actual configuration itself is not * synchronized. */ @@ -104,20 +104,19 @@ namespace xmltooling { /** * Shuts down library - * - * Each process using the library SHOULD call this function exactly once + *

Each process using the library SHOULD call this function exactly once * before terminating itself */ virtual void term()=0; /** * Loads a shared/dynamic library extension. - * - * Extension libraries are managed using a pair of "C" linkage functions:
+ * + *

Extension libraries are managed using a pair of "C" linkage functions:
* extern "C" int xmltooling_extension_init(void* context);
* extern "C" void xmltooling_extension_term(); - * - * This method is internally synchronized. + * + *

This method is internally synchronized. * * @param path pathname of shared library to load into process * @param context arbitrary data to pass to library initialization hook @@ -127,8 +126,7 @@ namespace xmltooling { /** * Configure logging system. - * - * May be called first, before initializing the library. Other calls to it + *

May be called first, before initializing the library. Other calls to it * must be externally synchronized. * * @param config either a logging configuration file, or a level from the set @@ -139,7 +137,7 @@ namespace xmltooling { /** * Obtains a non-validating parser pool. - * Library must be initialized first. + *

Library must be initialized first. * * @return reference to a non-validating parser pool. */ @@ -147,7 +145,7 @@ namespace xmltooling { /** * Obtains a validating parser pool. - * Library must be initialized first. Schema/catalog registration must be + *

Library must be initialized first. Schema/catalog registration must be * externally synchronized. * * @return reference to a validating parser pool. @@ -171,7 +169,7 @@ namespace xmltooling { /** * Sets the global KeyInfoResolver instance. - * This method must be externally synchronized with any code that uses the object. + *

This method must be externally synchronized with any code that uses the object. * Any previously set object is destroyed. * * @param keyInfoResolver new KeyInfoResolver instance to store @@ -180,7 +178,7 @@ namespace xmltooling { /** * Sets the global ReplayCache instance. - * This method must be externally synchronized with any code that uses the object. + *

This method must be externally synchronized with any code that uses the object. * Any previously set object is destroyed. * * @param replayCache new ReplayCache instance to store @@ -211,7 +209,7 @@ namespace xmltooling { /** * Sets the global PathResolver instance. - * This method must be externally synchronized with any code that uses the object. + *

This method must be externally synchronized with any code that uses the object. * Any previously set object is destroyed. * * @param pathResolver new PathResolver instance to store @@ -220,7 +218,7 @@ namespace xmltooling { /** * Sets the global TemplateEngine instance. - * This method must be externally synchronized with any code that uses the object. + *

This method must be externally synchronized with any code that uses the object. * Any previously set object is destroyed. * * @param templateEngine new TemplateEngine instance to store @@ -229,7 +227,7 @@ namespace xmltooling { /** * Sets the global URLEncoder instance. - * This method must be externally synchronized with any code that uses the object. + *

This method must be externally synchronized with any code that uses the object. * Any previously set object is destroyed. * * @param urlEncoder new URLEncoder instance to store @@ -238,11 +236,14 @@ namespace xmltooling { /** * List of catalog files to load into validating parser pool at initialization time. - * Like other path settings, the separator depends on the platform + *

Like other path settings, the separator depends on the platform * (semicolon on Windows, colon otherwise). */ std::string catalog_path; - + + /** A User-Agent header to include in HTTP client requests. */ + std::string user_agent; + /** * Adjusts any clock comparisons to be more liberal/permissive by the * indicated number of seconds. diff --git a/xmltooling/soap/impl/CURLSOAPTransport.cpp b/xmltooling/soap/impl/CURLSOAPTransport.cpp index 130c89e..a5fb29a 100644 --- a/xmltooling/soap/impl/CURLSOAPTransport.cpp +++ b/xmltooling/soap/impl/CURLSOAPTransport.cpp @@ -323,7 +323,11 @@ CURL* CURLPool::get(const SOAPTransport::Address& addr) curl_easy_setopt(handle,CURLOPT_HEADERFUNCTION,&curl_header_hook); curl_easy_setopt(handle,CURLOPT_WRITEFUNCTION,&curl_write_hook); curl_easy_setopt(handle,CURLOPT_DEBUGFUNCTION,&curl_debug_hook); - + string ua = XMLToolingConfig::getConfig().user_agent; + if (!ua.empty()) { + ua = ua + " libcurl/" + LIBCURL_VERSION + ' ' + OPENSSL_VERSION_TEXT; + curl_easy_setopt(handle, CURLOPT_USERAGENT, ua.c_str()); + } return handle; } diff --git a/xmltooling/util/CurlURLInputStream.cpp b/xmltooling/util/CurlURLInputStream.cpp index 219cf97..4918546 100644 --- a/xmltooling/util/CurlURLInputStream.cpp +++ b/xmltooling/util/CurlURLInputStream.cpp @@ -273,6 +273,12 @@ void CurlURLInputStream::init(const DOMElement* e) curl_easy_setopt(fEasy, CURLOPT_NOSIGNAL, 1); curl_easy_setopt(fEasy, CURLOPT_FAILONERROR, 1); curl_easy_setopt(fEasy, CURLOPT_ENCODING, ""); + string ua = XMLToolingConfig::getConfig().user_agent; + if (!ua.empty()) { + ua = ua + " libcurl/" + LIBCURL_VERSION + ' ' + OPENSSL_VERSION_TEXT; + curl_easy_setopt(fEasy, CURLOPT_USERAGENT, ua.c_str()); + } + // Install SSL callback. curl_easy_setopt(fEasy, CURLOPT_SSL_CTX_FUNCTION, ssl_ctx_callback);