X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=include%2Fvlc_url.h;h=42fe23eb13ee2ce4a059804352b2528ff7c083b1;hb=7a9a29f49f46c7133846190c700d1725ce668a25;hp=99d280fd20907e71c2973327289892a098c7f2a5;hpb=dfb78a8b886b9bfa743dad9ea8e045c309cb69b3;p=vlc diff --git a/include/vlc_url.h b/include/vlc_url.h index 99d280fd20..42fe23eb13 100644 --- a/include/vlc_url.h +++ b/include/vlc_url.h @@ -29,7 +29,7 @@ #ifndef __VLC_URL_H # define __VLC_URL_H -typedef struct +struct vlc_url_t { char *psz_protocol; char *psz_username; @@ -42,7 +42,13 @@ typedef struct char *psz_option; char *psz_buffer; /* to be freed */ -} vlc_url_t; +}; + +VLC_EXPORT( char *, unescape_URI_duplicate, ( const char *psz ) ); +VLC_EXPORT( void, unescape_URI, ( char *psz ) ); +VLC_EXPORT( char *, decode_URI_duplicate, ( const char *psz ) ); +VLC_EXPORT( void, decode_URI, ( char *psz ) ); +VLC_EXPORT( char *, encode_URI_component, ( const char *psz ) ); /***************************************************************************** * vlc_UrlParse: @@ -57,6 +63,7 @@ static inline void vlc_UrlParse( vlc_url_t *url, const char *psz_url, char *psz_dup; char *psz_parse; char *p; + char *p2; url->psz_protocol = NULL; url->psz_username = NULL; @@ -73,7 +80,23 @@ static inline void vlc_UrlParse( vlc_url_t *url, const char *psz_url, } url->psz_buffer = psz_parse = psz_dup = strdup( psz_url ); + /* Search a valid protocol */ p = strstr( psz_parse, ":/" ); + if( p != NULL ) + { + char *p2; + for( p2 = psz_parse; p2 < p; p2++ ) + { +#define I(i,a,b) ( (a) <= (i) && (i) <= (b) ) + if( !I(*p2, 'a', 'z' ) && !I(*p2, 'A', 'Z') && !I(*p2, '0', '9') && *p2 != '+' && *p2 != '-' && *p2 != '.' ) + { + p = NULL; + break; + } +#undef I + } + } + if( p != NULL ) { /* we have a protocol */ @@ -86,7 +109,8 @@ static inline void vlc_UrlParse( vlc_url_t *url, const char *psz_url, psz_parse = p; } p = strchr( psz_parse, '@' ); - if( p != NULL ) + p2 = strchr( psz_parse, '/' ); + if( p != NULL && ( p2 != NULL ? p < p2 : 1 ) ) { /* We have a login */ url->psz_username = psz_parse; @@ -98,8 +122,9 @@ static inline void vlc_UrlParse( vlc_url_t *url, const char *psz_url, /* We have a password */ *psz_parse++ = '\0'; url->psz_password = psz_parse; + decode_URI( url->psz_password ); } - + decode_URI( url->psz_username ); psz_parse = p; } @@ -157,8 +182,8 @@ static inline void vlc_UrlParse( vlc_url_t *url, const char *psz_url, *****************************************************************************/ static inline void vlc_UrlClean( vlc_url_t *url ) { - if( url->psz_buffer ) free( url->psz_buffer ); - if( url->psz_host ) free( url->psz_host ); + free( url->psz_buffer ); + free( url->psz_host ); url->psz_protocol = NULL; url->psz_username = NULL; @@ -171,11 +196,6 @@ static inline void vlc_UrlClean( vlc_url_t *url ) url->psz_buffer = NULL; } -VLC_EXPORT( char *, unescape_URI_duplicate, ( const char *psz ) ); -VLC_EXPORT( void, unescape_URI, ( char *psz ) ); -VLC_EXPORT( char *, decode_URI_duplicate, ( const char *psz ) ); -VLC_EXPORT( void, decode_URI, ( char *psz ) ); -VLC_EXPORT( char *, encode_URI_component, ( const char *psz ) ); static inline char *vlc_UrlEncode( const char *psz_url ) {