config: add helper to normalize and match URLs
authorKyle J. McKay <>
Wed, 31 Jul 2013 20:52:00 +0000 (31 13:52 -0700)
committerJunio C Hamano <>
Wed, 31 Jul 2013 21:57:57 +0000 (31 14:57 -0700)
config: add helper to normalize and match URLs

Some http.* configuration variables need to take values customized
for the URL we are talking to.  We may want to set http.sslVerify to
true in general but to false only for a certain site, for example,
with a configuration file like this:

sslVerify = true
[http ""]
sslVerify = false

and let the configuration machinery pick up the latter only when
talking to "".  The latter needs to kick in
not only when the URL is exactly "", but
also is anything that "match" it, e.g.

The <url> in the configuration key consists of the following parts,
and is considered a match to the URL we are attempting to access
under certain conditions:

  . Scheme (e.g., `https` in ``). This field
    must match exactly between the config key and the URL.

  . Host/domain name (e.g., `` in ``).
    This field must match exactly between the config key and the URL.

  . Port number (e.g., `8080` in ``).  This
    field must match exactly between the config key and the URL.
    Omitted port numbers are automatically converted to the correct
    default for the scheme before matching.

  . Path (e.g., `repo.git` in ``). The
    path field of the config key must match the path field of the
    URL either exactly or as a prefix of slash-delimited path
    elements.  A config key with path `foo/` matches URL path
    `foo/bar`.  A prefix can only match on a slash (`/`) boundary.
    Longer matches take precedence (so a config key with path
    `foo/bar` is a better match to URL path `foo/bar` than a config
    key with just path `foo/`).

  . User name (e.g., `me` in ``). If
    the config key has a user name, it must match the user name in
    the URL exactly. If the config key does not have a user name,
    that config key will match a URL with any user name (including
    none), but at a lower precedence than a config key with a user

Longer matches take precedence over shorter matches.

This step adds two helper functions `url_normalize()` and
`match_urls()` to help implement the above semantics. The
normalization rules are based on RFC 3986 and should result in any
two equivalent urls being a match.

Signed-off-by: Kyle J. McKay <>
Signed-off-by: Junio C Hamano <>
urlmatch.c [new file with mode: 0644]
urlmatch.h [new file with mode: 0644]