PL18 21-Jun-1997, Alex Tutubalin В обеих версиях (1.1.3 & 1.2): 1. "Задекларирована" поддержка маковской кодировки (три строчки в httpd.conf, которые нужно раскомментарить). Cоответствующие части были присланы Dmitry Yu. Altukhov , за что ему спасибо. Он же утверждает, что название кодировки x-mac-cyrillic hardcoded в Netscape и MS IE for Mac, и что кодировка должным образом переключается. Проверить или предложить что-то еще я не могу. В 1.1.3 PL18: 2. Правки приведены в соответствие с PL18 for Apache-1.2. В настоящее время mod_charset одинаков для 1.1.3 и для 1.2 (но правки в http_protocol.c разные т.к. сам протокол разный) В 1.2.0 3. Это не Changes, a TODO на всеобщее обозрение. Нужны добавки в test-suite для проверки функциональности HTTP/1.1 Apache 1.2.0-PL18e 20 Jun 1997, Alex Tutubalin 1. Исправлена ошибка в коде, определяющем нужно ли выдавать заголовок Expires (В случае наличия и Accept-Charset и URL prefix и несовпадения задаваемых ими charset Expires все-равно не выдавался) 2. Определение того факта, что компиляция происходит для Apache-1.2 делается не через #ifdef SERVER_BASEVERSION, а через проверку MODULE_MAGIC_NUMBER. За оба исправления спасибо Dmitry Khrustalev 3. Убрано -DUSE_NOLOG_FOR, как отжившая свое. Поддержки этой feature в Apache-1.2 не будет Apache 1.2.0-PL18d 16-17 Jun 1997. I. Приложены патчи от Dmitry Khrustalev . В них содержится 1. Поддержка для Accept text/x-cyrillic-... (Мироновский хак Mosaic) сделана optional (разрешается путем задания ключа компиляции -DXCYRILLIC). Связано это с тем, что выбор кодировки по Accept создает дополнительные трудности с HTTP/1.1-кэшированием таких документов. 2. Добавлена выдача заголовка Vary: 3. Убрана ошибочка, приводившая к невозможности компиляции http_bprintf.c без -DUSE_TRANSFER_TABLES II. Несколько исправлена стратегия выдачи заголовка Expires:. Он _не_ выдается теперь в следующих случаях (на выбор): а) (виртуальный) сервер знает только один Charset (вообще говоря, с новой системой директив это нереально если кодировка на диске отличается от кодировки клиента). б) Включена опция CacheNegotiatedDocs в) Выбор кодировки производился по Hostname или Dirprefix и клиент не выдавал заголовка Accept-Charset г) Клиент выдал Accept-Charset, но Hostname/Dirpefix указывали на тот же Charset (т.е. если бы Accept-Charset не было, то был бы все-равно выбран тот же charset) Правила а) и б) работали и ранее. В правиле в) порядок поиска кодировки задается директивой CharsetSelectionOrder. В правиле г) выбор кодировки идет по Accept-Charset, а проверка Hostname/Dirprefix производится в соответствии с CharsetSelectionOrder. Эта правка должна привести к тому, что документы, лежащие в (например) /windows-1251/ будут кэшироваться как на proxy-серверах, так и на клиенте. Apache-1.2.0-PL18c. 14-Jun-1997, Alex Tutubalin 1. Внесены правки в 1.2.0, теперь оно совместимо с 1.1.3-rus PL18c 11-Jun-1997, Alex Tutubalin 1. Теперь apache не ругается, если в директивах, где должно быть имя кодировки, объявленной через CharsetDecl написано неправильное (необъявленное ранее) имя кодировки. Это неправильно, но сохранить такой syntax check невозможно из-за особенностей апача. Спасибо Ilya Balashov PL18b 09-Jun-1997, Alex Tutubalin 1. "Расширением" для директивы CharsetByExtension теперь может считаться что угодно, не содержащее '/'. Т.е. определение CharsetByExtension koi8-r .html.ru.koi8-r будет работать нормально. Спасибо Естественно, таким расширениям нужно присвоить соответствующий MIME-type, дабы они понимались как HTML. Да, PL18a содержал ошибку и считал расширением все после первой точки, а не после последней (в отличие от написанного в документации). 2. Исправлена ошибка с обработкой пустой директивы CharsetSelectionOrder. Сейчас такая пустая директива приводит к отмене выбора charset по всем трем правилам (Hostprefix/Dirprefix/Useragent). Было (и это было ошибкой) - пустая директива приводила к переключению на default order. 3. Введена директива CharsetMatchLanguage. Если она включена (состояние по-умолчанию для совместимости со старыми версиями), то charset=xxx выдается в заголовке Content-type только при соблюдении таких трех условий: а) В заголовке User-Agent, полученном от клиента, не содержится подстрок, описанных директивой CharsetBadAgent б) включена опция MultiViews в) Language, описанный для выдаваемого Charset директивой CharsetDecl совпадает с Language, описанной для данного типа документов директивой AddLanguage Если флаг CharsetMatchLanguage выключен, то сервер проверяет только первое условие (User-Agent: vs CharsetBadAgent). PL18a 08-Jun-1997, Alex Tutubalin 1. Введена новая система директив, полностью отличающаяся от старой. Слишком много, чтобы описывать в Changes. Описание директив доступно на http://apache.lexa.ru/configurePL18.html PL17: Промежуточная версия, снятая с производства. Заменена на PL18 PL17b: 30-May-1997, Alex Tutubalin 1. Исправлена недоделка в коде чтения таблиц перекодировки. Сейчас значения большие 255 считаются ошибкой. Спасибо Eugene Mamchits (eugin@ips.ras.ru) 2. Исправлена ошибка в PL17 (более ранние версии не затронуты), приводившая к неправильной (инвертированной :) обработке BadAgent/NotSoBad. 3. Исправлен и упрощен код, отвечавший за одновременную обработку CharsetPriority и Accept-Charset в запросе пользователя. Ошибка могла проявиться только в случае, когда в user query были заданы с одинаковым приоритетом несколько charsets, известных серверу. Этот случай мне в практике еще не встречался :) 4. Добавлена директива CharsetName (может встречаться в server config, , , .htaccess). Назначение ее - подменить "официальное" имя charset в строчке Content-Type в выдаче сервера (более нигде). Пример: CharsetTable wkoi8 conf/win-koi.tab ru CharsetAlias wkoi8 koi8-r AgentCharset wkoi8 (X11; Lynx CharsetName wkoi8 koi8-r - во всех внутренних "делах" сервера (определение charset, перекодировка и так далее) будет использоваться имя wkoi8, а в выдаче клиенту - charset=koi8-r Возможное применение - определить несколько групп CharsetTable (например, для директорий в которых файлы лежат в разных кодировках), а потом подменить CharsetName для этих CharsetTable, дабы выдача пользователю была корректной). Внимание! Эта директива используется только в момент формирования заголовков ответа сервера, для всех прочих целей (т.е. ссылок на Charset по имени в конфигурации сервера) нужно использовать имя Charset из директивы CharsetTable. Директива CharsetName даже не добавляет строчку в список CharsetAlias (дабы избежать двусмысленностей, когда несколько Charset имеют одинаковый Alias) - поэтому имейте это в виду. Тут есть еще некоторое количество тонкостей, связанных с механизмом обработки запроса, но все эти тонкости подробно разжеваны в документации на Apache. 5. Добавлена директория test-suite, в которой лежат скрипты для netcat, которыми удобно делать проверку функциональности. Буду рад всяческим добавлениям в эту директорию. PL17a: 27-May-1997, Alex Tutubalin 1. Исправлена очередная ошибка с переполнением стека, на этот раз в rvputs (ей, как я понимаю, вообще ни один модуль не пользуется) 2. mod_charset полностью переписан. Почти полностью сохранен основной алгоритм, но реализующий его код переписан. Главная цель была - сделать все более приближенным к апачевским стандартам (использование имеющихся таблиц и массивов вместо доморощенных структур данных и т.п.), дабы облегчить перенос под Apache 1.2 В качестве побочного эффекта достигнуто то, что любая директива, кроме CharsetTable может быть написана в .htaccess (для этого должно быть разрешено AllowOverride FileInfo). PL16: 10-May-1997, Alex Tutubalin 1. Исправлена ошибка в mod_charset, которая приводила к выдаче неправильного (неканонического) названия charset при обращении к файлам в пользовательском каталоге (/~user/file.html). Спасибо E.B.Byrganov@inp.nsk.su (Eugene B. Byrganov) 2. В дистрибутивном конфиг-файле httpd.conf-dist исправлено каноническое название CharsetTable ISO... с ISO_8859-5:1988 на ISO-8859-5 Спасибо E.B.Byrganov@inp.nsk.su (Eugene B. Byrganov) 3. Исправлена ошибка (feature?) в обработке server-side-includes, которая выражалась в том, что включенные статические документы иногда :) не включались, а выдавалась ошибка. Ошибка была связана с тем, что директива If-modified-since (которую выдают многие броузеры) учитывалась и при обработке подзапросов (includes), и если включенный документ был "старше" то он не выдавался. Ошибка присутствовала и в оригинальном apache-1.1.3, но маскировалась тем, что для Server-parsed документов сам сервер никогда не выдавал Last-Modified, поэтому броузеры не ставили If-modified-since. Ошибка _могла_ проявляться при работе через Proxy-серверы, которые проверяют измененность документа через If-modified. Т.е. в таком случае документ возвращался пользователю (и proxy) без включенных частей. Спасибо Oleg Bartunov (oleg@sai.msu.su) за то, что напомнил мне об этой ошибке. Я на эти грабли наступил давно, но т.к. никто больше не жаловался, то считал что я один такой несчастный. 08-May-1997, Alex Tutubalin Исправлена ошибка с переполнением стека на 1 байт в rputs(). Ошибка приводила к глюкам модулей, использующих rputs под операционными системами, в которых alloca() возвращает ровно столько байт, сколько просят. Из таких систем мне известен только Linux. Ошибка приводила к зацикливанию mod_status под Linux (под FreeBSD и Solaris/SPARC все работало прекрасно). Спасибо Oleg Bartunov (oleg@sai.msu.su) PL15: PL15Release, 25 Apr 1997, Alex Tutubalin По совету Andrey Chernov (ache@nagual.ru), в "дистрибутивном" конфигфайле закомментарена директива NotSoBad (см ниже), а в BadAgent _явно_ указаны версии bad agent'ов. PL15c 19-Apr-97, Alex Tutubalin 1. Решение 'проблемы lynx'. Проблема заключается в том, что старые версии Lynx (2.3,2.4) дуреют от указания charset= в Content-Type, а новые (2.5FM,2.6,2.7) обижаются и неправильно показывают, если charset= не указан. В силу первого, исключать lynx из списка BadAgent нельзя, перечислить там все возможные старые Lynx'ы похоже тоже нельзя (их слишком много разных). В PL15c реализован список исключений из BadAgent - директива NotSoBad. Синтаксис таков: BadAgent lynx arena # плохие агенты, которым нельзя показывать charset NotSoBad Lynx/2.7 # исключения из верхнего списка. Т.е. если в заголовке UserAgent: находится строка, удовлетворяющая обоим спискам, то агент не считается "плохим". На мой взгляд, так проще, чем описывать в BadAgent все возможные разновидности lynx'ов. Через некоторое время, когда Lynx 2.4 и младше изчезнут из обращения, об этой опции можно будет забыть. Возможно я и перестарался с этой опцией, но у меня в логах отмечен почти десяток старых разновидностей lynx и я уверен, что это далеко не все. В "дистрибутивном конфиге" в списке NotSoBad перечислены Lynx'ы, которые обращаются с charset= нормально. Проверял лично и только то, что было под рукой. Буду рад дополнениям к этому списку. Пока там 2.5FM. 2.6 и 2.7 Спасибо Andrew Chernov 2. Исправлена "чужая" ошибка - mod_include.c не вызывает set_last_modified() вследствие чего не ставились заголовки Last-Modified и Expires, что должно было приводить к проблемам с кэшами. Т.к. это упущение может быть свойственно и другим модулям, то надежнее оказалось исправить это в send_http_header. Теперь заголовки Last-Modified и Expires будут выдаваться всегда, если имело место content negotiation _и_ модуль вызывает send_http_header. Если модуль не вызывает set_last_modified сам, то в заголовок Last-Modified будет поставлена текущая дата, содержимое Expires зависит от ключей компиляции (если собирать с -DEPOCH_EXPIRES, то в Expires будет 01 Jan 1970). Это исправление _не_лечит_ модули, которые не вызывают send_http_header, а выводят все нужные им заголовки сами. Раз они решили делать все сами, то (увы) прочее - не наша забота Ошибка выплыла в процессе разборок "почему кэшируются .shtml". Спасибо всем, кто мне об этом писал. 3. mod_charset.c и mod_ranges.c отформатированы с помощью XEmacs c-mode Сделано по просьбе Nikolay Saukh . Как следствие, diff pl15b->pl15c будет большим. PL15b,13.04.97, Alex Tutubalin 1.При поиске charset по User-Agent теперь ищется наиболее длинное совпадение имени агента со строкой AgentCharset в конфигфайле. Т.е. если у вас написано AgentCharset koi8-r (X11 AgentCharset iso8859.5 "Mozilla-super-duper (X11" а клиент (user-agent) называется Mozilla-super-duper (X11; SUPER-DUPER-OS) то "сработает" более длинное описание. Если клиент "описывается" двумя подстроками одинаковой длины, то "сработает" то описание, которое находится раньше в httpd.conf Спасибо Nickolay Saukh 2. Корректно (корректнее?) обрабатывается ситуация, когда клиентский софт говорит Accept-Charset: some,*,some2 и ни один из some/some2 неизвестен серверу (этим поведением отличается Netscape Communicator 4.0b3 как минимум - он просит iso-8859-1,*,utf-8). Ранее клиенту отдавался NativeCharset, и писалась ругань в лог. Теперь (если все явно заданные чарсеты серверу неизвестны) в лог ничего не пишется, а сервер ведет себя как попросили - считается что '*' означает 'любой charset' и выбор charset производится по прочим параметрам (URL, User Agent) Спасибо Ilya Balashov 3. Начиная с этого момента я пишу длинные комментарии в changelog. PL15a,06.04.97, Alex Tutubalin 1. Не производится перекодировка для аргументов SSI. Это касается прежде всего конструкций вида Теперь они должны работать корректнее. 22.02.97 PL14 1. Добавлена пеpекодиpовка в функции rprintf/rputs/rvputs. Как следствие, коppектно написанные модули тепеpь должны полностью pаботать с пеpекодиpовкой (pанее pаботали только модули, котоpым хватало функции rputc) 2. Добавлен ключ компиляции -DEPOCH_EXPIRES Если он задан на момент компиляции,то в заголовке Expires: будет 01 Jan 1970 00:00:01 вместо текущей даты. Это может помочь пpавильно кэшиpовать (веpнее - не кэшиpовать) такие документы в случае pассинхpонизации часов на клиенте 14.11.96 PL12 1. Исправлена ошибка при выборе charset в запросе типа: http:/~user/codepage/.. Спасибо Eugene Rakhmatulin 3. Исправлена ошибка выдачи диагностики, при отсутствии затребованного клиентом charset (указатель на NULL). Не помню, кто обнаружил, был слишком длинный форвардинг, по-моему andy@snm.demos.su (Andrew A. Vasilyev) 4. Добавлена табличка для Mac 5. При определении "плохих" агентов теперь ищется подстрока по шаблону, а не сравнение с начала User-agent. Это связано с невозможностью определить плохим агентом MSIE 3.0, который пишет в поле User-Agent: Mozilla/2.0 (compatible; MSIE 3.0; Windows NT) спасибо Boris Tobotras 27.09.96 PL11 1. Исправлена ошибочка о выборе charset в SSI при использовании метода по преффиксу uri если документ содержал в себе include не принадлежащий дереву. Спасибо Alex Tutubalin . 2. Исправлена ошибка, связанная с тем, что структура, определяющая charset была объявлена как глобальная. Теперь указатель на эту структуру входит в структуру запроса request_rec и заполняется для каждого запроса индивидуально. Аналогично и для модуля mod_ranges. Спасибо Alexander Ermolaev и Dmitry A.Deineka" 3. Добавлена возможность выбора charset по преффиксу URI для директорий пользователей (например /~user/win/file, /~usr/koi/file и.т.д.) Спасибо am@f1.ru (Andrew Maltsev) 4. Исправлена ошибка выдачи имени charset alias name вместо официального имени charset, если выбор charset осуществился по имени сервера или по преффиксу uri. Спасибо am@f1.ru (Andrew Maltsev) 5. Добавлены директивы: NoHostnameCharset on/off NoUriCharset on/off По умолчанию сервер пытается найти charset в имени сервера и/или в преффиксе URI. Эти директивы запрещают такой поиск. Спасибо Nickolay Saukh 25.07.96 PL10 1. Улучшен анализ на необходимость выдачи Expires: раньше этот заголовок не выдавался в случае если имело место и language negotiation т.к. mod_negotiation принудительно ставил флаг r->no_cache в 1, а не накладывал маску на младший бит |= 0x01 2. Исправлена ошибка в charset negotiation для серверов, у которых не определено ни одного charset, приводившая к core. 3. Исправлена ошибка о принятии решения о типе кодировки при поиске подстроки в URL. Раньше сервер считал, что http://ms.f1.ru/comp/msdos/* представленны в альтернативной кодировке Теперь проверка только на соответствие в начале имени хоста и/или URI. Спасибо "Andrew Maltsev" 12.07.96 1. Реализован механизм согласования charset в совокупности с с согласованием language. Изъята дурацкая проверка на коды > 0x7f Content-type: text/foo; charset=... будет выдаваться только для документов, язык которых позволяет такой charset, для любого кол-ва языков могут быть определены свои charsets. Признаком языка считается принятое в apache соглашение о расширеннии имени файла (например: index.html.ru, index.html.en), при этом ссылки на uri без языкового расширения продолжают работать т.е. если нет реального файла index.html будет выбран один из index.html.ru, index.html.en согласно языковым приоритетам и, возможно, будет установлен charset (если определен), а также Expires: при необходимости. 2. Исправлена ошибка приводящая к core при использовании внутренних ssi, спасибо Alexander Ermolaev 3. Реализована обработка запросов вида: Accept-charset: name1; q=..., name2; q=... 4. Изменен как мне кажется, в лучшую сторону синтаксис почти всех директив: CharsetTable oficial_name tab1 [tab2] ru CharsetAlias oficial_name alias1 alias2 alias3 ... NativeCharset oficial_name (не изменилось) AgentCharset oficial_name user_agent_pattern1 user_agent_pattern2 .... 5. Добавлены директивы: BadAgent lynx arena name3...- для указания шаблонов агентов, не распознающих MIME в заголовках RejectErrorCharset on/off - для указания реакции сервера на неправильно запрошенный charset (по умолчанию сервер выдает документ как может) CharsetAgentPriority on/off - для указания приоритета в поиске charset между именем сервера/uri и идентифицируемым User-agent CharsetPriority cset1 scet2 ... - для принятия решения сервером о необходимом charset в случае равенства весов, кроме того, старший из них будет использоваться как native в случае отсутствия директивы NativeCharset 6. Изъяты вызовы функций перекодировки из функций rputs(), rprintf(), rvputs() т.к. сервер использует их исключительно для внутренних нужд, а не для передачи документов. Зачастую они вызываются сервером без привязки к конкретному запросу, что раньше приводило к множественным глюкам. Если кто-либо захочет их использовать из своих модулей, написанных для apache - должен будет вставить перекодировку самостоятельно. Также изъята попытка выдавать charset при выдаче ошибок сервером. Сообщения об ошибках выдаются сервером только в iso8859-1. 7. Исправлено много ошибок (все не упомню, если сразу не записал) Скорее всего - не все и добавлены новые :) 8. Изъята (возможно временно) поддержка header/footer файлов, как потенциально глюкавая. Она вообще кому-нибудь кроме меня нужна? 9. Исправлена ошибка в read_clients_block и send_error_response (http_protocol.c), связанная с тем, что указатель на цепочку charset мог быть еще не проинициализирован. Nickolay Saukh 10. Исправлена ошибка в поиске charset по полю Accept: text/x-cyrillic-... Отсутствовала проверка на окончание поля. Alexander Ermolaev 11. Исправлена ошибка выдачи последнего псевдонима charset вместо самого названия charset при согласовании по User-agent. Спасибо Nickolay Saukh 15.06.96 PL9 1. Исправлена ошибка, при удачном charset negotiation, запрешалось кэшировать все файлы, а не только те, чей Content-type: text/... Кроме того, теперь для документов выдается Last-modified и Content-length где это возможно. Если имело место charset negotiation, выдается и Expires: Спасибо "Igor V. Semenyuk" 2. В заголовке Content-type выдается charset=... только в документах которые имеют атрибут text/... и содержат в себе символы, коды которых > 0x7f. Этот же факт теперь является необходимым условием для выдачи заголовка Expires. Достаточным условием для выдачи Expires является то, что сервер знает несколько charset и документ содержит коды символов > 0x7f и его Content-type: text/.... т.е. если сервер может потенциально выдать данный документ в разных charset. 3. Изменен формат директивы CharsetTable, теперь имена файлов-таблиц указываются от корня сервера. Nickolay Saukh 4. Изменена стратегия выбора charset в случае отсутствия charset negotiation. Больший приоритет имеет теперь наличие имени charset в имени URI, чем выбор charset по User-agent, а не наоборот. Спасибо "Paul S. Hrobostov" . 5. При наличии как входной, так и выходной таблиц для charset в директиве CharsetTable, один из файлов не закрывался. Исправлено. 6. При появлении в Content-type значения charset=... помимо воли сервера (из cgi или .var) теперь этот charset удаляется, и подставляется правильный, в зависимости от выбранного сервером charset. Спасибо Nickolay Saukh . 7. Если затребованный клиентом charset неизвестен серверу и Content-type затребованного URI = text/... то сервер он возвращает 404 Not found, раньше он выдавал в NativeCharset документ. 8. Изменено название модуля mod_cyrillic на mod_charset, как более соответствующее истине. 9. Введена директива CharsetAlias для исключения описания таблиц. 10. В mod_charset.h default charset установлен в iso-8859-1 11. Добавлены коментарии в conf/httpd.conf.