Asterisk - The Open Source Telephony Project GIT-master-f36a736
Data Structures | Macros | Functions
uri.c File Reference
#include "asterisk.h"
#include "asterisk/astobj2.h"
#include "asterisk/strings.h"
#include "asterisk/uri.h"
Include dependency graph for uri.c:

Go to the source code of this file.

Data Structures

struct  ast_uri
 Stores parsed uri information. More...
 

Macros

#define SET_VALUE(param, field, size)
 
#define SET_VALUES(value)
 

Functions

struct ast_uriast_uri_copy_replace (const struct ast_uri *uri, const char *scheme, const char *user_info, const char *host, const char *port, const char *path, const char *query)
 Copy the given uri replacing any value in the new uri with any given. More...
 
struct ast_uriast_uri_create (const char *scheme, const char *user_info, const char *host, const char *port, const char *path, const char *query)
 Create a uri with the given parameters. More...
 
static struct ast_uriast_uri_create_ (const char *scheme, unsigned int scheme_size, const char *user_info, unsigned int user_info_size, const char *host, unsigned int host_size, const char *port, unsigned int port_size, const char *path, unsigned int path_size, const char *query, unsigned int query_size)
 Construct a uri object with the given values. More...
 
const char * ast_uri_host (const struct ast_uri *uri)
 Retrieve the uri host. More...
 
int ast_uri_is_secure (const struct ast_uri *uri)
 Retrieve if the uri is of a secure type. More...
 
char * ast_uri_make_host_with_port (const struct ast_uri *uri)
 Retrieve a string of the host and port. More...
 
struct ast_uriast_uri_parse (const char *uri)
 Parse the given uri into a structure. More...
 
struct ast_uriast_uri_parse_http (const char *uri)
 Parse the given http uri into a structure. More...
 
struct ast_uriast_uri_parse_websocket (const char *uri)
 Parse the given websocket uri into a structure. More...
 
const char * ast_uri_path (const struct ast_uri *uri)
 Retrieve the uri path. More...
 
const char * ast_uri_port (const struct ast_uri *uri)
 Retrieve the uri port. More...
 
const char * ast_uri_query (const struct ast_uri *uri)
 Retrieve the uri query parameters. More...
 
const char * ast_uri_scheme (const struct ast_uri *uri)
 Retrieve the uri scheme. More...
 
const char * ast_uri_user_info (const struct ast_uri *uri)
 Retrieve the uri user information. More...
 
static struct ast_uriuri_parse_and_default (const char *uri, const char *scheme, const char *port, const char *secure_port)
 

Macro Definition Documentation

◆ SET_VALUE

#define SET_VALUE (   param,
  field,
  size 
)
Value:
do { if (param) { \
ast_copy_string(p, param, size); \
field = p; \
p += size; } } while (0)

◆ SET_VALUES

#define SET_VALUES (   value)
Value:
value = uri; \
size_##value = p - uri + 1; \
uri = p + 1;
int value
Definition: syslog.c:37

Function Documentation

◆ ast_uri_copy_replace()

struct ast_uri * ast_uri_copy_replace ( const struct ast_uri uri,
const char *  scheme,
const char *  user_info,
const char *  host,
const char *  port,
const char *  path,
const char *  query 
)

Copy the given uri replacing any value in the new uri with any given.

Parameters
urithe uri object to copy
schemethe uri scheme (ex: http)
user_infouser credentials (ex: <name>@<pass>)
hosthost name or ip address
portthe port
paththe path
queryquery parameters
Returns
a copy of the given uri with specified values replaced.
Return values
NULLon error
Since
13

Definition at line 101 of file uri.c.

105{
106 return ast_uri_create(
107 scheme ? scheme : uri->scheme,
108 user_info ? user_info : uri->user_info,
109 host ? host : uri->host,
110 port ? port : uri->port,
111 path ? path : uri->path,
112 query ? query : uri->query);
113}
char * host
Definition: uri.c:36
char * path
Definition: uri.c:40
char * user_info
Definition: uri.c:34
char * scheme
Definition: uri.c:32
char * port
Definition: uri.c:38
char * query
Definition: uri.c:42
struct ast_uri * ast_uri_create(const char *scheme, const char *user_info, const char *host, const char *port, const char *path, const char *query)
Create a uri with the given parameters.
Definition: uri.c:88

References ast_uri_create(), ast_uri::host, ast_uri::path, ast_uri::port, ast_uri::query, ast_uri::scheme, ast_uri::uri, and ast_uri::user_info.

Referenced by uri_parse_and_default().

◆ ast_uri_create()

struct ast_uri * ast_uri_create ( const char *  scheme,
const char *  user_info,
const char *  host,
const char *  port,
const char *  path,
const char *  query 
)

Create a uri with the given parameters.

Parameters
schemethe uri scheme (ex: http)
user_infouser credentials (ex: <name>@<pass>)
hosthost name or ip address
portthe port
paththe path
queryquery parameters
Returns
a structure containing parsed uri data.
Return values
NULLon error
Since
13

Definition at line 88 of file uri.c.

91{
92 return ast_uri_create_(
93 scheme, scheme ? strlen(scheme) + 1 : 0,
94 user_info, user_info ? strlen(user_info) + 1 : 0,
95 host, host ? strlen(host) + 1 : 0,
96 port, port ? strlen(port) + 1 : 0,
97 path, path ? strlen(path) + 1 : 0,
98 query, query ? strlen(query) + 1 : 0);
99}
static struct ast_uri * ast_uri_create_(const char *scheme, unsigned int scheme_size, const char *user_info, unsigned int user_info_size, const char *host, unsigned int host_size, const char *port, unsigned int port_size, const char *path, unsigned int path_size, const char *query, unsigned int query_size)
Construct a uri object with the given values.
Definition: uri.c:54

References ast_uri_create_(), ast_uri::host, ast_uri::path, ast_uri::port, ast_uri::query, ast_uri::scheme, and ast_uri::user_info.

Referenced by ast_uri_copy_replace().

◆ ast_uri_create_()

static struct ast_uri * ast_uri_create_ ( const char *  scheme,
unsigned int  scheme_size,
const char *  user_info,
unsigned int  user_info_size,
const char *  host,
unsigned int  host_size,
const char *  port,
unsigned int  port_size,
const char *  path,
unsigned int  path_size,
const char *  query,
unsigned int  query_size 
)
static

Construct a uri object with the given values.

Note
The size parameters [should] include room for the string terminator (strlen(<param>) + 1). For instance, if a scheme of 'http' is given then the 'scheme_size' should be equal to 5.

Definition at line 54 of file uri.c.

61{
62#define SET_VALUE(param, field, size) \
63 do { if (param) { \
64 ast_copy_string(p, param, size); \
65 field = p; \
66 p += size; } } while (0)
67
68 char *p;
69 struct ast_uri *res = ao2_alloc(
70 sizeof(*res) + scheme_size + user_info_size + host_size +
71 port_size + path_size + query_size, NULL);
72
73 if (!res) {
74 ast_log(LOG_ERROR, "Unable to create URI object\n");
75 return NULL;
76 }
77
78 p = res->uri;
79 SET_VALUE(scheme, res->scheme, scheme_size);
80 SET_VALUE(user_info, res->user_info, user_info_size);
81 SET_VALUE(host, res->host, host_size);
82 SET_VALUE(port, res->port, port_size);
83 SET_VALUE(path, res->path, path_size);
84 SET_VALUE(query, res->query, query_size);
85 return res;
86}
#define ast_log
Definition: astobj2.c:42
#define ao2_alloc(data_size, destructor_fn)
Definition: astobj2.h:409
#define LOG_ERROR
#define NULL
Definition: resample.c:96
Stores parsed uri information.
Definition: uri.c:30
char uri[0]
Definition: uri.c:44
#define SET_VALUE(param, field, size)

References ao2_alloc, ast_log, ast_uri::host, LOG_ERROR, NULL, ast_uri::path, ast_uri::port, ast_uri::query, ast_uri::scheme, SET_VALUE, ast_uri::uri, and ast_uri::user_info.

Referenced by ast_uri_create(), and ast_uri_parse().

◆ ast_uri_host()

const char * ast_uri_host ( const struct ast_uri uri)

Retrieve the uri host.

Returns
the uri host.
Since
13

Definition at line 125 of file uri.c.

126{
127 return uri->host;
128}

References ast_uri::uri.

Referenced by AST_TEST_DEFINE(), and ast_uri_make_host_with_port().

◆ ast_uri_is_secure()

int ast_uri_is_secure ( const struct ast_uri uri)

Retrieve if the uri is of a secure type.

Note
Secure types are recognized by an 's' at the end of the scheme.
Return values
Trueif secure.
Falseotherwise.
Since
13

Definition at line 145 of file uri.c.

146{
147 return ast_strlen_zero(uri->scheme) ? 0 :
148 *(uri->scheme + strlen(uri->scheme) - 1) == 's';
149}
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition: strings.h:65

References ast_strlen_zero(), and ast_uri::uri.

Referenced by AST_TEST_DEFINE(), and uri_parse_and_default().

◆ ast_uri_make_host_with_port()

char * ast_uri_make_host_with_port ( const struct ast_uri uri)

Retrieve a string of the host and port.

Combine the host and port (<host>:<port>) if the port is available, otherwise just return the host.

Note
Caller is responsible for release the returned string.
Parameters
urithe uri object
Returns
a string value of the host and optional port.
Since
13

Definition at line 300 of file uri.c.

301{
302 char *res;
303
304 if (ast_asprintf(&res, "%s%s%s",
305 ast_uri_host(uri) ?: "",
306 ast_uri_port(uri) ? ":" : "",
307 ast_uri_port(uri) ?: "") == -1) {
308 return NULL;
309 }
310
311 return res;
312}
#define ast_asprintf(ret, fmt,...)
A wrapper for asprintf()
Definition: astmm.h:267
const char * ast_uri_port(const struct ast_uri *uri)
Retrieve the uri port.
Definition: uri.c:130
const char * ast_uri_host(const struct ast_uri *uri)
Retrieve the uri host.
Definition: uri.c:125

References ast_asprintf, ast_uri_host(), ast_uri_port(), NULL, and ast_uri::uri.

Referenced by websocket_client_parse_uri().

◆ ast_uri_parse()

struct ast_uri * ast_uri_parse ( const char *  uri)

Parse the given uri into a structure.

Note
Expects the following form:
<scheme>://[user:pass@]<host>[:port][/<path>] 
Parameters
uria string uri to parse
Returns
a structure containing parsed uri data.
Return values
NULLon error
Since
13

Definition at line 195 of file uri.c.

196{
197#define SET_VALUES(value) \
198 value = uri; \
199 size_##value = p - uri + 1; \
200 uri = p + 1;
201
202 const char *p, *scheme = NULL, *user_info = NULL, *host = NULL;
203 const char *port = NULL, *path = NULL, *query = NULL;
204 unsigned int size_scheme = 0, size_user_info = 0, size_host = 0;
205 unsigned int size_port = 0, size_path = 0, size_query = 0;
206
207 if ((p = strstr(uri, "://"))) {
208 scheme = uri;
209 size_scheme = p - uri + 1;
210 uri = p + 3;
211 }
212
213 if ((p = strchr(uri, '@'))) {
214 SET_VALUES(user_info);
215 }
216
217 if ((p = strchr(uri, ':'))) {
218 SET_VALUES(host);
219 }
220
221 if ((p = strchr(uri, '/'))) {
222 if (!host) {
223 SET_VALUES(host);
224 } else {
225 SET_VALUES(port);
226 }
227 }
228
229 if ((p = strchr(uri, '?'))) {
230 query = p + 1;
231 size_query = strlen(query) + 1;
232 } else {
233 p = uri + strlen(uri);
234 }
235
236 if (!host) {
237 SET_VALUES(host);
238 } else if (*(uri - 1) == ':') {
239 SET_VALUES(port);
240 } else if (*(uri - 1) == '/') {
241 SET_VALUES(path);
242 }
243
244 return ast_uri_create_(scheme, size_scheme,
245 user_info, size_user_info,
246 host, size_host,
247 port, size_port,
248 path, size_path,
249 query, size_query);
250}
#define SET_VALUES(value)

References ast_uri_create_(), ast_uri::host, NULL, ast_uri::path, ast_uri::port, ast_uri::query, ast_uri::scheme, SET_VALUES, ast_uri::uri, and ast_uri::user_info.

Referenced by AST_TEST_DEFINE(), file_extension_from_url_path(), and uri_parse_and_default().

◆ ast_uri_parse_http()

struct ast_uri * ast_uri_parse_http ( const char *  uri)

Parse the given http uri into a structure.

Note
Expects the following form:
[http[s]://][user:pass@]<host>[:port][/<path>] 
If no scheme is given it defaults to 'http' and if no port is specified it will default to 443 if marked secure, otherwise to 80.
Parameters
urian http string uri to parse
Returns
a structure containing parsed http uri data.
Return values
NULLon error
Since
13

Definition at line 290 of file uri.c.

291{
292 return uri_parse_and_default(uri, "http", "80", "443");
293}
static struct ast_uri * uri_parse_and_default(const char *uri, const char *scheme, const char *port, const char *secure_port)
Definition: uri.c:253

References ast_uri::uri, and uri_parse_and_default().

Referenced by AST_TEST_DEFINE().

◆ ast_uri_parse_websocket()

struct ast_uri * ast_uri_parse_websocket ( const char *  uri)

Parse the given websocket uri into a structure.

Note
Expects the following form:
If no scheme is given it defaults to 'ws' and if no port is specified it will default to 443 if marked secure, otherwise to 80.
Parameters
uria websocket string uri to parse
Returns
a structure containing parsed http uri data.
Return values
NULLon error
Since
13

Definition at line 295 of file uri.c.

296{
297 return uri_parse_and_default(uri, "ws", "80", "443");
298}

References ast_uri::uri, and uri_parse_and_default().

Referenced by websocket_client_parse_uri().

◆ ast_uri_path()

const char * ast_uri_path ( const struct ast_uri uri)

Retrieve the uri path.

Returns
the uri path.
Since
13

Definition at line 135 of file uri.c.

136{
137 return uri->path;
138}

References ast_uri::uri.

Referenced by AST_TEST_DEFINE(), file_extension_from_url_path(), and websocket_client_parse_uri().

◆ ast_uri_port()

const char * ast_uri_port ( const struct ast_uri uri)

Retrieve the uri port.

Returns
the uri port.
Since
13

Definition at line 130 of file uri.c.

131{
132 return uri->port;
133}

References ast_uri::uri.

Referenced by AST_TEST_DEFINE(), ast_uri_make_host_with_port(), and uri_parse_and_default().

◆ ast_uri_query()

const char * ast_uri_query ( const struct ast_uri uri)

Retrieve the uri query parameters.

Returns
the uri query parameters.
Since
13

Definition at line 140 of file uri.c.

141{
142 return uri->query;
143}

References ast_uri::uri.

Referenced by AST_TEST_DEFINE(), and websocket_client_parse_uri().

◆ ast_uri_scheme()

const char * ast_uri_scheme ( const struct ast_uri uri)

Retrieve the uri scheme.

Returns
the uri scheme.
Since
13

Definition at line 115 of file uri.c.

116{
117 return uri->scheme;
118}

References ast_uri::uri.

Referenced by AST_TEST_DEFINE().

◆ ast_uri_user_info()

const char * ast_uri_user_info ( const struct ast_uri uri)

Retrieve the uri user information.

Returns
the uri user information.
Since
13

Definition at line 120 of file uri.c.

121{
122 return uri->user_info;
123}

References ast_uri::uri.

Referenced by AST_TEST_DEFINE().

◆ uri_parse_and_default()

static struct ast_uri * uri_parse_and_default ( const char *  uri,
const char *  scheme,
const char *  port,
const char *  secure_port 
)
static

Definition at line 253 of file uri.c.

255{
256 struct ast_uri *res;
257 int len = strlen(scheme);
258
259 if (!strncmp(uri, scheme, len)) {
260 res = ast_uri_parse(uri);
261 } else {
262 /* make room for <scheme>:// */
263 char *with_scheme = ast_malloc(len + strlen(uri) + 4);
264 if (!with_scheme) {
265 ast_log(LOG_ERROR, "Unable to allocate uri '%s' with "
266 "scheme '%s'", uri, scheme);
267 return NULL;
268 }
269
270 /* safe - 'with_scheme' created with size equal to len of
271 scheme plus length of uri plus space for extra characters
272 '://' and terminator */
273 sprintf(with_scheme, "%s://%s", scheme, uri);
274 res = ast_uri_parse(with_scheme);
275 ast_free(with_scheme);
276 }
277
278 if (res && ast_strlen_zero(ast_uri_port(res))) {
279 /* default the port if not given */
281 res, NULL, NULL, NULL,
282 ast_uri_is_secure(res) ? secure_port : port,
283 NULL, NULL);
284 ao2_ref(res, -1);
285 res = tmp;
286 }
287 return res;
288}
#define ast_free(a)
Definition: astmm.h:180
#define ast_malloc(len)
A wrapper for malloc()
Definition: astmm.h:191
#define ao2_ref(o, delta)
Reference/unreference an object and return the old refcount.
Definition: astobj2.h:459
static int tmp()
Definition: bt_open.c:389
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
struct ast_uri * ast_uri_copy_replace(const struct ast_uri *uri, const char *scheme, const char *user_info, const char *host, const char *port, const char *path, const char *query)
Copy the given uri replacing any value in the new uri with any given.
Definition: uri.c:101
int ast_uri_is_secure(const struct ast_uri *uri)
Retrieve if the uri is of a secure type.
Definition: uri.c:145
struct ast_uri * ast_uri_parse(const char *uri)
Parse the given uri into a structure.
Definition: uri.c:195

References ao2_ref, ast_free, ast_log, ast_malloc, ast_strlen_zero(), ast_uri_copy_replace(), ast_uri_is_secure(), ast_uri_parse(), ast_uri_port(), len(), LOG_ERROR, NULL, ast_uri::port, ast_uri::scheme, tmp(), and ast_uri::uri.

Referenced by ast_uri_parse_http(), and ast_uri_parse_websocket().