curlhttpsrc: export same HTTP error status as souphttpsrc
To make it closer to a drop-in replacement for souphttpsrc, expose the same gst_error_message_with_details as souphttpsrc, so that applications can received the HTTP status code and reason when an error occurs.
This commit is contained in:
parent
c2fe4e58ad
commit
2d806477d0
@ -127,6 +127,15 @@ GST_DEBUG_CATEGORY_STATIC (gst_curl_http_src_debug);
|
|||||||
#define GST_CAT_DEFAULT gst_curl_http_src_debug
|
#define GST_CAT_DEFAULT gst_curl_http_src_debug
|
||||||
GST_DEBUG_CATEGORY_STATIC (gst_curl_loop_debug);
|
GST_DEBUG_CATEGORY_STATIC (gst_curl_loop_debug);
|
||||||
|
|
||||||
|
#define CURL_HTTP_SRC_ERROR(src,cat,code,error_message) \
|
||||||
|
do { \
|
||||||
|
GST_ELEMENT_ERROR_WITH_DETAILS ((src), cat, code, ("%s", error_message), \
|
||||||
|
("%s (%d), URL: %s, Redirect to: %s", (src)->reason_phrase, \
|
||||||
|
(src)->status_code, (src)->uri, GST_STR_NULL ((src)->redirect_uri)), \
|
||||||
|
("http-status-code", G_TYPE_UINT, (src)->status_code, \
|
||||||
|
"http-redirect-uri", G_TYPE_STRING, GST_STR_NULL ((src)->redirect_uri), NULL)); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
PROP_0,
|
PROP_0,
|
||||||
@ -710,8 +719,8 @@ gst_curl_http_src_init (GstCurlHttpSrc * source)
|
|||||||
source->http_headers = NULL;
|
source->http_headers = NULL;
|
||||||
source->content_type = NULL;
|
source->content_type = NULL;
|
||||||
source->status_code = 0;
|
source->status_code = 0;
|
||||||
|
source->reason_phrase = NULL;
|
||||||
source->hdrs_updated = FALSE;
|
source->hdrs_updated = FALSE;
|
||||||
|
|
||||||
source->curl_result = CURLE_OK;
|
source->curl_result = CURLE_OK;
|
||||||
gst_caps_replace (&source->caps, NULL);
|
gst_caps_replace (&source->caps, NULL);
|
||||||
|
|
||||||
@ -948,6 +957,8 @@ retry:
|
|||||||
src->state = GSTCURL_NONE;
|
src->state = GSTCURL_NONE;
|
||||||
src->transfer_begun = FALSE;
|
src->transfer_begun = FALSE;
|
||||||
src->status_code = 0;
|
src->status_code = 0;
|
||||||
|
g_free (src->reason_phrase);
|
||||||
|
src->reason_phrase = NULL;
|
||||||
src->hdrs_updated = FALSE;
|
src->hdrs_updated = FALSE;
|
||||||
if (src->http_headers != NULL) {
|
if (src->http_headers != NULL) {
|
||||||
gst_structure_free (src->http_headers);
|
gst_structure_free (src->http_headers);
|
||||||
@ -981,6 +992,8 @@ retry:
|
|||||||
src->state = GSTCURL_NONE;
|
src->state = GSTCURL_NONE;
|
||||||
src->transfer_begun = FALSE;
|
src->transfer_begun = FALSE;
|
||||||
src->status_code = 0;
|
src->status_code = 0;
|
||||||
|
g_free (src->reason_phrase);
|
||||||
|
src->reason_phrase = NULL;
|
||||||
src->hdrs_updated = FALSE;
|
src->hdrs_updated = FALSE;
|
||||||
gst_curl_http_src_destroy_easy_handle (src);
|
gst_curl_http_src_destroy_easy_handle (src);
|
||||||
ret = GST_FLOW_EOS;
|
ret = GST_FLOW_EOS;
|
||||||
@ -1168,8 +1181,8 @@ gst_curl_http_src_handle_response (GstCurlHttpSrc * src)
|
|||||||
|
|
||||||
GSTCURL_FUNCTION_ENTRY (src);
|
GSTCURL_FUNCTION_ENTRY (src);
|
||||||
|
|
||||||
GST_TRACE_OBJECT (src, "status code: %d, curl return code %d",
|
GST_TRACE_OBJECT (src, "status code: %d (%s), curl return code %d",
|
||||||
src->status_code, src->curl_result);
|
src->status_code, src->reason_phrase, src->curl_result);
|
||||||
|
|
||||||
/* Check the curl result code first - anything not 0 is probably a failure */
|
/* Check the curl result code first - anything not 0 is probably a failure */
|
||||||
if (src->curl_result != 0) {
|
if (src->curl_result != 0) {
|
||||||
@ -1186,6 +1199,7 @@ gst_curl_http_src_handle_response (GstCurlHttpSrc * src)
|
|||||||
GST_WARNING_OBJECT (src, "Transfer for URI %s returned error status %u",
|
GST_WARNING_OBJECT (src, "Transfer for URI %s returned error status %u",
|
||||||
src->uri, src->status_code);
|
src->uri, src->status_code);
|
||||||
src->retries_remaining = 0;
|
src->retries_remaining = 0;
|
||||||
|
CURL_HTTP_SRC_ERROR (src, RESOURCE, NOT_FOUND, (src->reason_phrase));
|
||||||
return GST_FLOW_ERROR;
|
return GST_FLOW_ERROR;
|
||||||
} else if (src->status_code == 0) {
|
} else if (src->status_code == 0) {
|
||||||
if (curl_easy_getinfo (src->curl_handle, CURLINFO_TOTAL_TIME,
|
if (curl_easy_getinfo (src->curl_handle, CURLINFO_TOTAL_TIME,
|
||||||
@ -1435,6 +1449,8 @@ gst_curl_http_src_cleanup_instance (GstCurlHttpSrc * src)
|
|||||||
gst_structure_free (src->http_headers);
|
gst_structure_free (src->http_headers);
|
||||||
src->http_headers = NULL;
|
src->http_headers = NULL;
|
||||||
}
|
}
|
||||||
|
g_free (src->reason_phrase);
|
||||||
|
src->reason_phrase = NULL;
|
||||||
gst_caps_replace (&src->caps, NULL);
|
gst_caps_replace (&src->caps, NULL);
|
||||||
|
|
||||||
gst_curl_http_src_destroy_easy_handle (src);
|
gst_curl_http_src_destroy_easy_handle (src);
|
||||||
@ -1818,8 +1834,10 @@ gst_curl_http_src_get_header (void *header, size_t size, size_t nmemb,
|
|||||||
} else {
|
} else {
|
||||||
s->status_code =
|
s->status_code =
|
||||||
(guint) g_ascii_strtoll (status_line_fields[1], NULL, 10);
|
(guint) g_ascii_strtoll (status_line_fields[1], NULL, 10);
|
||||||
|
g_free (s->reason_phrase);
|
||||||
|
s->reason_phrase = g_strdup (status_line_fields[2]);
|
||||||
GST_INFO_OBJECT (s, "Received status %u for request for URI %s: %s",
|
GST_INFO_OBJECT (s, "Received status %u for request for URI %s: %s",
|
||||||
s->status_code, s->uri, status_line_fields[2]);
|
s->status_code, s->uri, s->reason_phrase);
|
||||||
gst_structure_set (s->http_headers, HTTP_STATUS_CODE,
|
gst_structure_set (s->http_headers, HTTP_STATUS_CODE,
|
||||||
G_TYPE_UINT, s->status_code, NULL);
|
G_TYPE_UINT, s->status_code, NULL);
|
||||||
g_strfreev (status_line_fields);
|
g_strfreev (status_line_fields);
|
||||||
|
@ -211,6 +211,7 @@ struct _GstCurlHttpSrc
|
|||||||
GstStructure *http_headers;
|
GstStructure *http_headers;
|
||||||
gchar *content_type;
|
gchar *content_type;
|
||||||
guint status_code;
|
guint status_code;
|
||||||
|
gchar *reason_phrase;
|
||||||
gboolean hdrs_updated;
|
gboolean hdrs_updated;
|
||||||
|
|
||||||
CURLcode curl_result;
|
CURLcode curl_result;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user