Hi!
У меня вопрос по src mod_charset для общего развития:
Как я понял в request_rec->codepage_data_t
в cp_name подставляется charset_table_t->tablename,
а в cp_fromname: charset_table_t->recode_tables->namefrom,
Вопрос, чем отличаются charset_table_t->recode_tables->tofrom, от
charset_table_t->tablename - у меня они совпали? И зачем вообще нужно
копировать часть данных в codepage_data_t, а не указатель типа charset_table_t?
Как долго живут объекты типа codepage_data_t и recode_table_t?
Все эти вопросы возникли когда я попробовал дописать "STRIP META-HTTP handler",
чтобы charset_source определялся из META. (Мне надоело писать некоторым
пользователям, один из них декан факультета, где я когда-то учился -)),
что бы они вели себя хорошо.) Alex, если не трудно, взгляни на то,
что из этого получилось, если какие-либо подводные камни?:
#ifdef SET_CHARSET_AFTER_STRIP
static int
charset_source_from_meta(request_rec *r,char *stag)
{
char *s,*buf,ch;
int n=0;
recode_table_t *t;
charset_dir_t *dirconf = ap_get_module_config(r->per_dir_config, &charset_module);
printf("Stag: %s\n",stag);
s=strstr(stag,"charset");
if(!s) return 1; /* Word charset not found!*/
s+=7;
while(isspace(*s) || *s=='\"' || *s=='=')
s++;
while(!isspace(*(s+n)) && *(s+n)!='\"' && *(s+n)!='>')
n++;
ch=*(s+n);
*(s+n)=0;
buf=ap_pstrdup(r->pool,s);
if(!buf) return 1; /* chto-to ne to*/
*(s+n)=ch;
s=buf;
/* Get charset from meta Ok! */
ap_log_error
(APLOG_MARK,APLOG_WARNING,r->server,
"Found source charset from META, URI: %s FILENAME: %s ARGS: %s PATH_INFO: %s MIMETYPE: %s FLAGS: SUBREQ: %s, META_CHARSET: %s",
r->uri,r->filename,r->args,r->path_info,r->content_type?r->content_type:ap_default_type(r),
r->main?"YES":"NO",s); /*Vylavlivaem users*/
printf("charset: %s\n",s);
/* If not charset cname? */
buf = ap_table_get(dirconf->charset_aliases,s);
if(buf) s=buf;
/* If new charset == old? */
if(!strncasecmp(r->ra_codep->cp_fromname,s,n)) return 1;
t=recode_table_by_names(r,s,r->ra_codep->cp_name);
if(t)
{ /* Ura, delaem podmenu! */
r->ra_codep->cp_otabl_p = t->convtbl_ptr;
r->ra_codep->cp_fromname =s;
}
else
{ /*Unknows charset! Return html-doc as-is (А сможем ли????) */
r->ra_codep->cp_otabl_p = 0;
r->ra_codep->cp_fromname = r->ra_codep->cp_name = s;
#ifdef RUSSIAN_APACHE_DEBUG
ap_log_error
(APLOG_MARK,APLOG_DEBUG,r->server,
"Found unknow source charset from META, URI: %s FILENAME: %s ARGS: %s PATH_INFO: %s MIMETYPE: %s FLAGS: SUBREQ: %s, META_CHARSET: %s",
r->uri,r->filename,r->args,r->path_info,r->content_type?r->content_type:ap_default_type(r),
r->main?"YES":"NO",s);
#endif
return 0;
}
return 1;
}
#endif /* SET_CHARSET_AFTER_STRIP */
#define BF_SIZE 1024
static void
send_stripped_file(request_rec *r,FILE* f)
{
int tag;
char *stag;
char *buf;
int mbytes;
buf = ap_palloc(r->pool,mbytes=BF_SIZE);
while(1)
{
stag=get_tag(r,f,&buf,&mbytes);
if(stag==NULL)
return;
tag = parse_tag(stag);
#ifdef SET_CHARSET_AFTER_STRIP
if(tag==tMETAHTTP && charset_source_from_meta(r,stag) )
#else
if(tag==tMETAHTTP)
#endif
{
char *stub="Meta http equivalent was here";
int i=0;
unsigned sztag=strlen(stag)-9, szstub=strlen(stub);
if(ra_charset_active(r) && ra_flag(r,RA_WIDE_CHARS_SC))
sztag = ra_calc_wide_len(stag,sztag+9,
(wide_table_t*)r->ra_codep->cp_otabl_p)-9;
ap_rputs("<!-- ",r);
for(i=0; i<sztag; i++)
ap_rputc(i>=szstub ? ' ' : stub[i],r);
ap_rputs(" -->",r);
}
else
ap_rputs(stag,r);
}
return; /* not reached */
}
У меня вроде заработало. В принципе это бы соответствовало HTML3.2 & 4.0.
По загрузке я разницу между strip http и без него у себя не нашел.
--
С наилучшими пожеланиями, Евгений Бырганов.
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.