[vlc-devel] [PATCH 3/3] access/http: Implement STREAM_GET_HTTP_HEADER

Marvin Scholz epirat07 at gmail.com
Mon Aug 12 11:56:08 CEST 2019


---
 modules/access/http/access.c   |  7 +++++++
 modules/access/http/file.h     |  1 +
 modules/access/http/live.h     |  1 +
 modules/access/http/resource.c | 10 ++++++++++
 modules/access/http/resource.h |  7 +++++++
 5 files changed, 26 insertions(+)

diff --git a/modules/access/http/access.c b/modules/access/http/access.c
index a3805d0d42..bab49e4752 100644
--- a/modules/access/http/access.c
+++ b/modules/access/http/access.c
@@ -104,6 +104,13 @@ static int FileControl(stream_t *access, int query, va_list args)
             *va_arg(args, char **) = vlc_http_file_get_type(sys->resource);
             break;
 
+        case STREAM_GET_HTTP_HEADER:
+        {
+            const char *header = va_arg(args, const char*);
+            *va_arg(args, char **) = vlc_http_file_get_header(sys->resource, header);
+            break;
+        }
+
         case STREAM_SET_PAUSE_STATE:
             break;
 
diff --git a/modules/access/http/file.h b/modules/access/http/file.h
index 802cf8f93a..e6107aa0b2 100644
--- a/modules/access/http/file.h
+++ b/modules/access/http/file.h
@@ -82,6 +82,7 @@ struct block_t *vlc_http_file_read(struct vlc_http_resource *);
 #define vlc_http_file_get_status vlc_http_res_get_status
 #define vlc_http_file_get_redirect vlc_http_res_get_redirect
 #define vlc_http_file_get_type vlc_http_res_get_type
+#define vlc_http_file_get_header vlc_http_res_get_header
 #define vlc_http_file_destroy vlc_http_res_destroy
 
 /** @} */
diff --git a/modules/access/http/live.h b/modules/access/http/live.h
index 80af97119b..bbedd2f1f3 100644
--- a/modules/access/http/live.h
+++ b/modules/access/http/live.h
@@ -36,6 +36,7 @@ struct block_t *vlc_http_live_read(struct vlc_http_resource *);
 #define vlc_http_live_get_status vlc_http_res_get_status
 #define vlc_http_live_get_redirect vlc_http_res_get_redirect
 #define vlc_http_live_get_type vlc_http_res_get_type
+#define vlc_http_live_get_header vlc_http_res_get_header
 #define vlc_http_live_destroy vlc_http_res_destroy
 
 /** @} */
diff --git a/modules/access/http/resource.c b/modules/access/http/resource.c
index 9a28bb50f3..240b8b8f22 100644
--- a/modules/access/http/resource.c
+++ b/modules/access/http/resource.c
@@ -319,6 +319,16 @@ char *vlc_http_res_get_type(struct vlc_http_resource *res)
     return (type != NULL) ? strdup(type) : NULL;
 }
 
+char *vlc_http_res_get_header(struct vlc_http_resource *res, const char *header)
+{
+    int status = vlc_http_res_get_status(res);
+    if (status < 200 || status >= 300)
+        return NULL;
+
+    const char *value = vlc_http_msg_get_header(res->response, header);
+    return (value != NULL) ? strdup(value) : NULL;
+}
+
 struct block_t *vlc_http_res_read(struct vlc_http_resource *res)
 {
     int status = vlc_http_res_get_status(res);
diff --git a/modules/access/http/resource.h b/modules/access/http/resource.h
index 22b5abac64..c2f1ef7dd5 100644
--- a/modules/access/http/resource.h
+++ b/modules/access/http/resource.h
@@ -91,6 +91,13 @@ char *vlc_http_res_get_redirect(struct vlc_http_resource *);
  */
 char *vlc_http_res_get_type(struct vlc_http_resource *);
 
+/**
+ * Gets a HTTP header value
+ *
+ * @return Heap-allocated header value string, or NULL if unknown.
+ */
+char *vlc_http_res_get_header(struct vlc_http_resource *res, const char *header);
+
 /**
  * Reads data.
  */
-- 
2.19.1



More information about the vlc-devel mailing list