summaryrefslogtreecommitdiff
path: root/indra/llcommon/lluri.h
blob: 0665255676d1e8fa118adc458a02af2682343fc0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
/** 
 * @file lluri.h
 * @author Phoenix
 * @date 2006-02-05
 * @brief Declaration of the URI class.
 *
 * Copyright (c) 2006-$CurrentYear$, Linden Research, Inc.
 * $License$
 */

#ifndef LL_LLURI_H
#define LL_LLURI_H

#include <string>

class LLSD;
class LLUUID;
class LLApp;

/** 
 *
 * LLURI instances are immutable
 * See: http://www.ietf.org/rfc/rfc3986.txt
 *
 */
class LLURI
{
public:
  LLURI();
  LLURI(const std::string& escaped_str);
  // construct from escaped string, as would be transmitted on the net

  ~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& 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
  
  // 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"
  std::string hostName() const;	// ex.: "host.com"
  U16 hostPort() const;			// ex.: 80, will include implicit port
  std::string path() const;		// ex.: "/abc/def", includes leading slash
  //    LLSD pathArray() const;			// above decoded into an array of strings
  std::string query() const;		// ex.: "x=34", section after "?"
  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);

	// 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);

private:
  std::string mScheme;
  std::string mEscapedOpaque;
  std::string mEscapedAuthority;
  std::string mEscapedPath;
  std::string mEscapedQuery;
};

#endif // LL_LLURI_H