[vlc-devel] [vlc-commits] url: add vlc_uri_compose()

Hugo Beauzée-Luyssen hugo at beauzee.fr
Thu Jul 21 10:04:51 CEST 2016


On 07/17/2016 04:13 PM, Rémi Denis-Courmont wrote:
> vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sun Jul 17 16:00:11 2016 +0300| [ed7d9c7e72bd841eb7048a44207abbd8d96db245] | committer: Rémi Denis-Courmont
>
> url: add vlc_uri_compose()
>
> This builds a string from a vlc_url_t structure.
>
>> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=ed7d9c7e72bd841eb7048a44207abbd8d96db245
> ---
>
>  include/vlc_url.h  |   14 ++++++++++++
>  src/libvlccore.sym |    1 +
>  src/text/url.c     |   61 ++++++++++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 76 insertions(+)
>
> diff --git a/include/vlc_url.h b/include/vlc_url.h
> index 8fdd959..a013e2c 100644
> --- a/include/vlc_url.h
> +++ b/include/vlc_url.h
> @@ -101,6 +101,20 @@ VLC_API char *vlc_uri_decode_duplicate(const char *str) VLC_MALLOC;
>  VLC_API char *vlc_uri_encode(const char *str) VLC_MALLOC;
>
>  /**
> + * Composes an URI.
> + *
> + * Converts a decomposed/parsed URI structure (\ref vlc_url_t) into a
> + * nul-terminated URI literal string.
> + *
> + * See also IETF RFC3986 section 5.3 for details.
> + *
> + * \bug URI fragments (i.e. HTML anchors) are not handled
> + *
> + * \return a heap-allocated nul-terminated string or NULL if out of memory
> + */
> +VLC_API char *vlc_uri_compose(const vlc_url_t *) VLC_MALLOC;
> +
> +/**
>   * Fixes up a URI string.
>   *
>   * Attempts to convert a nul-terminated string into a syntactically valid URI.
> diff --git a/src/libvlccore.sym b/src/libvlccore.sym
> index 249bb50..5511e51 100644
> --- a/src/libvlccore.sym
> +++ b/src/libvlccore.sym
> @@ -252,6 +252,7 @@ vlc_uri2path
>  vlc_uri_decode
>  vlc_uri_decode_duplicate
>  vlc_uri_encode
> +vlc_uri_compose
>  vlc_uri_fixup
>  mdate
>  module_config_free
> diff --git a/src/text/url.c b/src/text/url.c
> index f5f7ba6..643bfd3 100644
> --- a/src/text/url.c
> +++ b/src/text/url.c
> @@ -492,6 +492,67 @@ void vlc_UrlClean (vlc_url_t *restrict url)
>      free (url->psz_buffer);
>  }
>
> +char *vlc_uri_compose(const vlc_url_t *uri)
> +{
> +    char *buf, *enc;
> +    size_t len;
> +    FILE *stream = open_memstream(&buf, &len);
> +
> +    if (stream == NULL)
> +        return NULL;
> +
> +    if (uri->psz_protocol != NULL)
> +        fprintf(stream, "%s:", uri->psz_protocol);
> +
> +    if (uri->psz_host != NULL)
> +    {
> +        fwrite("//", 1, 2, stream);
> +
> +        if (uri->psz_username != NULL)
> +        {
> +            enc = vlc_uri_encode(uri->psz_username);
> +            if (enc == NULL)
> +                goto error;
> +
> +            fputs(enc, stream);
> +            free(enc);
> +
> +            if (uri->psz_password != NULL)
> +            {
> +                enc = vlc_uri_encode(uri->psz_password);
> +                if (unlikely(enc == NULL))
> +                    goto error;
> +
> +                fprintf(stream, ":%s", enc);
> +            }
> +            fputc('@', stream);

This seems to be leaking enc.

> +        }
> +
> +        const char *fmt;
> +
> +        if (strchr(uri->psz_host, ':') != NULL)
> +            fmt = (uri->i_port != 0) ? "[%s]:%d" : "[%s]";
> +        else
> +            fmt = (uri->i_port != 0) ? "%s:%d" : "%s";
> +        /* No IDNA decoding here. Seems unnecessary, dangerous even. */
> +        fprintf(stream, fmt, uri->psz_host, uri->i_port);
> +    }
> +
> +    if (uri->psz_path != NULL)
> +        fputs(uri->psz_path, stream);
> +    if (uri->psz_option != NULL)
> +        fprintf(stream, "?%s", uri->psz_option);
> +    /* NOTE: fragment not handled currently */
> +
> +    fclose(stream);
> +    return buf;
> +
> +error:
> +    fclose(stream);
> +    free(buf);
> +    return NULL;
> +}
> +
>  char *vlc_uri_fixup(const char *str)
>  {
>      /* Rule number one is do not change a (potentially) valid URI */
>
> _______________________________________________
> vlc-commits mailing list
> vlc-commits at videolan.org
> https://mailman.videolan.org/listinfo/vlc-commits
>



More information about the vlc-devel mailing list