From: Mark H Weaver <mhw@netris.org>
To: Daniel Hartwig <mandyke@gmail.com>
Cc: 12827@debbugs.gnu.org, "Ludovic Courtès" <ludo@gnu.org>,
guile-devel@gnu.org
Subject: bug#12827: [PATCH] Tweak web modules, support relative URIs
Date: Sun, 24 Feb 2013 14:55:54 -0500 [thread overview]
Message-ID: <87mwut7agl.fsf__16066.8154167526$1361735822$gmane$org@tines.lan> (raw)
In-Reply-To: <CAN3veReLY1tH94950f+vE=hqJPM2=0qRudreDAv50QybLhfqwg@mail.gmail.com> (Daniel Hartwig's message of "Sun, 24 Feb 2013 20:31:58 +0800")
Daniel Hartwig <mandyke@gmail.com> writes:
> On 24 February 2013 18:45, Mark H Weaver <mhw@netris.org> wrote:
>> I would argue that Absolute-URIs are more often appropriate in typical
>> user code. The reason is that outside of URI-handling libraries, most
>> code that deals with URIs simply use them as universal pointers,
>> i.e. they implicitly assume that each URI is sufficient by itself to
>> identify any resource in universe.
>
> Right. RFC 3986 makes a convincing argument for the new terminology.
> These notes about usage also reflect the sentiment in that document.
>
> FWIW, I sat mostly on the fence, finally going away from URI-Reference
> due to these concerns I expressed in an earlier email:
>> The API seems less clean, and it is not immediately clear
>> that uri? is not the top of the URI-like type hierarchy. The other
>> functions only indicate “uri” in their name. I did not
>> wish to introduce parallel “build-uri-reference”, etc. for each of
>> these, and did consider adding #:reference? on some to select
>> weaker validation.
>
> and looking at some other Scheme URI modules.
>
> However, having read over your comments I think that we could
> reasonably get away with just introducing the procedures you mention
> below and not bother about renaming (or duplicating) the field getters
> to ‘uri-reference-path’ etc..
Hmm. The cleanest solution would probably be to duplicate the field
getters, and make the 'uri-*' variants (e.g. 'uri-path') raise an error
when applied to a relative reference. However, it's probably not that
important, so if you think it's better to simply extend 'uri-path' etc
to apply to all URI-References, I'm okay with that.
>> Here's what I suggest: instead of extending 'string->uri' and
>> 'build-uri' to produce relative URIs, rename those extended procedures
>> 'string->uri-reference' and 'build-uri-reference'. These are long
>> names, but that's okay because users should think twice before using
>> them, and that's seldom needed.
>
> In your proposed solution, ‘uri?’ and ‘uri-reference?’ are the
> predicates and they respond according to the RFC rather than internal
> Guile details?
What do you mean by "rather than internal Guile details"?
Here's how I like to think about these types: URI-Reference is at the
top of the type hierarchy, and URI (a.k.a. Absolute-URI) and
Relative-Ref are subtypes. Furthermore, every URI-Reference is either
an Absolute-URI or a Relative-Ref.
In other words, if you create a URI-Reference that happens to be
absolute, then you'll end up with a URI, in the same sense that if you
create a complex number whose imaginary part happens to be exact zero,
you'll end up with a real number.
> That is:
>
> (uri? (string->uri-reference "http://example.net/"))
> => #t
> (uri-reference? (string->uri-reference "http://example.net/"))
> => #t
> (uri? (string->uri-reference "foo"))
> => #f
Yes.
>> Then, we extend 'string->uri' and 'build-uri' in a different way: we
>> extend them to handle relative references in their *inputs*, but
>> continue to provide absolute *outputs*, by adding an optional keyword
>> argument '#:base-uri'. This would make it easy to implement the
>> simplest and safest strategy outlined above with a minimum of code
>> changes.
>
> This strategy does reflect the recommendation of RFC 3986 to resolve
> the references as they are read. Also an elegant API, as it
> encourages immedately resolving uri-references and never creating (or
> considering to create) the context-sensitive relative-refs.
>
>>
>> What do you think?
>>
>
> I quite like it, particularly the last part about #:base-uri.
>
> Ludo, I think this is basically what you were suggesting in the first place? :-)
Excellent! BTW, to be clear, I suggest that 'string->uri' and
'build-uri' should be guaranteed to produce Absolute-URIs. In other
words, they should raise an error if not given enough information to
produce an Absolute-URI. Does that make sense?
Thanks again for your work on this :)
Mark
next prev parent reply other threads:[~2013-02-24 19:55 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <CAN3veRcJ4EMJ53vWSRG0HXfwdXbhUmdvUu8EuLfVV7abjZEt1Q@mail.gmail.com>
2013-02-24 10:45 ` bug#12827: [PATCH] Tweak web modules, support relative URIs Mark H Weaver
[not found] ` <87vc9i6ld2.fsf@tines.lan>
2013-02-24 12:31 ` Daniel Hartwig
2013-02-24 19:55 ` Mark H Weaver [this message]
2013-03-13 11:05 ` Andy Wingo
2013-03-16 14:25 ` Daniel Hartwig
2013-03-20 10:20 ` Andy Wingo
2016-06-20 19:52 ` Andy Wingo
2016-06-21 13:22 ` Ludovic Courtès
2017-05-21 12:05 ` Andy Wingo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/guile/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='87mwut7agl.fsf__16066.8154167526$1361735822$gmane$org@tines.lan' \
--to=mhw@netris.org \
--cc=12827@debbugs.gnu.org \
--cc=guile-devel@gnu.org \
--cc=ludo@gnu.org \
--cc=mandyke@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).