03c88d25f155951e295a5786a563a9c48750a277
[people/cooldavid/gpxe.git] / src / include / gpxe / uri.h
1 #ifndef _GPXE_URI_H
2 #define _GPXE_URI_H
3
4 /** @file
5  *
6  * Uniform Resource Identifiers
7  *
8  */
9
10 FILE_LICENCE ( GPL2_OR_LATER );
11
12 #include <stddef.h>
13 #include <stdlib.h>
14 #include <gpxe/refcnt.h>
15
16 /** A Uniform Resource Identifier
17  *
18  * Terminology for this data structure is as per uri(7), except that
19  * "path" is defined to include the leading '/' for an absolute path.
20  *
21  * Note that all fields within a URI are optional and may be NULL.
22  *
23  * Some examples are probably helpful:
24  *
25  *   http://www.etherboot.org/wiki :
26  *
27  *   scheme = "http", host = "www.etherboot.org", path = "/wiki"
28  *
29  *   /var/lib/tftpboot :
30  *
31  *   path = "/var/lib/tftpboot"
32  *
33  *   mailto:bob@nowhere.com :
34  *
35  *   scheme = "mailto", opaque = "bob@nowhere.com"
36  *
37  *   ftp://joe:secret@insecure.org:8081/hidden/path/to?what=is#this
38  *
39  *   scheme = "ftp", user = "joe", password = "secret",
40  *   host = "insecure.org", port = "8081", path = "/hidden/path/to",
41  *   query = "what=is", fragment = "this"
42  */
43 struct uri {
44         /** Reference count */
45         struct refcnt refcnt;
46         /** Scheme */
47         const char *scheme;
48         /** Opaque part */
49         const char *opaque;
50         /** User name */
51         const char *user;
52         /** Password */
53         const char *password;
54         /** Host name */
55         const char *host;
56         /** Port number */
57         const char *port;
58         /** Path */
59         const char *path;
60         /** Query */
61         const char *query;
62         /** Fragment */
63         const char *fragment;
64 };
65
66 /**
67  * URI is an absolute URI
68  *
69  * @v uri                       URI
70  * @ret is_absolute             URI is absolute
71  *
72  * An absolute URI begins with a scheme, e.g. "http:" or "mailto:".
73  * Note that this is a separate concept from a URI with an absolute
74  * path.
75  */
76 static inline int uri_is_absolute ( struct uri *uri ) {
77         return ( uri->scheme != NULL );
78 }
79
80 /**
81  * URI has an absolute path
82  *
83  * @v uri                       URI
84  * @ret has_absolute_path       URI has an absolute path
85  *
86  * An absolute path begins with a '/'.  Note that this is a separate
87  * concept from an absolute URI.  Note also that a URI may not have a
88  * path at all.
89  */
90 static inline int uri_has_absolute_path ( struct uri *uri ) {
91         return ( uri->path && ( uri->path[0] == '/' ) );
92 }
93
94 /**
95  * URI has a relative path
96  *
97  * @v uri                       URI
98  * @ret has_relative_path       URI has a relative path
99  *
100  * A relative path begins with something other than a '/'.  Note that
101  * this is a separate concept from a relative URI.  Note also that a
102  * URI may not have a path at all.
103  */
104 static inline int uri_has_relative_path ( struct uri *uri ) {
105         return ( uri->path && ( uri->path[0] != '/' ) );
106 }
107
108 /**
109  * Increment URI reference count
110  *
111  * @v uri               URI, or NULL
112  * @ret uri             URI as passed in
113  */
114 static inline __attribute__ (( always_inline )) struct uri *
115 uri_get ( struct uri *uri ) {
116         ref_get ( &uri->refcnt );
117         return uri;
118 }
119
120 /**
121  * Decrement URI reference count
122  *
123  * @v uri               URI, or NULL
124  */
125 static inline __attribute__ (( always_inline )) void
126 uri_put ( struct uri *uri ) {
127         ref_put ( &uri->refcnt );
128 }
129
130 extern struct uri *cwuri;
131
132 extern struct uri * parse_uri ( const char *uri_string );
133 extern unsigned int uri_port ( struct uri *uri, unsigned int default_port );
134 extern int unparse_uri ( char *buf, size_t size, struct uri *uri );
135 extern struct uri * uri_dup ( struct uri *uri );
136 extern char * resolve_path ( const char *base_path,
137                              const char *relative_path );
138 extern struct uri * resolve_uri ( struct uri *base_uri,
139                                   struct uri *relative_uri );
140 extern void churi ( struct uri *uri );
141 extern size_t uri_encode ( const char *raw_string, char *buf, size_t len );
142 extern size_t uri_decode ( const char *encoded_string, char *buf, size_t len );
143
144 #endif /* _GPXE_URI_H */