diff options
-rw-r--r-- | indra/lib/python/indra/base/config.py | 29 | ||||
-rw-r--r-- | indra/lib/python/indra/base/llsd.py | 1 | ||||
-rw-r--r-- | indra/lib/python/indra/ipc/servicebuilder.py | 29 | ||||
-rw-r--r-- | indra/llmessage/llhttpclient.cpp | 64 | ||||
-rw-r--r-- | indra/llmessage/llhttpclient.h | 50 |
5 files changed, 137 insertions, 36 deletions
diff --git a/indra/lib/python/indra/base/config.py b/indra/lib/python/indra/base/config.py index 1649933d37..f0119d1295 100644 --- a/indra/lib/python/indra/base/config.py +++ b/indra/lib/python/indra/base/config.py @@ -27,6 +27,7 @@ $/LicenseInfo$ """ import copy +import errno import os import traceback import time @@ -62,6 +63,8 @@ class IndraConfig(object): self._load() def _load(self): + # if you initialize the IndraConfig with None, no attempt + # is made to load any files if self._indra_config_file is None: return @@ -164,22 +167,36 @@ class IndraConfig(object): """ return copy.deepcopy(self._combined_dict) -def load(indra_xml_file = None): +def load(config_xml_file = None): global _g_config - if indra_xml_file is None: + load_default_files = config_xml_file is None + if load_default_files: ## going from: ## "/opt/linden/indra/lib/python/indra/base/config.py" ## to: ## "/opt/linden/etc/indra.xml" - indra_xml_file = realpath( + config_xml_file = realpath( dirname(realpath(__file__)) + "../../../../../../etc/indra.xml") try: - _g_config = IndraConfig(indra_xml_file) + _g_config = IndraConfig(config_xml_file) except IOError: - # indra.xml was not openable, so let's initialize with an empty dict - # some code relies on config behaving this way + # Failure to load passed in file + # or indra.xml default file + if load_default_files: + try: + config_xml_file = realpath( + dirname(realpath(__file__)) + "../../../../../../etc/globals.xml") + _g_config = IndraConfig(config_xml_file) + return + except IOError: + # Failure to load globals.xml + # fall to code below + pass + + # Either failed to load passed in file + # or failed to load all default files _g_config = IndraConfig(None) def dump(indra_xml_file, indra_cfg = None, update_in_mem=False): diff --git a/indra/lib/python/indra/base/llsd.py b/indra/lib/python/indra/base/llsd.py index 5b8f5d7613..057d4e31dc 100644 --- a/indra/lib/python/indra/base/llsd.py +++ b/indra/lib/python/indra/base/llsd.py @@ -126,6 +126,7 @@ def date_to_python(node): if not val: val = "1970-01-01T00:00:00Z" return parse_datestr(val) + def uri_to_python(node): val = node.text or '' diff --git a/indra/lib/python/indra/ipc/servicebuilder.py b/indra/lib/python/indra/ipc/servicebuilder.py index ebd2583385..13a36a392d 100644 --- a/indra/lib/python/indra/ipc/servicebuilder.py +++ b/indra/lib/python/indra/ipc/servicebuilder.py @@ -51,12 +51,10 @@ def build(name, context={}, **kwargs): > servicebuilder.build('version-manager-version', context, version='1.18.1.2') 'http://int.util.vaak.lindenlab.com/channel/Second%20Life%20Release/1.18.1.2' """ - context = context.copy() # shouldn't modify the caller's dictionary - context.update(kwargs) global _g_builder if _g_builder is None: _g_builder = ServiceBuilder() - return _g_builder.buildServiceURL(name, context) + return _g_builder.buildServiceURL(name, context, **kwargs) class ServiceBuilder(object): def __init__(self, services_definition = services_config): @@ -81,13 +79,36 @@ class ServiceBuilder(object): else: self.builders[service['name']] = service_builder - def buildServiceURL(self, name, context): + def buildServiceURL(self, name, context={}, **kwargs): """\ @brief given the environment on construction, return a service URL. @param name The name of the service. @param context A dict of name value lookups for the service. + @param kwargs Any keyword arguments are treated as members of the + context, this allows you to be all 31337 by writing shit like: + servicebuilder.build('name', param=value) @returns Returns the """ + context = context.copy() # shouldn't modify the caller's dictionary + context.update(kwargs) base_url = config.get('services-base-url') svc_path = russ.format(self.builders[name], context) return base_url + svc_path + + +def on_in(query_name, host_key, schema_key): + """\ + @brief Constructs an on/in snippet (for running named queries) + from a schema name and two keys referencing values stored in + indra.xml. + + @param query_name Name of the query. + @param host_key Logical name of destination host. Will be + looked up in indra.xml. + @param schema_key Logical name of destination schema. Will + be looked up in indra.xml. + """ + host_name = config.get(host_key) + schema_name = config.get(schema_key) + return '/'.join( ('on', host_name, 'in', schema_name, query_name.lstrip('/')) ) + diff --git a/indra/llmessage/llhttpclient.cpp b/indra/llmessage/llhttpclient.cpp index 618d99dc48..9c716cf42b 100644 --- a/indra/llmessage/llhttpclient.cpp +++ b/indra/llmessage/llhttpclient.cpp @@ -1,4 +1,4 @@ - /** +/** * @file llhttpclient.cpp * @brief Implementation of classes for making HTTP requests. * @@ -310,9 +310,13 @@ void LLHTTPClient::getByteRange( request(url,LLURLRequest::HTTP_GET, NULL, responder, timeout, headers); } -void LLHTTPClient::head(const std::string& url, ResponderPtr responder, const F32 timeout) +void LLHTTPClient::head( + const std::string& url, + ResponderPtr responder, + const LLSD& headers, + const F32 timeout) { - request(url, LLURLRequest::HTTP_HEAD, NULL, responder, timeout); + request(url, LLURLRequest::HTTP_HEAD, NULL, responder, timeout, headers); } void LLHTTPClient::get(const std::string& url, ResponderPtr responder, const LLSD& headers, const F32 timeout) @@ -423,39 +427,66 @@ LLSD LLHTTPClient::blockingGet(const std::string& url) return response; } -void LLHTTPClient::put(const std::string& url, const LLSD& body, ResponderPtr responder, const F32 timeout) +void LLHTTPClient::put( + const std::string& url, + const LLSD& body, + ResponderPtr responder, + const LLSD& headers, + const F32 timeout) { - request(url, LLURLRequest::HTTP_PUT, new LLSDInjector(body), responder, timeout); + request(url, LLURLRequest::HTTP_PUT, new LLSDInjector(body), responder, timeout, headers); } -void LLHTTPClient::post(const std::string& url, const LLSD& body, ResponderPtr responder, const F32 timeout) +void LLHTTPClient::post( + const std::string& url, + const LLSD& body, + ResponderPtr responder, + const LLSD& headers, + const F32 timeout) { - request(url, LLURLRequest::HTTP_POST, new LLSDInjector(body), responder, timeout); + request(url, LLURLRequest::HTTP_POST, new LLSDInjector(body), responder, timeout, headers); } -void LLHTTPClient::postRaw(const std::string& url, const U8* data, S32 size, ResponderPtr responder, const F32 timeout) +void LLHTTPClient::postRaw( + const std::string& url, + const U8* data, + S32 size, + ResponderPtr responder, + const LLSD& headers, + const F32 timeout) { - request(url, LLURLRequest::HTTP_POST, new RawInjector(data, size), responder, timeout); + request(url, LLURLRequest::HTTP_POST, new RawInjector(data, size), responder, timeout, headers); } -void LLHTTPClient::postFile(const std::string& url, const std::string& filename, ResponderPtr responder, const F32 timeout) +void LLHTTPClient::postFile( + const std::string& url, + const std::string& filename, + ResponderPtr responder, + const LLSD& headers, + const F32 timeout) { - request(url, LLURLRequest::HTTP_POST, new FileInjector(filename), responder, timeout); + request(url, LLURLRequest::HTTP_POST, new FileInjector(filename), responder, timeout, headers); } -void LLHTTPClient::postFile(const std::string& url, const LLUUID& uuid, - LLAssetType::EType asset_type, ResponderPtr responder, const F32 timeout) +void LLHTTPClient::postFile( + const std::string& url, + const LLUUID& uuid, + LLAssetType::EType asset_type, + ResponderPtr responder, + const LLSD& headers, + const F32 timeout) { - request(url, LLURLRequest::HTTP_POST, new VFileInjector(uuid, asset_type), responder, timeout); + request(url, LLURLRequest::HTTP_POST, new VFileInjector(uuid, asset_type), responder, timeout, headers); } // static void LLHTTPClient::del( const std::string& url, ResponderPtr responder, + const LLSD& headers, const F32 timeout) { - request(url, LLURLRequest::HTTP_DELETE, NULL, responder, timeout); + request(url, LLURLRequest::HTTP_DELETE, NULL, responder, timeout, headers); } // static @@ -463,9 +494,10 @@ void LLHTTPClient::move( const std::string& url, const std::string& destination, ResponderPtr responder, + const LLSD& hdrs, const F32 timeout) { - LLSD headers; + LLSD headers = hdrs; headers["Destination"] = destination; request(url, LLURLRequest::HTTP_MOVE, NULL, responder, timeout, headers); } diff --git a/indra/llmessage/llhttpclient.h b/indra/llmessage/llhttpclient.h index af79662be9..6267eb465f 100644 --- a/indra/llmessage/llhttpclient.h +++ b/indra/llmessage/llhttpclient.h @@ -62,28 +62,56 @@ public: /** @name non-blocking API */ //@{ - static void head(const std::string& url, ResponderPtr, const F32 timeout=HTTP_REQUEST_EXPIRY_SECS); + static void head( + const std::string& url, + ResponderPtr, + const LLSD& headers = LLSD(), + const F32 timeout=HTTP_REQUEST_EXPIRY_SECS); static void getByteRange(const std::string& url, S32 offset, S32 bytes, ResponderPtr, const LLSD& headers=LLSD(), const F32 timeout=HTTP_REQUEST_EXPIRY_SECS); static void get(const std::string& url, ResponderPtr, const LLSD& headers = LLSD(), const F32 timeout=HTTP_REQUEST_EXPIRY_SECS); static void get(const std::string& url, const LLSD& query, ResponderPtr, const LLSD& headers = LLSD(), const F32 timeout=HTTP_REQUEST_EXPIRY_SECS); - static void put(const std::string& url, const LLSD& body, ResponderPtr, const F32 timeout=HTTP_REQUEST_EXPIRY_SECS); + static void put( + const std::string& url, + const LLSD& body, + ResponderPtr, + const LLSD& headers = LLSD(), + const F32 timeout=HTTP_REQUEST_EXPIRY_SECS); static void getHeaderOnly(const std::string& url, ResponderPtr, const F32 timeout=HTTP_REQUEST_EXPIRY_SECS); static void getHeaderOnly(const std::string& url, ResponderPtr, const LLSD& headers, const F32 timeout=HTTP_REQUEST_EXPIRY_SECS); - static void post(const std::string& url, const LLSD& body, ResponderPtr, const F32 timeout=HTTP_REQUEST_EXPIRY_SECS); - + static void post( + const std::string& url, + const LLSD& body, + ResponderPtr, + const LLSD& headers = LLSD(), + const F32 timeout=HTTP_REQUEST_EXPIRY_SECS); /** Takes ownership of data and deletes it when sent */ - static void postRaw(const std::string& url, const U8* data, S32 size, ResponderPtr responder, const F32 timeout=HTTP_REQUEST_EXPIRY_SECS); - - static void postFile(const std::string& url, const std::string& filename, ResponderPtr, const F32 timeout=HTTP_REQUEST_EXPIRY_SECS); - # - static void postFile(const std::string& url, const LLUUID& uuid, - LLAssetType::EType asset_type, ResponderPtr responder, const F32 timeout=HTTP_REQUEST_EXPIRY_SECS); + static void postRaw( + const std::string& url, + const U8* data, + S32 size, + ResponderPtr responder, + const LLSD& headers = LLSD(), + const F32 timeout=HTTP_REQUEST_EXPIRY_SECS); + static void postFile( + const std::string& url, + const std::string& filename, + ResponderPtr, + const LLSD& headers = LLSD(), + const F32 timeout=HTTP_REQUEST_EXPIRY_SECS); + static void postFile( + const std::string& url, + const LLUUID& uuid, + LLAssetType::EType asset_type, + ResponderPtr responder, + const LLSD& headers = LLSD(), + const F32 timeout=HTTP_REQUEST_EXPIRY_SECS); static void del( const std::string& url, ResponderPtr responder, + const LLSD& headers = LLSD(), const F32 timeout=HTTP_REQUEST_EXPIRY_SECS); ///< sends a DELETE method, but we can't call it delete in c++ @@ -93,12 +121,14 @@ public: * @param url The complete serialized (and escaped) url to get. * @param destination The complete serialized destination url. * @param responder The responder that will handle the result. + * @param headers A map of key:value headers to pass to the request * @param timeout The number of seconds to give the server to respond. */ static void move( const std::string& url, const std::string& destination, ResponderPtr responder, + const LLSD& headers = LLSD(), const F32 timeout=HTTP_REQUEST_EXPIRY_SECS); //@} |