#ifndef _GPXE_URI_H #define _GPXE_URI_H /** @file * * Uniform Resource Identifiers * */ #include #include #include /** A Uniform Resource Identifier * * Terminology for this data structure is as per uri(7), except that * "path" is defined to include the leading '/' for an absolute path. * * Note that all fields within a URI are optional and may be NULL. * * Some examples are probably helpful: * * http://www.etherboot.org/wiki : * * scheme = "http", host = "www.etherboot.org", path = "/wiki" * * /var/lib/tftpboot : * * path = "/var/lib/tftpboot" * * mailto:bob@nowhere.com : * * scheme = "mailto", opaque = "bob@nowhere.com" * * ftp://joe:secret@insecure.org:8081/hidden/path/to?what=is#this * * scheme = "ftp", user = "joe", password = "secret", * host = "insecure.org", port = "8081", path = "/hidden/path/to", * query = "what=is", fragment = "this" */ struct uri { /** Reference count */ struct refcnt refcnt; /** Scheme */ const char *scheme; /** Opaque part */ const char *opaque; /** User name */ const char *user; /** Password */ const char *password; /** Host name */ const char *host; /** Port number */ const char *port; /** Path */ const char *path; /** Query */ const char *query; /** Fragment */ const char *fragment; }; /** * URI is an absolute URI * * @v uri URI * @ret is_absolute URI is absolute * * An absolute URI begins with a scheme, e.g. "http:" or "mailto:". * Note that this is a separate concept from a URI with an absolute * path. */ static inline int uri_is_absolute ( struct uri *uri ) { return ( uri->scheme != NULL ); } /** * URI has an absolute path * * @v uri URI * @ret has_absolute_path URI has an absolute path * * An absolute path begins with a '/'. Note that this is a separate * concept from an absolute URI. Note also that a URI may not have a * path at all. */ static inline int uri_has_absolute_path ( struct uri *uri ) { return ( uri->path && ( uri->path[0] == '/' ) ); } /** * URI has a relative path * * @v uri URI * @ret has_relative_path URI has a relative path * * A relative path begins with something other than a '/'. Note that * this is a separate concept from a relative URI. Note also that a * URI may not have a path at all. */ static inline int uri_has_relative_path ( struct uri *uri ) { return ( uri->path && ( uri->path[0] != '/' ) ); } /** * Increment URI reference count * * @v uri URI, or NULL * @ret uri URI as passed in */ static inline __attribute__ (( always_inline )) struct uri * uri_get ( struct uri *uri ) { ref_get ( &uri->refcnt ); return uri; } /** * Decrement URI reference count * * @v uri URI, or NULL */ static inline __attribute__ (( always_inline )) void uri_put ( struct uri *uri ) { ref_put ( &uri->refcnt ); } extern struct uri *cwuri; extern struct uri * parse_uri ( const char *uri_string ); extern unsigned int uri_port ( struct uri *uri, unsigned int default_port ); extern int unparse_uri ( char *buf, size_t size, struct uri *uri ); extern struct uri * uri_dup ( struct uri *uri ); extern char * resolve_path ( const char *base_path, const char *relative_path ); extern struct uri * resolve_uri ( struct uri *base_uri, struct uri *relative_uri ); extern void churi ( struct uri *uri ); extern size_t uri_encode ( const char *raw_string, char *buf, size_t len ); extern size_t uri_decode ( const char *encoded_string, char *buf, size_t len ); #endif /* _GPXE_URI_H */