I’m debugging an issue with a stream that fails to playback on a playbin3 pipeline (tested on 1.24 & 1.26):
gst-launch-1.0 souphttpsrc location=https://frontend.streamonkey.net/radio886-onair/stream/mp3 ! fakesink
Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
Got context from element 'souphttpsrc0': gst.soup.session=context, session=(GstSoupSession)NULL;
ERROR: from element /GstPipeline:pipeline0/GstSoupHTTPSrc:souphttpsrc0: Internal data stream error.
Additional debug info:
../libs/gst/base/gstbasesrc.c(3177): gst_base_src_loop (): /GstPipeline:pipeline0/GstSoupHTTPSrc:souphttpsrc0:
streaming stopped, reason error (-5)
ERROR: pipeline doesn't want to preroll.
Setting pipeline to NULL ...
Freeing pipeline ...
Enabling some more debugging, it seems we get no data:
0:00:00.297647697 209048 0x58547dae3b60 TRACE souputils gstsouputils.c:66:gst_soup_util_log_printer_cb:<GstSoupSession@0x58547db5d880> HTTP_SESSION(M): > GET /radio886-onair/stream/mp3 HTTP/2
0:00:00.297676896 209048 0x58547dae3b60 TRACE souputils gstsouputils.c:66:gst_soup_util_log_printer_cb:<GstSoupSession@0x58547db5d880> HTTP_SESSION(M): > Soup-Debug-Timestamp: 1754060987
0:00:00.297683719 209048 0x58547dae3b60 TRACE souputils gstsouputils.c:66:gst_soup_util_log_printer_cb:<GstSoupSession@0x58547db5d880> HTTP_SESSION(M): > Soup-Debug: SoupSession 1 (0x7a44cc001770), SoupMessage 1 (0x7a44c8005100), GSocket 1 (0x7a44cc019ee0)
0:00:00.297691492 209048 0x58547dae3b60 TRACE souputils gstsouputils.c:66:gst_soup_util_log_printer_cb:<GstSoupSession@0x58547db5d880> HTTP_SESSION(H): > User-Agent: GStreamer souphttpsrc 1.24.2 libsoup/3.4.4
0:00:00.297697132 209048 0x58547dae3b60 TRACE souputils gstsouputils.c:66:gst_soup_util_log_printer_cb:<GstSoupSession@0x58547db5d880> HTTP_SESSION(H): > Accept-Encoding: identity
0:00:00.297702653 209048 0x58547dae3b60 TRACE souputils gstsouputils.c:66:gst_soup_util_log_printer_cb:<GstSoupSession@0x58547db5d880> HTTP_SESSION(H): > icy-metadata: 1
0:00:00.297708011 209048 0x58547dae3b60 TRACE souputils gstsouputils.c:66:gst_soup_util_log_printer_cb:<GstSoupSession@0x58547db5d880> HTTP_SESSION(M):
0:00:00.320053508 209048 0x58547dae3b60 TRACE souputils gstsouputils.c:66:gst_soup_util_log_printer_cb:<GstSoupSession@0x58547db5d880> HTTP_SESSION(M): < HTTP/2 0 (null)
0:00:00.320073667 209048 0x58547dae3b60 TRACE souputils gstsouputils.c:66:gst_soup_util_log_printer_cb:<GstSoupSession@0x58547db5d880> HTTP_SESSION(M): < Soup-Debug-Timestamp: 1754060987
0:00:00.320079927 209048 0x58547dae3b60 TRACE souputils gstsouputils.c:66:gst_soup_util_log_printer_cb:<GstSoupSession@0x58547db5d880> HTTP_SESSION(M): < Soup-Debug: SoupMessage 1 (0x7a44c8005100)
0:00:00.320085683 209048 0x58547dae3b60 TRACE souputils gstsouputils.c:66:gst_soup_util_log_printer_cb:<GstSoupSession@0x58547db5d880> HTTP_SESSION(M):
Looking at the request with curl, it turns out to be a redirect:
$ curl -I https://frontend.streamonkey.net/radio886-onair/stream/mp3
HTTP/2 302
access-control-allow-origin: *
cache-control: no-cache
content-type: text/html; charset=utf-8
location: https://edge18.streamonkey.net/radio886-onair/stream/mp3
server: streaMonkey streaming Server Loadbalancer Native
date: Fri, 01 Aug 2025 15:07:10 GMT
Using the URL in the location header directly in the pipeline works! So it’s not that http/2 itself is unsupported.
Interestingly, when I replace the https with http, the pipeline does succeed in following the redirect.
$ curl -I http://frontend.streamonkey.net/radio886-onair/stream/mp3
HTTP/1.1 302 Found
Access-Control-Allow-Origin: *
Cache-Control: no-cache
Connection: close
Content-Type: text/html; charset=utf-8
Location: http://edge10.streamonkey.net/radio886-onair/stream/mp3
Server: streaMonkey streaming Server Loadbalancer Native
Date: Fri, 01 Aug 2025 15:06:58 GMT
- http/1.1 without redirect: works

- http/1.1 with redirect: works

- http/2 without redirect: works

- http/2 with redirect: does not work

(tested on gstreamer 1.24 + libsoup 3.4.4, and gstreamer 1.26 + libsoup 3.6.5)
Is following redirects on http/2 not implemented? Is it off by default somehow, and can it be configured?