$_GET и FastCGI

Сегодня решил решил запустить 2й анонсер который бы находился в Интернет и собирал статистику по интернет пользователям.

Но столкнулся с проблемой что где то 20 — 30% моих торрентов обновились с ошибками в виде не правильного peer_id или info_hash.

Обрыл весь скрипт от начала до места где возникает ошибка, не нашел.

Плюнув на все написал функцию ( на основе старой из Multi Scrape ) которая убила 2х зайцев.

1. Исправила мою проблему.
2. Если скрипту кто-то подумает передать массив он не обработается ( будет очень полезно начинающим программистам, когда их скрипт должен принимать только строковые параметры из $_GET ).

Сама функция

function clean_string_get ()
{
    unset($_GET);

	$query = explode("&", $_SERVER['QUERY_STRING']);

    foreach($query as $k)
    {
        list($key, $value) = explode('=', $k);

        $key   = str_replace('?', '', $key);
		$value = urldecode($value);

		if ($key != '' and $value !='')
		{
			$_GET[$key] = (string) $value;
		}
    }
}

Замечу, что данная функция уначтожит стандартный массив $_GET и создаст свой, в котором все ключи строки (string).

Обработка Multi Scrape запросов

На этот раз мне захотелось еще раз вые выпиндриться, и сделать в своем scrape поддержку Multi Scrape запросов.
Долгие пляски вокруг $_GET, фактически ничего не дали но зато дал плоды $_SERVER['QUERY_STRING'].
Зацепившись за него минут за 15 накатал простенькую функцию которая выдает массив хеш-сумм переданные в URI. В случае если хотя бы одна хеш-сумма не будет равна 20 символам то функция завершиться с ошибкой Invalid info_hash.

Сама функция:

function scrape_parse_query()
{
    $info_hash = array();
    $query     = $_SERVER['QUERY_STRING'];

    $query = explode("&", $query);

    foreach($query as $k)
    {
        list($key, $value) = explode('=', $k);
        $key   = str_replace('?', '', $key);
	$value = urldecode($value);

        if($key == 'info_hash' && strlen($value) == 20)
        {
		$info_hash[] = bin2hex($value);
        }
        else
        {
            if(strlen($value) != 20 and $key == 'info_hash')
            {
		msg_die('Invalid info_hash');
            }
        }
    }

    return $info_hash;
}

На выходе у функции будет массив хеш-сумм (в BTIH).
Что с данными хеш суммами делать, решайте сами.
Кстати, чуть не забыл сказать, данная функция писалась под scrape на основе TorrentPier.

Из compact в обычный вид

Недавно понадобилось протестировать собственный же анонсер, по всем критериям и один из них нормальная работа в compact режиме (т.е. пиров нам анонсер отдает в закодированном виде, что уменьшает в свою очередь трафик между сервером и клиентами).

Для того чтобы прекратить из compact в обычный вид написал функцию, которая до ужаса банальна, но работает:

function peers_to_array($data)
{
	if (!is_array($data['peers']))
	{
		$new_peers = array();

		while (strlen($data['peers']) > 0)
		{
			list(, $ip)   = @unpack('N', substr($data['peers'], 0, 4));
			list(, $port) = @unpack('n', substr($data['peers'], 4, 6));

			$new_peers[] = array
			(
				'ip'   => long2ip($ip),
				'port' => $port
			);

			$data['peers'] = substr($data['peers'], 6);
		}

		$data['peers'] = $new_peers;
		unset($new_peers);
	}

	return $data;
}

:) Как ее использовать я думаю объяснять не нужно.