aboutsummaryrefslogtreecommitdiff
path: root/src/core/url.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/url.h')
-rw-r--r--src/core/url.h52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/core/url.h b/src/core/url.h
new file mode 100644
index 00000000..ee336b1d
--- /dev/null
+++ b/src/core/url.h
@@ -0,0 +1,52 @@
+//
+// Copyright 2018 Garrett D'Amore <garrett@damore.org>
+// Copyright 2018 Capitar IT Group BV <info@capitar.com>
+//
+// This software is supplied under the terms of the MIT License, a
+// copy of which should be located in the distribution where this
+// file was obtained (LICENSE.txt). A copy of the license may also be
+// found online at https://opensource.org/licenses/MIT.
+//
+
+#ifndef CORE_URL_H
+#define CORE_URL_H
+
+typedef struct nni_url nni_url;
+
+struct nni_url {
+ char *u_rawurl; // never NULL
+ char *u_scheme; // never NULL
+ char *u_userinfo; // will be NULL if not specified
+ char *u_host; // including colon and port
+ char *u_hostname; // name only, will be "" if not specified
+ char *u_port; // port, will be "" if not specified
+ char *u_path; // path, will be "" if not specified
+ char *u_query; // without '?', will be NULL if not specified
+ char *u_fragment; // without '#', will be NULL if not specified
+};
+
+extern int nni_url_parse(nni_url **, const char *path);
+extern void nni_url_free(nni_url *);
+
+// nni_url_decode decodes the string, converting escaped characters to their
+// proper form. The newly allocated string is returned in the first argument
+// and may be freed with nni_strfree(). Note that we return EINVAL in the
+// presence of an encoding of a control character. (Most especially NUL
+// would cause problems for C code, but the other control characters have
+// no business inside a URL either.)
+extern int nni_url_decode(char **, const char *);
+
+// nni_url_encode works like nni_url_decode, but does the opposite transform.
+// "Reserved" special characters (such as "/" and "@") are encoded, so don't
+// use this to encode the entire URL.) This is most useful when encoding
+// individual components, such as a value for a query parameter. Note that
+// this returns NNG_EINVAL if the input string contains control characters,
+// as those have no business inside a URL.
+extern int nni_url_encode(char **, const char *);
+
+// nni_url_encode_ext works like nni_url_encode, but passes the named
+// special characters. For example, to URL encode all elements in a path
+// while preserving director separators, use the string "/" for specials.
+extern int nni_url_encode_ext(char **, const char *, const char *);
+
+#endif // CORE_URL_H