> Changes:
> PL28.9, Apache 1.3.4, Mar 10 1999, Alex Tutubalin
...
> 2. Если сервер не может найти таблицу перекодировки из Source charset,
> то имена кодировок "на диске" и "клиентской" устанавливаются в
> SourceCharset, никакой перекодировки не происходит, а выдача
> charset=name в Content-Type происходит в соответствии с установками
> CharsetAgent/UseMultiViews/флагом S для WideRecodeTable
К сожалению тут не все в порядке -(((((: "Segmentation fault"
И понятно почему:
if(!rtbl)
{
r->ra_codep = make_codepage_data(r->pool,dirconf->emptytbl,dirconf->empty$
src_cs,src_cs,charset->lang);
r->ra_codep->cp_otabl_p = NULL;
r->ra_codep->cp_itabl_p = NULL;
}
else
r->ra_codep = make_codepage_data(r->pool,rtbl->convtbl_ptr,rtbl->revtbl_ptr,
charset->tablename,rtbl->namefrom,charset-$
// Вот где ошибка: rtbl == 0 !!!!!
if(rtbl->flags & RA_WIDE_CHARS_SC)
r->ra_codep->cp_flags |= RA_WIDE_CHARS_SC;
Наверно надо добавить {} к else. Кроме того charset->lang уже не тот,
как и далее по тексту, наверно нужно "charset=exact_getcharset(dirconf,src_cs);"
И нельзя ставить "r->ra_codep->cp_otabl_p = NULL;", так как в httpd.h
#define ra_charset_active(r) (r && r->ra_codep && r->ra_codep->cp_otabl_p && \
ra_check_type(r))
а в main/http_protocol.c делается проверка:
if (ra_charset_active(r) && r->ra_codep->cp_lang && r->ra_codep->cp_name
&& ( ra_flag(r,RA_IGNORE_LANGUAGE)
||(r->content_language
&&!strcasecmp(r->ra_codep->cp_lang,r->content_language))
)
&& (r->ra_codep->cp_flags & RA_NEED_CHARSET)
){
if (r->byterange > 1)
ap_table_setn(r->headers_out, "Content-Type",
ap_pstrcat(r->pool, "multipart",
use_range_x(r) ? "/x-" : "/",
"byteranges; boundary=", r->boundary,
"; charset=",r->ra_codep->cp_name,
NULL));
Хотя может нужно убрать проверку r->ra_codep->cp_otabl_p. А dirconf->emptytbl,
это что?
Во общем вот что меня получилось:
if(!rtbl)
{
charset=exact_getcharset(dirconf,src_cs);
r->ra_codep = make_codepage_data(r->pool,dirconf->emptytbl,dirconf->emptytbl,
src_cs,src_cs,charset->lang);
}
else
{
r->ra_codep = make_codepage_data(r->pool,rtbl->convtbl_ptr,rtbl->revtbl_ptr,
charset->tablename,rtbl->namefrom,charset->lang);
if(rtbl->flags & RA_WIDE_CHARS_SC)
r->ra_codep->cp_flags |= RA_WIDE_CHARS_SC;
}
if(!charset->flags & MOD_CHARSET_NO_CHARSETNAME)
r->ra_codep->cp_flags |= RA_NEED_CHARSET;
Кстати. мне казалось что раньше 'Content-Language:' выставлялось и без
участия mod_negotiation, так ли это?
--
С наилучшими пожеланиями, Евгений Бырганов.
Best regards, Eugene Byrganov.
mailto:E.B.Byrganov@inp.nsk.su
work - http://www.inp.nsk.su/
"Russian Apache" includes software developed
by the Apache Group for use in the Apache HTTP server project
(http://www.apache.org/) See
Apache LICENSE.
Copyright (C) 1995-2001 The Apache Group. All rights reserved.
Copyright (C) 1996 Dm. Kryukov; Copyright (C)
1997-2009 Alex Tutubalin. Design (C) 1998 Max Smolev.