<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Erinome Lane &#187; c/c++</title>
	<atom:link href="https://tt.erinome.net/tag/cc/feed" rel="self" type="application/rss+xml" />
	<link>https://tt.erinome.net</link>
	<description>a bit of this, a bit of that...</description>
	<lastBuildDate>Mon, 23 Mar 2026 12:51:51 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.2.38</generator>
	<item>
		<title>icecast relay и редиректы</title>
		<link>https://tt.erinome.net/2015/09/830</link>
		<comments>https://tt.erinome.net/2015/09/830#comments</comments>
		<pubDate>Fri, 25 Sep 2015 08:24:29 +0000</pubDate>
		<dc:creator><![CDATA[root]]></dc:creator>
				<category><![CDATA[Сеть и интернет]]></category>
		<category><![CDATA[c/c++]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[грабли]]></category>

		<guid isPermaLink="false">http://tt.erinome.net/?p=830</guid>
		<description><![CDATA[Сервер icecast может использоваться не только для организации вещания новых сетевых медиапотоков, но и для ретрансляции уже существующих. Источник исходного потока при этом может являться распределенной структурой других icecast-подобных серверов, в которых для распределения нагрузки на головном сервере может использоваться &#8230; <a href="https://tt.erinome.net/2015/09/830">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Сервер icecast может использоваться не только для организации вещания новых сетевых медиапотоков, но и для ретрансляции уже существующих. Источник исходного потока при этом может являться распределенной структурой других icecast-подобных серверов, в которых для распределения нагрузки на головном сервере может использоваться простой http-редирект (код 302) на дополнительные узлы.</p>
<p>Хотя relay-функциональность icecast и позволяет разбирать этот код и реагировать на него соответствующим образом, работает это не всегда.<span id="more-830"></span></p>
<p>Можно столкнуться со следующей ситуацией: головной source-сервер перегружен и выдает редиректы на дополнительные серверы, при проверке браузером все корректно, но наш icecast-ретранслятор их будто &#8220;не замечает&#8221; и выдает клиентам ошибку 404. В логах нашего icecast&#8217;а при этом можно увидеть следующие записи:</p>
<pre class="console">[2015-09-25  10:58:40] INFO slave/start_relay_stream Starting relayed source at mountpoint "/&lt;mountname>"
[2015-09-25  10:58:40] INFO slave/open_relay_connection connecting to &lt;main.source>:80
[2015-09-25  10:58:40] INFO slave/open_relay_connection redirect received HTTP://&lt;fallback.source>
</pre>
<p>После этого клиенту выдается ошибка 404 и более ничего содержательного в лог не попадает. Так в чем же дело?</p>
<p>В исходном коде icecast можно найти следующие строки:</p>
<pre class="console">            ICECAST_LOG_INFO("redirect received %s", uri);
            if (strncmp (uri, "http://", 7) != 0)
                break;
</pre>
<p>Так выясняется, что если полученная ссылка из 302-го редиректа не начинается на &#8220;http://&#8221; (в НИЖНЕМ регистре!), то наш icecast с ней не будет делать вообще ничего и сделает вид, что никакого редиректа не было. А как видно из лога, наш источник рассылает редиректы, начинающиеся на HTTP:// в верхнем регистре.</p>
<p>Очевидно, надо научить icecast не обращать внимание на разницу регистров в протоколе. Это можно сделать разными способами, оптимальность и красота которых зависит от качества вашего владения <del>кунг-фу</del> Си. Можно, например, сделать как-то так:</p>
<pre class="console">--- icecast-2.4.2/src/slave.c   2015-04-08 11:06:13.000000000 +0300
+++ icecast-2.4.2-mod/src/slave.c       2015-09-25 10:55:29.495738535 +0300
@@ -238,13 +238,19 @@
         if (strcmp (httpp_getvar (parser, HTTPP_VAR_ERROR_CODE), "302") == 0)
         {
             /* better retry the connection again but with different details */
-            const char *uri, *mountpoint;
-            int len;
+            const char *uri, *mountpoint, *proc = "http://";
+            int i, len;

             uri = httpp_getvar (parser, "location");
+
             ICECAST_LOG_INFO("redirect received %s", uri);
-            if (strncmp (uri, "http://", 7) != 0)
-                break;
+            for (i = 0; i < 7 &#038;&#038; uri[i]; i++) {
+                if ((tolower(uri[i]) - tolower(proc[i])) != 0) {
+                    i = 10;
+                    break;
+                }
+            }
+            if (i == 10) break;
             uri += 7;
             mountpoint = strchr (uri, '/');
             free (mount);
</pre>
<p>Пересобираем, подключаемся, смотрим лог:</p>
<pre class="console">[2015-09-25  11:08:40] INFO slave/start_relay_stream Starting relayed source at mountpoint "/&lt;mountname>"
[2015-09-25  11:08:40] INFO slave/open_relay_connection connecting to &lt;main.source>:80
[2015-09-25  11:08:40] INFO slave/open_relay_connection redirect received HTTP://&lt;fallback.source>
[2015-09-25  11:08:40] INFO slave/open_relay_connection connecting to &lt;fallback.source>:80
[2015-09-25  11:08:40] WARN format/format_get_type Unsupported or legacy stream type: "audio/mpeg". Falling back to generic minimal handler for best effort.
[2015-09-25  11:08:40] INFO source/source_main listener count on /&lt;mountname> now 1</pre>
<p>И все работает.</p>
]]></content:encoded>
			<wfw:commentRss>https://tt.erinome.net/2015/09/830/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
