[vlc-commits] http cookies: take explicit secure flag, host and path
Rémi Denis-Courmont
git at videolan.org
Sat Dec 19 15:59:10 CET 2015
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sat Dec 19 16:36:37 2015 +0200| [6c76c9baaa2af52420c1bddea4eda9bae4f4d5e7] | committer: Rémi Denis-Courmont
http cookies: take explicit secure flag, host and path
There is no need for a full URL structure here, and it is sometimes
inconvenient to require one.
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=6c76c9baaa2af52420c1bddea4eda9bae4f4d5e7
---
include/vlc_http.h | 10 ++++--
src/libvlccore.sym | 2 ++
src/misc/httpcookies.c | 87 ++++++++++++++++++++++++++++++++++++------------
3 files changed, 75 insertions(+), 24 deletions(-)
diff --git a/include/vlc_http.h b/include/vlc_http.h
index 14d2fe5..b5ee726 100644
--- a/include/vlc_http.h
+++ b/include/vlc_http.h
@@ -78,10 +78,13 @@ VLC_API void vlc_http_cookies_destroy( vlc_http_cookie_jar_t * p_jar );
* Parse a value of an incoming Set-Cookie header and append the
* cookie to the cookie jar if appropriate.
*
- * @param p_jar cookie jar object
- * @param psz_cookie_header value of Set-Cookie
+ * @param jar cookie jar object
+ * @param cookie header field value of Set-Cookie
* @return true, if the cookie was added, false otherwise
*/
+VLC_API bool vlc_http_cookies_store( vlc_http_cookie_jar_t *jar,
+ const char *cookie, bool secure, const char *host, const char *path );
+
VLC_API bool vlc_http_cookies_append( vlc_http_cookie_jar_t * p_jar, const char * psz_cookie_header, const vlc_url_t * p_url );
/**
@@ -91,6 +94,9 @@ VLC_API bool vlc_http_cookies_append( vlc_http_cookie_jar_t * p_jar, const char
* @param p_url the URL for which the cookies are returned
* @return A string consisting of semicolon-separated cookie NAME=VALUE pairs.
*/
+VLC_API char *vlc_http_cookies_fetch( vlc_http_cookie_jar_t *jar, bool secure,
+ const char *host, const char *path );
+
VLC_API char *vlc_http_cookies_for_url( vlc_http_cookie_jar_t * p_jar, const vlc_url_t * p_url );
#endif /* VLC_HTTP_H */
diff --git a/src/libvlccore.sym b/src/libvlccore.sym
index a97ace1..c05acef 100644
--- a/src/libvlccore.sym
+++ b/src/libvlccore.sym
@@ -139,6 +139,8 @@ http_auth_ParseAuthenticationInfoHeader
http_auth_FormatAuthorizationHeader
vlc_http_cookies_new
vlc_http_cookies_destroy
+vlc_http_cookies_store
+vlc_http_cookies_fetch
vlc_http_cookies_append
vlc_http_cookies_for_url
httpd_ClientIP
diff --git a/src/misc/httpcookies.c b/src/misc/httpcookies.c
index 7bd9850..1d90f24 100644
--- a/src/misc/httpcookies.c
+++ b/src/misc/httpcookies.c
@@ -51,14 +51,14 @@ struct vlc_http_cookie_jar_t
vlc_mutex_t lock;
};
-static http_cookie_t * cookie_parse( const char * cookie_header, const vlc_url_t * url );
+static http_cookie_t * cookie_parse( const char *, const char *, const char * );
static void cookie_destroy( http_cookie_t * p_cookie );
static char * cookie_get_content( const char * cookie );
static char * cookie_get_domain( const char * cookie );
static char * cookie_get_attribute_value( const char * cookie, const char *attr );
static bool cookie_has_attribute( const char * cookie, const char *attr );
-static bool cookie_should_be_sent( const http_cookie_t * cookie, const vlc_url_t * url );
-static bool cookie_is_valid( const http_cookie_t * cookie, const char *host );
+static bool cookie_should_be_sent(const http_cookie_t *, bool, const char *, const char *);
+static bool cookie_is_valid(const http_cookie_t *, bool, const char *, const char *);
static bool cookie_domain_matches( const http_cookie_t * cookie, const char *host );
static bool cookie_path_matches( const http_cookie_t * cookie, const char *path );
static bool cookie_domain_is_public_suffix( const char *domain );
@@ -91,14 +91,20 @@ void vlc_http_cookies_destroy( vlc_http_cookie_jar_t * p_jar )
free( p_jar );
}
-bool vlc_http_cookies_append( vlc_http_cookie_jar_t * p_jar, const char * psz_cookie_header, const vlc_url_t *p_url )
+bool vlc_http_cookies_store(vlc_http_cookie_jar_t *p_jar, const char *cookies,
+ bool secure, const char *host, const char *path)
{
+ assert(host != NULL);
+ assert(path != NULL);
+
int i;
- http_cookie_t *cookie = cookie_parse( psz_cookie_header, p_url );
- if( !cookie || !cookie_is_valid( cookie, p_url->psz_host ) )
+ http_cookie_t *cookie = cookie_parse(cookies, host, path);
+ if (cookie == NULL)
+ return false;
+ if (!cookie_is_valid(cookie, secure, host, path))
{
- cookie_destroy( cookie );
+ cookie_destroy(cookie);
return false;
}
@@ -131,7 +137,25 @@ bool vlc_http_cookies_append( vlc_http_cookie_jar_t * p_jar, const char * psz_co
return true;
}
-char *vlc_http_cookies_for_url( vlc_http_cookie_jar_t * p_jar, const vlc_url_t * p_url )
+bool vlc_http_cookies_append(vlc_http_cookie_jar_t *jar,
+ const char *cookies, const vlc_url_t *url)
+{
+ bool secure;
+
+ if (url->psz_protocol == NULL || url->psz_host == NULL
+ || url->psz_path == NULL)
+ return false;
+ else if (!vlc_ascii_strcasecmp(url->psz_protocol, "https"))
+ secure = true;
+ else
+ secure = false;
+
+ return vlc_http_cookies_store(jar, cookies, secure, url->psz_host,
+ url->psz_path);
+}
+
+char *vlc_http_cookies_fetch(vlc_http_cookie_jar_t *p_jar, bool secure,
+ const char *host, const char *path)
{
int i;
char *psz_cookiebuf = NULL;
@@ -141,7 +165,7 @@ char *vlc_http_cookies_for_url( vlc_http_cookie_jar_t * p_jar, const vlc_url_t *
for( i = 0; i < vlc_array_count( &p_jar->cookies ); i++ )
{
const http_cookie_t * cookie = vlc_array_item_at_index( &p_jar->cookies, i );
- if ( cookie_should_be_sent( cookie, p_url ) )
+ if (cookie_should_be_sent(cookie, secure, host, path))
{
char *psz_updated_buf = NULL;
if ( asprintf(&psz_updated_buf, "%s%s%s=%s",
@@ -165,13 +189,31 @@ char *vlc_http_cookies_for_url( vlc_http_cookie_jar_t * p_jar, const vlc_url_t *
return psz_cookiebuf;
}
-static http_cookie_t * cookie_parse( const char * cookie_header, const vlc_url_t * url )
+char *vlc_http_cookies_for_url(vlc_http_cookie_jar_t *jar,
+ const vlc_url_t *url)
+{
+ bool secure;
+
+ if (url->psz_protocol == NULL || url->psz_host == NULL
+ || url->psz_path == NULL)
+ return NULL;
+ else if (!vlc_ascii_strcasecmp(url->psz_protocol, "https"))
+ secure = true;
+ else
+ secure = false;
+
+ return vlc_http_cookies_fetch(jar, secure, url->psz_host, url->psz_path);
+}
+
+
+static http_cookie_t *cookie_parse(const char *value,
+ const char *host, const char *path)
{
http_cookie_t *cookie = calloc( 1, sizeof( http_cookie_t ) );
if ( unlikely( !cookie ) )
return NULL;
- char *content = cookie_get_content( cookie_header );
+ char *content = cookie_get_content(value);
if ( !content )
{
cookie_destroy( cookie );
@@ -190,24 +232,24 @@ static http_cookie_t * cookie_parse( const char * cookie_header, const vlc_url_t
cookie->psz_value = NULL;
}
- cookie->psz_domain = cookie_get_domain( cookie_header );
+ cookie->psz_domain = cookie_get_domain(value);
if ( !cookie->psz_domain || strlen(cookie->psz_domain) == 0 )
{
free(cookie->psz_domain);
- cookie->psz_domain = strdup( url->psz_host );
+ cookie->psz_domain = strdup(host);
cookie->b_host_only = true;
}
else
cookie->b_host_only = false;
- cookie->psz_path = cookie_get_attribute_value( cookie_header, "path" );
+ cookie->psz_path = cookie_get_attribute_value(value, "path" );
if ( !cookie->psz_path || strlen(cookie->psz_path) == 0 )
{
free(cookie->psz_path);
- cookie->psz_path = cookie_default_path( url->psz_path );
+ cookie->psz_path = cookie_default_path(path);
}
- cookie->b_secure = cookie_has_attribute( cookie_header, "secure" );
+ cookie->b_secure = cookie_has_attribute(value, "secure" );
FREENULL( content );
@@ -299,17 +341,18 @@ static bool cookie_has_attribute( const char * cookie, const char *attr )
return false;
}
-static bool cookie_should_be_sent( const http_cookie_t * cookie, const vlc_url_t * url )
+static bool cookie_should_be_sent(const http_cookie_t *cookie, bool secure,
+ const char *host, const char *path)
{
- bool protocol_ok = !cookie->b_secure ||
- ( url->psz_protocol && strcasecmp(url->psz_protocol, "https") == 0 );
- bool domain_ok = cookie_domain_matches( cookie, url->psz_host );
- bool path_ok = cookie_path_matches( cookie, url->psz_path );
+ bool protocol_ok = secure || !cookie->b_secure;
+ bool domain_ok = cookie_domain_matches(cookie, host);
+ bool path_ok = cookie_path_matches(cookie, path);
return protocol_ok && domain_ok && path_ok;
}
/* Check if a cookie from host should be added to the cookie jar */
-static bool cookie_is_valid( const http_cookie_t * cookie, const char *host )
+static bool cookie_is_valid(const http_cookie_t * cookie, bool secure,
+ const char *host, const char *path)
{
return cookie && cookie->psz_name && strlen(cookie->psz_name) > 0 &&
cookie->psz_domain &&
More information about the vlc-commits
mailing list