Last updated: Mon Oct 9 18:34:56 2000


Идею этой программы подсказал мне Дамир Бикмухаметов и многочисленные перекодировщики, сделанные под разные UNIX-ы. Так как не все клиентские программы поддерживают существующий бардак в области кодировок русского языка в сети Internet (а в ней одновременно существуют стандарты KOI8-R, CP-1251 (Win), ISO-8859-5 (ГОСТ, основная), CP-866 (ГОСТ, альтернативная) и Mac), то приходится или постоянно менять кодовую страницу в бровзерах html или просто вздыхать, если нужной странице нет в необходимой кодировке.

Под OS/2 эта проблема вставала, пожалуй, наиболее сильно - 'родной' бровзер IBM WebExplorer первоначально не поддерживал вообше ни одну кодировку русского языка (позднее он обрел поддержку ISO-8859-5, не слишком распространенную в интернете, а еще позже - CP-1251). Поэтому я решил написать программу, которая бы служила посредником между клиентским бровзером и каким-нибудь прокси или www-сервером и перекодировала бы страницы в соответствии с желаниями клиента.

Краткая история программы :

1.0 - первый рабочий вариант. Перекодирует из KOI8-R, CP-866, CP-1251, ISO-8859-5 и определяемой пользователем кодировки в любую из этих же кодировок. Определенной новацией для программ такого типа послужило динамическое построение таблиц перекодировки для клиентов с кодовой таблицей, отличной от CP-866, что сильно уменьшило занимаемый объем и сложность настройки - понадобилось хранить только по одному варианту таблицы перекодировки для четырех кодировок. Программа получилась быстрой и легкой, благодаря использованию тредов и блокирующих вызовов.

1.1 - Добавилась реакция на подстроку '; charset=' в mime-заголовке с соответствующим переключением на нужную кодовую таблицу. Сама подстрока вырезается для совместимости с IBM WebExplorer.

1.3 - Добавилась перекодировка hex-последовательностей, типа '%A1%A2%A3' в запросе клиента и тексте html для поддержки заполнения форм на русском языке.

2.0 - Поиск строк сделан через библиотеку regexp (больше шансов, что найдет требуемые строки и выберет правильную кодовую таблицу). Добавлен поиск тэга META HTTP-EQUIV="Content-Type" CONTENT="text/xxx; charset=xxx", создаваемого некоторыми (мягко говоря) html-редакторами. Таким образом можно решить проблему со страницами, созданными в MS Front Page и Netscape Navigator, который переключается неизвестно куда, когда видит 'windows-1251' в таком тэге. Добавлены новые опции для конфигурирования изменения заголовков файлов - теперь можно полностью вырезать тэг с charset, заменить название в charset на клиентскую таблицу, вырезать только '; charset=xxx' или вообще оставить так как есть. Улучшен вывод сообщений - теперь добавляется время и получается более-менее приличный лог. Меню теперь выводится в цветном режиме (ANSI). Сделаны версии для: Watcom C 10 (OS/2), Emx/Gcc (OS/2), а также версия для Win32 (Windows95 и Windows NT) (компилятор Watcom C 10).
Вы можете скачать исходники этой версии CHCP Proxy 2.0.

2.01 - Исправлена дурацкая ошибка, приводящая к полной неработоспособности программы при сколько-нибудь приличной нагрузке (я совсем не подумал о том, что regexp делался не для мультитредовых операций :() - пришлось многое менять в этой библиотеке, чтобы она начала поддерживать мультитредовость. Введена возможность отключения ansi-кодов при выводе меню. Win32-версия стала по настоящему рабочей.
Вы можете скачать исходники этой версии CHCP Proxy 2.01.

2.02 - Добавлена перекодировка файлов с типом application/x-www-form-urlencoded (эта идея позаимствована из cyrproxy by Alex Tutubalin). Пофиксена ошибка из-за которой win32-версия не работала под NT (не находила файл nregexp, который на самом деле назывался nregexp.dll :) (дернуло же меня прописать option modname=nregexp в regexpnt.lnk...). Во многих местах тип char заменен на unsigned char (для того, чтобы Gcc не спотыкался). Сделана версия для Unix (компилятор Gcc 2.7) c поддержкой родного для этой системы fork(), вместо тредов (пришлось, правда, заюзать SysV IPC (семафоры и shared memory), которые, к счастью, есть почти во всех современных юниксах). Испытывалась эта версия только под Debian Linux 1.2.

2.04 - В этой версии устранено множество ошибок/недочетов/небрежностей в программе. Исходники довольно сильно пересмотрены и прилично подчищены. Пофиксена возможная причина обрыва файлов. Пофиксена причина неосвобождения shared memory в Unix-версии (в OS/2 и win32-версиях этой проблемы даже не стояло, просто из-за отсутствия необходимости в этой памяти, при наличии тредов). Немного оптимизирован поиск символьных последовательностей в заголовках. Сделан второй способ работы с клиентом и сервером - если при компиляции указать опцию MIN_THREAD (умолчание для Unix-версии) - программа будет на один клиентский запрос порождать только одну нитку (процесс), а в Unix-версии - еще и не будет выделять один сегмент shared memory (как и следовало ожидать, эта опция дает выигрыш только в Unix-системах. В OS/2 и Win NT 'основной' способ (две нитки на каждый запрос) - эффективнее). Добавлен новый параметр запуска - unattended mode (если его указать равным 1 - программа ничего не будет выводить на экран и отрубится реакция на клавиши, а в Unix-версии - программа еще и сразу же возвратит управление, оставшись работать в фоне. Добавлена опция компиляции NEED_LINGER, которая включает linger для соединения с клиентом. Информации, выводимой в лог немного прибавилось. Эта версия тщательно (по сравнению с предыдущими версиями ;)) тестировалась в работе на OS/2 Warp 3.0 (TCP/IP 3.0), Windows NT 4.0, Windows 95 (под этой системой, к сожалению, я не смог добиться нормальной обработки большого количества одновременных запросов - какие-то ограничения в Winsock'95, похоже :( (хотя сама программа нормально работает и перекодирует как надо)), FreeBSD 2.1.7, Debian Linux 1.2 .
Вы можете скачать исходники этой версии CHCP Proxy 2.04.

2.1 - Программа теперь может считывать свои настройки не только из командной строки, но и из текстового файла. Введена поддержка persistent connections по HTTP/1.1 (из-за отсутствия этой поддержки часто возникали проблемы с 'недокачкой' файлов). Введены новые опции для конфигурирования программы (эти опции могут задаваться только из конфиг-файла, при запуске программы с конфигурированием параметров из командной строки, эти параметры будут иметь значения по умолчанию):
SendBuffer и ReceiveBuffer (размер системных буферов для каждого сокета) ;
Linger и LingerTime (включает режим 'обязательной' докачки при закрытии сокета) ;
OneThread (переключает режим приема-передачи - с режима с приемом-передачей в обоих направлениях из разных тредов (два треда на каждое соединение) на режим с приемом-передачей в обоих направлениях из одного треда с синхронизацией с помощью select. Ранее для этой цели использовался параметр, задаваемый только при компиляции);
CutAlive (включает вырезание из запросов клиента строки с подстрокой 'Keep-Alive', если Вам не нравятся persistent connections);
FastDetectHeader (для 'быстрого' детектирования конца приема заголовка от сервера);
ReplaceHost, HostName и HostIp (включает режим для замены в строке 'Host:....' запроса клиента адреса из HostName (или HostIp) на адрес, заданный параметрами Proxy и ProxyPort. Этот режим требуется, если CHCP Proxy работает совместно не с http-proxy, а непосредственно с http-сервером для перекодировки страничек, и сервер обязательно требует свой адрес в этой строке).

2.11 - Пофиксен глюк с выдачей в лог кучи error при отсутствии Content-Length в заголовке HTTP/1.1 с 'Connection: close'.
Вы можете скачать исходники этой версии CHCP Proxy 2.11.

2.13 - Пофиксены проблемы с bind(). Добавлено определение кодовой страницы cp-866 по строке 'ibm-866'. Убрано использование TerminateThread (в win32-версии) и DosKillThread (в OS/2-версии) при OneThread=No (для устранения неосвобождения памяти, отданной под стек убиваемого треда в win32-версии программы. За что еще можно любить Билли ?). Добавлена поддержка multihomed host-а (теперь Вы можете запускать на одной машине несколько копий программы на одном порту, но с разными ip-адресами). Соответственно, добавлена новая опция:
MultiHomed (включает поддержку multihomed-хоста. Программа в этом случае будет делать bind не на INADDR_ANY (все сетевые адреса данной машины), а только на адрес, указанный параметром HostIp).
Вы можете скачать исходники этой версии CHCP Proxy 2.13.

2.15 - Пофиксен глюк с неосвобождением shared memory в Unix-версии при OneThread=Yes, появившийся в версии 2.13.
Пофиксен глюк с игнорированием тэга 'META ...' при сервере HTTP/1.0, а не HTTP/1.1 и документе короче 2.5 килобайт.
Пофиксен глюк с free() для констант при чтении конфигурации (на работе это никак не сказывалось, но было некрасиво, особенно под FreeBSD).
Добавлен новый параметр:
HeadLog (включает занесение в лог строк с 'HEAD' или 'GET' из запросов).
Добавлена поддержка протоколов SMTP и NNTP! Соответственно, появилось несколько новых параметров:
SmtpNntp (включает режим поддержки протоколов SMTP и NNTP);
QoutePrintable (включает перекодировку Quote-Printable последовательностей);
DumbCharset (заставляет программу не переключаться на charset из заголовка, но производить вырезание или замену названия charset-а на клиентскую).
Внимание! К сожалению, из-за нехватки свободного времени, я не смог как следует проверить эту версию программы (особенно в области поддержки SMTP/NNTP), так что при использовании этой версии возможно появление разного рода глюков. Пожалуйста, если Вы наткнетесь на один из таких глюков - обязательно сообщите мне (желательно с подробным описанием ситуации, файлом конфигурации и документом, при перекодировке которого появляется глюк).
Вы можете скачать исходники этой версии CHCP Proxy 2.15.

2.17 - В unix-версии сделана нормальная работа в бэкграунде (добавлен вызов setsid() и убивание log's thread при выходе).
При компиляции можно указать опцию USE_SYSLOG и логи будут выдаваться не на stderr или файл, а фиксироваться с помощью syslogd (имеет смысл только для unix-версии).
Добавлены новый параметры:
UserId (имя юзера с правами которого будет работать unix-версия);
GroupId (имя группы с правами которой будет работать unix-версия).
При компиляции можно указать опцию USE_LIBWRAP (подробнее - смотрите Makefile.Unix) и можно будет разрешать/запрещать коннекты с определенных адресов к CHCP Proxy с помощью библиотеки tcp-wrappers (программа тестировалась с библиотекой tcp-wrappers 7.6). Соответственно, добавились новые параметры:
UseLibwrap (включает использование библиотеки tcp-wrappers); Usefromhosts (включает вызов fromhosts() после поступления каждого коннекта. Замедляет обработку коннектов (из-за необходимости прямого и реверсного ресолвинга адресов клиента), зато разрешает использование доменных адресов для CHCP Proxy в hosts.deny и hosts.allow)).
Если будет время - сделаю немного урезаную версию tcp-wrappers под OS/2 и win32 с возможностью считывать hosts.deny и hosts.allow один раз при запуске программы, а не на каждый коннект.

Работа над программой продолжается и если Вы хотите что-нибудь предложить по ее поводу - напишите мне.

Вы можете скачать саму программу с исходниками прямо здесь:

Документация, кодовые таблицы , примеры конфигов и исходники для OS/2, Win32 и Unix chcproxy.zip 71Kb.
Скомпилированная программа, документация, кодовые таблицы и примеры конфигов для OS/2 (Watcom C 10) chcproos.zip 45Kb.
Скомпилированная программа, документация, кодовые таблицы и примеры конфигов для Win32 (Watcom C 10) chcpront.zip 49Kb.

Возврат на страничку моих 'проектов'.
Возврат на начальную страничку.
Если Вы хотите что-нибудь написать мне - нажмите сюда.
Эта страничка запрашивалась : много-много раз(а).