[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