aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--url.ha17
1 files changed, 13 insertions, 4 deletions
diff --git a/url.ha b/url.ha
index 784f602..6c4ef79 100644
--- a/url.ha
+++ b/url.ha
@@ -4,10 +4,19 @@
use strings;
use net::uri;
-// The result must be freed with strings::freeall;
-fn segments_from_path(s: str) ([]str | nomem | net::uri::invalid) = {
+// The result must be freed with strings::freeall.
+fn segments_from_path(s: str) ([]str | nomem | uri::invalid) = {
let sp: []str = strings::split(s, "/")?;
- for (let i = 1z; i < len(sp); i += 1)
- sp[i - 1] = net::uri::percent_decode(sp[i])?;
+ for (let i = 1z; i < len(sp); i += 1) {
+ match (uri::percent_decode(sp[i])) {
+ case let s: str =>
+ sp[i - 1] = s;
+ case uri::invalid =>
+ for (let j = 0z; j < i - 1; j += 1) {
+ free(sp[j]);
+ };
+ return uri::invalid;
+ };
+ };
return sp[.. len(sp) - 1];
};