0020-libvlc_media-add-cookie_jar-API.patch 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. From fd5f77fbb997bfff3fa4de2e0a0cf5a9bfa12b92 Mon Sep 17 00:00:00 2001
  2. From: Thomas Guillem <thomas@gllm.fr>
  3. Date: Fri, 16 Sep 2016 15:51:11 +0200
  4. Subject: [PATCH 20/21] libvlc_media: add cookie_jar API
  5. ---
  6. include/vlc/libvlc_media.h | 35 +++++++++++++++++++++++++++++++++++
  7. lib/libvlc.sym | 2 ++
  8. lib/media.c | 26 ++++++++++++++++++++++++++
  9. lib/media_internal.h | 2 ++
  10. lib/media_player.c | 7 +++++++
  11. 5 files changed, 72 insertions(+)
  12. diff --git a/include/vlc/libvlc_media.h b/include/vlc/libvlc_media.h
  13. index 15933c5..beb1dd5 100644
  14. --- a/include/vlc/libvlc_media.h
  15. +++ b/include/vlc/libvlc_media.h
  16. @@ -846,6 +846,41 @@ LIBVLC_API
  17. void libvlc_media_slaves_release( libvlc_media_slave_t **pp_slaves,
  18. unsigned int i_count );
  19. +/**
  20. + * Parse a value of an incoming Set-Cookie header (see RFC 6265) and append the
  21. + * cookie to the cookie jar if appropriate. The "secure" attribute can be added
  22. + * to psz_cookie to limit the scope of the cookie to secured channels (https).
  23. + *
  24. + * \note must be called before the first call of libvlc_media_player_play() to
  25. + * take effect. The cookie jar is only used for http/https accesses.
  26. + *
  27. + * \version LibVLC 3.0.0 and later.
  28. + *
  29. + * \param p_md media descriptor object
  30. + * \param psz_cookie header field value of Set-Cookie:
  31. + * "name=value<;attributes>" (must not be NULL)
  32. + * \param psz_host host to which the cookie will be sent (must not be NULL)
  33. + * \param psz_path scope of the cookie (must not be NULL)
  34. + *
  35. + * \return 0 on success, -1 on error.
  36. + */
  37. +LIBVLC_API int
  38. +libvlc_media_cookie_jar_store( libvlc_media_t *p_md, const char *psz_cookie,
  39. + const char *psz_host, const char *psz_path );
  40. +
  41. +/**
  42. + * Clear the cookie jar of a media.
  43. + *
  44. + * \note must be called before the first call of libvlc_media_player_play() to
  45. + * take effect.
  46. + *
  47. + * \version LibVLC 3.0.0 and later.
  48. + *
  49. + * \param p_md media descriptor object
  50. + */
  51. +LIBVLC_API void
  52. +libvlc_media_cookie_jar_clear( libvlc_media_t *p_md );
  53. +
  54. /** @}*/
  55. # ifdef __cplusplus
  56. diff --git a/lib/libvlc.sym b/lib/libvlc.sym
  57. index f297970..4dda39b 100644
  58. --- a/lib/libvlc.sym
  59. +++ b/lib/libvlc.sym
  60. @@ -215,6 +215,8 @@ libvlc_media_set_user_data
  61. libvlc_media_subitems
  62. libvlc_media_tracks_get
  63. libvlc_media_tracks_release
  64. +libvlc_media_cookie_jar_store
  65. +libvlc_media_cookie_jar_clear
  66. libvlc_new
  67. libvlc_playlist_play
  68. libvlc_release
  69. diff --git a/lib/media.c b/lib/media.c
  70. index e01beed..0c56ca0 100644
  71. --- a/lib/media.c
  72. +++ b/lib/media.c
  73. @@ -379,6 +379,8 @@ libvlc_media_t * libvlc_media_new_from_input_item(
  74. * It can give a bunch of item to read. */
  75. p_md->p_subitems = NULL;
  76. + p_md->p_cookie_jar = NULL;
  77. +
  78. p_md->p_event_manager = libvlc_event_manager_new( p_md );
  79. if( unlikely(p_md->p_event_manager == NULL) )
  80. {
  81. @@ -541,6 +543,9 @@ void libvlc_media_release( libvlc_media_t *p_md )
  82. vlc_gc_decref( p_md->p_input_item );
  83. + if( p_md->p_cookie_jar )
  84. + vlc_http_cookies_destroy( p_md->p_cookie_jar );
  85. +
  86. vlc_cond_destroy( &p_md->parsed_cond );
  87. vlc_mutex_destroy( &p_md->parsed_lock );
  88. vlc_mutex_destroy( &p_md->subitems_lock );
  89. @@ -1237,3 +1242,24 @@ void libvlc_media_slaves_release( libvlc_media_slave_t **pp_slaves,
  90. free( pp_slaves );
  91. }
  92. }
  93. +
  94. +int
  95. +libvlc_media_cookie_jar_store( libvlc_media_t *p_md, const char *psz_cookie,
  96. + const char *psz_host, const char *psz_path )
  97. +{
  98. + if( !p_md->p_cookie_jar )
  99. + {
  100. + p_md->p_cookie_jar = vlc_http_cookies_new();
  101. + if( !p_md->p_cookie_jar )
  102. + return -1;
  103. + }
  104. + return vlc_http_cookies_store( p_md->p_cookie_jar, psz_cookie, psz_host,
  105. + psz_path ) ? 0 : -1;
  106. +}
  107. +
  108. +void
  109. +libvlc_media_cookie_jar_clear( libvlc_media_t *p_md )
  110. +{
  111. + if( p_md->p_cookie_jar )
  112. + vlc_http_cookies_clear( p_md->p_cookie_jar );
  113. +}
  114. diff --git a/lib/media_internal.h b/lib/media_internal.h
  115. index f063ddb..17bbd84 100644
  116. --- a/lib/media_internal.h
  117. +++ b/lib/media_internal.h
  118. @@ -30,6 +30,7 @@
  119. #include <vlc_common.h>
  120. #include <vlc_input.h>
  121. +#include <vlc_http.h>
  122. struct libvlc_media_t
  123. {
  124. @@ -48,6 +49,7 @@ struct libvlc_media_t
  125. libvlc_media_parsed_status_t parsed_status;
  126. bool is_parsed;
  127. bool has_asked_preparse;
  128. + vlc_http_cookie_jar_t *p_cookie_jar;
  129. };
  130. /* Media Descriptor */
  131. diff --git a/lib/media_player.c b/lib/media_player.c
  132. index ac30787..fdda68a 100644
  133. --- a/lib/media_player.c
  134. +++ b/lib/media_player.c
  135. @@ -601,6 +601,7 @@ libvlc_media_player_new( libvlc_instance_t *instance )
  136. /* Input */
  137. var_Create (mp, "rate", VLC_VAR_FLOAT|VLC_VAR_DOINHERIT);
  138. + var_Create (mp, "http-cookies", VLC_VAR_ADDRESS);
  139. /* Video */
  140. var_Create (mp, "vout", VLC_VAR_STRING|VLC_VAR_DOINHERIT);
  141. @@ -954,6 +955,12 @@ int libvlc_media_player_play( libvlc_media_player_t *p_mi )
  142. return -1;
  143. }
  144. + if( p_mi->p_md->p_cookie_jar )
  145. + {
  146. + vlc_value_t cookies = { .p_address = p_mi->p_md->p_cookie_jar };
  147. + var_SetChecked( p_mi, "http-cookies", VLC_VAR_ADDRESS, cookies );
  148. + }
  149. +
  150. media_attach_preparsed_event( p_mi->p_md );
  151. p_input_thread = input_Create( p_mi, p_mi->p_md->p_input_item, NULL,
  152. --
  153. 2.9.3