| /* |
| * GstCurlHttpSrc |
| * Copyright 2017 British Broadcasting Corporation - Research and Development |
| * |
| * Author: Sam Hurst <samuelh@rd.bbc.co.uk> |
| * |
| * Permission is hereby granted, free of charge, to any person obtaining a |
| * copy of this software and associated documentation files (the "Software"), |
| * to deal in the Software without restriction, including without limitation |
| * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
| * and/or sell copies of the Software, and to permit persons to whom the |
| * Software is furnished to do so, subject to the following conditions: |
| * |
| * The above copyright notice and this permission notice shall be included in |
| * all copies or substantial portions of the Software. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
| * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
| * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
| * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
| * DEALINGS IN THE SOFTWARE. |
| * |
| * Alternatively, the contents of this file may be used under the |
| * GNU Lesser General Public License Version 2.1 (the "LGPL"), in |
| * which case the following provisions apply instead of the ones |
| * mentioned above: |
| * |
| * This library is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU Library General Public |
| * License as published by the Free Software Foundation; either |
| * version 2 of the License, or (at your option) any later version. |
| * |
| * This library is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| * Library General Public License for more details. |
| * |
| * You should have received a copy of the GNU Library General Public |
| * License along with this library; if not, write to the |
| * Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
| * Boston, MA 02111-1307, USA. |
| */ |
| |
| /* |
| * This header file contains definitions only for |
| */ |
| |
| #ifndef GSTCURLHTTPSRC_H_ |
| #define GSTCURLHTTPSRC_H_ |
| |
| #include <gst/gst.h> |
| #include <string.h> |
| #include <ctype.h> |
| #include <stdlib.h> |
| #include <unistd.h> |
| #include <gst/base/gstpushsrc.h> |
| |
| #include "curltask.h" |
| |
| G_BEGIN_DECLS |
| /* #defines don't like whitespacey bits */ |
| #define GST_TYPE_CURLHTTPSRC \ |
| (gst_curl_http_src_get_type()) |
| #define GST_CURLHTTPSRC(obj) \ |
| (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_CURLHTTPSRC,GstCurlHttpSrc)) |
| #define GST_CURLHTTPSRC_CLASS(klass) \ |
| (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_CURLHTTPSRC,GstCurlHttpSrcClass)) |
| #define GST_IS_CURLHTTPSRC(obj) \ |
| (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_CURLHTTPSRC)) |
| #define GST_IS_CURLHTTPSRC_CLASS(klass) \ |
| (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_CURLHTTPSRC)) |
| |
| #if GSTCURL_FUNCTIONTRACE |
| #define GSTCURL_FUNCTION_ENTRY(x) GST_DEBUG_OBJECT(x, "Entering function"); |
| #define GSTCURL_FUNCTION_EXIT(x) GST_DEBUG_OBJECT(x, "Leaving function"); |
| #else |
| #define GSTCURL_FUNCTION_ENTRY(x) |
| #define GSTCURL_FUNCTION_EXIT(x) |
| #endif |
| typedef struct _GstCurlHttpSrc GstCurlHttpSrc; |
| typedef struct _GstCurlHttpSrcClass GstCurlHttpSrcClass; |
| typedef struct _GstCurlHttpSrcMultiTaskContext GstCurlHttpSrcMultiTaskContext; |
| typedef struct _GstCurlHttpSrcQueueElement GstCurlHttpSrcQueueElement; |
| |
| #define HTTP_HEADERS_NAME "http-headers" |
| #define HTTP_STATUS_CODE "http-status-code" |
| #define URI_NAME "uri" |
| #define REQUEST_HEADERS_NAME "request-headers" |
| #define RESPONSE_HEADERS_NAME "response-headers" |
| #define REDIRECT_URI_NAME "redirection-uri" |
| |
| typedef enum |
| { |
| GSTCURL_HTTP_VERSION_1_0, |
| GSTCURL_HTTP_VERSION_1_1, |
| #ifdef CURL_VERSION_HTTP2 |
| GSTCURL_HTTP_VERSION_2_0, |
| #endif |
| GSTCURL_HTTP_NOT, /* For future use, incase not HTTP protocol! */ |
| GSTCURL_HTTP_VERSION_MAX |
| } GstCurlHttpVersion; |
| |
| struct _GstCurlHttpSrcMultiTaskContext |
| { |
| GstTask *task; |
| GRecMutex task_rec_mutex; |
| GMutex mutex; |
| guint refcount; |
| GCond signal; |
| |
| GstCurlHttpSrc *request_removal_element; |
| |
| GstCurlHttpSrcQueueElement *queue; |
| |
| enum |
| { |
| GSTCURL_MULTI_LOOP_STATE_WAIT = 0, |
| GSTCURL_MULTI_LOOP_STATE_QUEUE_EVENT, |
| GSTCURL_MULTI_LOOP_STATE_RUNNING, |
| GSTCURL_MULTI_LOOP_STATE_REQUEST_REMOVAL, |
| GSTCURL_MULTI_LOOP_STATE_STOP, |
| GSTCURL_MULTI_LOOP_STATE_MAX |
| } state; |
| |
| /* < private > */ |
| CURLM *multi_handle; |
| }; |
| |
| struct _GstCurlHttpSrcClass |
| { |
| GstPushSrcClass parent_class; |
| |
| GstCurlHttpSrcMultiTaskContext multi_task_context; |
| }; |
| |
| /* |
| * Our instance class. |
| */ |
| struct _GstCurlHttpSrc |
| { |
| GstPushSrc element; |
| |
| /* < private > */ |
| GMutex uri_mutex; /* Make the URIHandler get/set thread safe */ |
| /* |
| * Things to tell libcURL about to build up the request message. |
| */ |
| /* Type Name Curl Option */ |
| gchar *uri; /* CURLOPT_URL */ |
| gchar *redirect_uri; /* CURLINFO_REDIRECT_URL */ |
| gchar *username; /* CURLOPT_USERNAME */ |
| gchar *password; /* CURLOPT_PASSWORD */ |
| gchar *proxy_uri; /* CURLOPT_PROXY */ |
| gchar *no_proxy_list; /* CURLOPT_NOPROXY */ |
| gchar *proxy_user; /* CURLOPT_PROXYUSERNAME */ |
| gchar *proxy_pass; /* CURLOPT_PROXYPASSWORD */ |
| |
| /* Header options */ |
| gchar **cookies; /* CURLOPT_COOKIELIST */ |
| gint number_cookies; |
| gchar *user_agent; /* CURLOPT_USERAGENT */ |
| GstStructure *request_headers; /* CURLOPT_HTTPHEADER */ |
| struct curl_slist *slist; |
| gboolean accept_compressed_encodings; /* CURLOPT_ACCEPT_ENCODING */ |
| |
| /* Connection options */ |
| glong allow_3xx_redirect; /* CURLOPT_FOLLOWLOCATION */ |
| glong max_3xx_redirects; /* CURLOPT_MAXREDIRS */ |
| gboolean keep_alive; /* CURLOPT_TCP_KEEPALIVE */ |
| gint timeout_secs; /* CURLOPT_TIMEOUT */ |
| gboolean strict_ssl; /* CURLOPT_SSL_VERIFYPEER */ |
| gchar* custom_ca_file; /* CURLOPT_CAINFO */ |
| |
| gint total_retries; |
| gint retries_remaining; |
| |
| /*TODO As the following are all multi options, move these to curl task */ |
| guint max_connection_time; /* */ |
| guint max_conns_per_server; /* CURLMOPT_MAX_HOST_CONNECTIONS */ |
| guint max_conns_per_proxy; /* ?!? */ |
| guint max_conns_global; /* CURLMOPT_MAXCONNECTS */ |
| /* END multi options */ |
| |
| /* Some stuff for HTTP/2 */ |
| GstCurlHttpVersion preferred_http_version; |
| |
| enum |
| { |
| GSTCURL_NONE, |
| GSTCURL_OK, |
| GSTCURL_DONE, |
| GSTCURL_UNLOCK, |
| GSTCURL_REMOVED, |
| GSTCURL_BAD_QUEUE_REQUEST, |
| GSTCURL_TOTAL_ERROR, |
| GSTCURL_PIPELINE_NULL, |
| GSTCURL_MAX |
| } state, pending_state; |
| CURL *curl_handle; |
| GMutex buffer_mutex; |
| GCond signal; |
| gchar *buffer; |
| guint buffer_len; |
| gboolean transfer_begun; |
| gboolean data_received; |
| |
| /* |
| * Response Headers |
| */ |
| GstStructure *http_headers; |
| gchar *content_type; |
| guint status_code; |
| gboolean hdrs_updated; |
| |
| CURLcode curl_result; |
| char curl_errbuf[CURL_ERROR_SIZE]; |
| |
| GstCaps *caps; |
| }; |
| |
| enum |
| { |
| PROP_0, |
| PROP_URI, |
| PROP_USERNAME, |
| PROP_PASSWORD, |
| PROP_PROXYURI, |
| PROP_PROXYUSERNAME, |
| PROP_PROXYPASSWORD, |
| PROP_COOKIES, |
| PROP_USERAGENT, |
| PROP_HEADERS, |
| PROP_COMPRESS, |
| PROP_REDIRECT, |
| PROP_MAXREDIRECT, |
| PROP_KEEPALIVE, |
| PROP_TIMEOUT, |
| PROP_STRICT_SSL, |
| PROP_SSL_CA_FILE, |
| PROP_RETRIES, |
| PROP_CONNECTIONMAXTIME, |
| PROP_MAXCONCURRENT_SERVER, |
| PROP_MAXCONCURRENT_PROXY, |
| PROP_MAXCONCURRENT_GLOBAL, |
| PROP_HTTPVERSION, |
| PROP_MAX |
| }; |
| |
| GType gst_curl_http_src_get_type (void); |
| |
| G_END_DECLS |
| #endif /* GSTCURLHTTPSRC_H_ */ |