LGSL и Counter-Strike: Source

В мониторинге заметил странную особенность, у некоторых CSS серверов напрочь не хотела отображаться страница с подробной информацией.

Разобраться дошли руки только сейчас. Все оказалось в том что сервера отвечали сжатыми данными (BZip), а LGSL их не очень правильно воспринимал.

Если быть более точным то, LGSL стандартно принимает все пакеты, обнаруживает по первому пакету что это 4й тип (BZip данные) и режет, тут то собака и зарыта. От серверов чаще всего приходило 2 пакета, начало и продолжение. А LGSL воспринимал это как 2 разных пакета и обрезал в начале по 18 байт. Хотя если пакет «продолжение» у него нужно обрезать 10 байт.

Не буду дальше продолжать и углубляться в мат. часть предоставлю сразу исправления:

Открыть: ./lgsl_files/lgsl_protocol.php
Найти:

elseif ($packet_type == 4) { $packet_order = ord($packet[9]);      $packet = substr($packet, 18); }

Заменить на:

			elseif ($packet_type == 4)
			{
				$packet_order = ord($packet[9]);

				if ($packet_order == 0)
				{
					list(, $packet_checksum) = unpack('V', substr($packet, 14, 4)); // CRC32 checksum
					$packet = substr($packet, 18);
				}
				else
				{
					$packet = substr($packet, 10);
				}
			}

Найти:

$buffer = bzdecompress($buffer);

Добавить ниже:

	  		if (crc32($buffer) != $packet_checksum)
			{
				$server['e']['bzip2'] = "unavailable"; $lgsl_need['e'] = FALSE;
				return TRUE;
			}

Закрыть и загрузить на сервер.
Все.