diff options
author | Kartic Krishnamurthy <drunkensufi@lindenlab.com> | 2007-07-18 01:28:59 +0000 |
---|---|---|
committer | Kartic Krishnamurthy <drunkensufi@lindenlab.com> | 2007-07-18 01:28:59 +0000 |
commit | e1ab7d8a30cc40cbd1d471c67def21508c82ff49 (patch) | |
tree | 3f834cc8207ea481f6caf820738c8cbf5388bc9a /indra/llcommon | |
parent | 7964c6f7a5b622d698f7d471690b29122966b1b2 (diff) |
svn merge -r63705:65463 svn+ssh://svn/svn/linden/branches/dpo-3-bug-fix
NOTE: r63705 is *not* the earliest rev# for dpo-3-bug-fix.
Diffstat (limited to 'indra/llcommon')
-rw-r--r-- | indra/llcommon/lluri.cpp | 35 | ||||
-rw-r--r-- | indra/llcommon/lluri.h | 97 |
2 files changed, 79 insertions, 53 deletions
diff --git a/indra/llcommon/lluri.cpp b/indra/llcommon/lluri.cpp index 5cb6067990..22526c9a03 100644 --- a/indra/llcommon/lluri.cpp +++ b/indra/llcommon/lluri.cpp @@ -275,9 +275,10 @@ LLURI LLURI::buildHTTP(const std::string& prefix, const LLSD& query) { LLURI uri = buildHTTP(prefix, path); - uri.mEscapedQuery = mapToQueryString(query); // break out and escape each query component - uri.mEscapedOpaque += "?" + uri.mEscapedQuery ; + uri.mEscapedQuery = mapToQueryString(query); + uri.mEscapedOpaque += uri.mEscapedQuery ; + uri.mEscapedQuery.erase(0,1); // trim the leading '?' return uri; } @@ -581,20 +582,30 @@ LLSD LLURI::queryMap(std::string escaped_query_string) std::string LLURI::mapToQueryString(const LLSD& queryMap) { std::string query_string; - if (queryMap.isMap()) { - for (LLSD::map_const_iterator iter = queryMap.beginMap(); - iter != queryMap.endMap(); - iter++) + bool first_element = true; + LLSD::map_const_iterator iter = queryMap.beginMap(); + LLSD::map_const_iterator end = queryMap.endMap(); + std::ostringstream ostr; + for (; iter != end; ++iter) { - query_string += escapeQueryVariable(iter->first) + - (iter->second.isUndefined() ? "" : "=" + escapeQueryValue(iter->second.asString())) + "&" ; + if(first_element) + { + ostr << "?"; + first_element = false; + } + else + { + ostr << "&"; + } + ostr << escapeQueryVariable(iter->first); + if(iter->second.isDefined()) + { + ostr << "=" << escapeQueryValue(iter->second.asString()); + } } - //if (queryMap.size() > 0) - //{ - // query_string += "?" + query_string ; - //} + query_string = ostr.str(); } return query_string; } diff --git a/indra/llcommon/lluri.h b/indra/llcommon/lluri.h index 9ec51b4b1a..00eacf6536 100644 --- a/indra/llcommon/lluri.h +++ b/indra/llcommon/lluri.h @@ -38,34 +38,42 @@ public: // construct from escaped string, as would be transmitted on the net - ~LLURI(); + ~LLURI(); - static LLURI buildHTTP(const std::string& prefix, - const LLSD& path); - static LLURI buildHTTP(const std::string& prefix, - const LLSD& path, - const LLSD& query); - // prefix is either a full URL prefix of the form "http://example.com:8080", - // or it can be simply a host and optional port like "example.com" or - // "example.com:8080", in these cases, the "http://" will be added + static LLURI buildHTTP( + const std::string& prefix, + const LLSD& path); - static LLURI buildHTTP(const std::string& host, - const U32& port, - const LLSD& path); - static LLURI buildHTTP(const std::string& host, - const U32& port, - const LLSD& path, - const LLSD& query); - std::string asString() const; - // the whole URI, escaped as needed + static LLURI buildHTTP( + const std::string& prefix, + const LLSD& path, + const LLSD& query); + ///< prefix is either a full URL prefix of the form + /// "http://example.com:8080", or it can be simply a host and + /// optional port like "example.com" or "example.com:8080", in + /// these cases, the "http://" will be added + + static LLURI buildHTTP( + const std::string& host, + const U32& port, + const LLSD& path); + static LLURI buildHTTP( + const std::string& host, + const U32& port, + const LLSD& path, + const LLSD& query); + + std::string asString() const; + ///< the whole URI, escaped as needed - // Parts of a URI - // These functions return parts of the decoded URI. The returned - // strings are un-escaped as needed + /** @name Parts of a URI */ + //@{ + // These functions return parts of the decoded URI. The returned + // strings are un-escaped as needed - // for all schemes - std::string scheme() const; // ex.: "http", note lack of colon - std::string opaque() const; // everything after the colon + // for all schemes + std::string scheme() const; ///< ex.: "http", note lack of colon + std::string opaque() const; ///< everything after the colon // for schemes that follow path like syntax (http, https, ftp) std::string authority() const; // ex.: "host.com:80" @@ -81,27 +89,34 @@ public: const std::string& escapedQuery() const { return mEscapedQuery; } LLSD queryMap() const; // above decoded into a map static LLSD queryMap(std::string escaped_query_string); - static std::string mapToQueryString(const LLSD& queryMap); - // Escaping Utilities - // Escape a string by urlencoding all the characters that aren't in the allowed string. - static std::string escape(const std::string& str); - static std::string escape(const std::string& str, const std::string & allowed); - static std::string unescape(const std::string& str); + /** + * @brief given a name value map, return a serialized query string. + * + + * @param query_map a map of name value. every value must be + * representable as a string. + * @return Returns an url query string of '?n1=v1&n2=v2&...' + */ + static std::string mapToQueryString(const LLSD& query_map); - // Functions for building specific URIs for web services - // *NOTE: DEPRECATED. use the service builder instead. - //static LLURI buildBulkAgentNamesURI(LLApp* app); - //static LLURI buildAgentSessionURI(const LLUUID& agent_id, LLApp* app); - //static LLURI buildAgentLoginInfoURI(const LLUUID& agent_id, const std::string& dataserver); - //static LLURI buildAgentNameURI(const LLUUID& agent_id, LLApp* app); + /** @name Escaping Utilities */ + //@{ + // Escape a string by urlencoding all the characters that aren't + // in the allowed string. + static std::string escape(const std::string& str); + static std::string escape( + const std::string& str, + const std::string & allowed); + static std::string unescape(const std::string& str); + //@} private: - std::string mScheme; - std::string mEscapedOpaque; - std::string mEscapedAuthority; - std::string mEscapedPath; - std::string mEscapedQuery; + std::string mScheme; + std::string mEscapedOpaque; + std::string mEscapedAuthority; + std::string mEscapedPath; + std::string mEscapedQuery; }; #endif // LL_LLURI_H |