aboutsummaryrefslogtreecommitdiff
path: root/src/libutil/url.cc
diff options
context:
space:
mode:
authorCole Helbling <cole.e.helbling@outlook.com>2023-08-17 13:21:38 -0700
committerCole Helbling <cole.e.helbling@outlook.com>2023-08-17 14:16:19 -0700
commit73696ec71678433dac87863bab36b66701d4b6ed (patch)
treef57078ae503ac58121a397924e3c9ead861ecc69 /src/libutil/url.cc
parent1d7a57cfd9bf40658e2f35c13146d746a1011020 (diff)
libutil: fix double-encoding of URLs
If you have a URL that needs to be percent-encoded, such as `http://localhost:8181/test/+3d.tar.gz`, and try to lock that in a Nix flake such as the following: { inputs.test = { url = "http://localhost:8181/test/+3d.tar.gz"; flake = false; }; outputs = { test, ... }: { t = builtins.readFile test; }; } running `nix flake metadata` shows that the input URL has been incorrectly double-encoded (despite the flake.lock being correctly encoded only once): [...snip...] Inputs: └───test: http://localhost:8181/test/%252B3d.tar.gz?narHash=sha256-EFUdrtf6Rn0LWIJufrmg8q99aT3jGfLvd1//zaJEufY%3D (Notice the `%252B`? That's just `%2B` but percent-encoded again) With this patch, the double-encoding is gone; running `nix flake metadata` will show the proper URL: [...snip...] Inputs: └───test: http://localhost:8181/test/%2B3d.tar.gz?narHash=sha256-EFUdrtf6Rn0LWIJufrmg8q99aT3jGfLvd1//zaJEufY%3D --- As far as I can tell, this happens because Nix already percent-encodes the URL and stores this as the value of `inputs.asdf.url`. However, when Nix later tries to read this out of the eval state as a string (via `getStrAttr`), it has to run it through `parseURL` again to get the `ParsedURL` structure. Now, this itself isn't a problem -- the true problem arises when using `ParsedURL::to_string` later, which then _re-escapes the path_. It is at this point that what would have been `%2B` (`+`) becomes `%252B` (`%2B`).
Diffstat (limited to 'src/libutil/url.cc')
-rw-r--r--src/libutil/url.cc2
1 files changed, 1 insertions, 1 deletions
diff --git a/src/libutil/url.cc b/src/libutil/url.cc
index 9e44241ac..a8f7d39fd 100644
--- a/src/libutil/url.cc
+++ b/src/libutil/url.cc
@@ -44,7 +44,7 @@ ParsedURL parseURL(const std::string & url)
.base = base,
.scheme = scheme,
.authority = authority,
- .path = path,
+ .path = percentDecode(path),
.query = decodeQuery(query),
.fragment = percentDecode(std::string(fragment))
};