Re: pkgs contain non URL safe characters

From: Ronald Klop <ronald-lists_at_klop.ws>
Date: Tue, 01 Mar 2022 13:45:25 UTC
On 3/1/22 14:25, Aristedes Maniatis wrote:
> On 1/3/2022 10:57pm, Ronald Klop wrote:
> 
>>
>> The + character is not special in this part of the URL. The request send by pkg is compliant to the specs.
>>
>> I'm aware of having specs and having what browsers and servers do in real life.
>> Why does Cloudfront decode a + to a space in this part of the URL?
>>
>> Regards,
>> Ronald.
> 
> 
> You are exactly correct. Turns out that AWS S3 is not following RFC 1866 <https://datatracker.ietf.org/doc/html/rfc1866> and hasn't since the beginning. And I'm guessing it is now too late. With this new information I've finally found a thread complaining about this (it affects other repos like apt).
> 
> https://forums.aws.amazon.com/thread.jspa?threadID=55746
> 
> 
> My little hack of renaming openjdk packages will have to stay I guess.
> 
> 
> Thanks
> 
> Ari
> 


You could try the untested patch below as "compatibility fix", but I'm not sure if that will not break other valid URLs passed to fetch/pkg.
Apparently pkg embeds libfetch statically: https://github.com/freebsd/pkg/tree/master/external/libfetch .
This patch is against the FreeBSD base.

diff --git a/lib/libfetch/fetch.c b/lib/libfetch/fetch.c
index 82a3c5e451a..496425cea47 100644
--- a/lib/libfetch/fetch.c
+++ b/lib/libfetch/fetch.c
@@ -451,7 +451,7 @@ fetchParseURL(const char *URL)
                 }
                 u->doc = doc;
                 while (*p != '\0') {
-                       if (!isspace((unsigned char)*p)) {
+                       if (!isspace((unsigned char)*p) && *p != '+') {
                                 *doc++ = *p++;
                         } else {
                                 *doc++ = '%';