Russian Apache Switch to English
Switch to Russian koi8-r
windows=1251
cp-866
iso8859-5
Russian Apache Как это работает Рекоммендации Где взять Как установить Как настроить Статус и поддержка
Краткий обзор FAQ Список рассылки Благодарности Поиск по серверу Powered by Russian Apache
Russian Apache mailing list archive (apache-rus@lists.lexa.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [apache-rus] FORCE_SOURCE_CHARSET




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 ] [ Как это работает ] [ Рекомендации ] [ Где взять ] [ Как установить ] [ Как настроить ] [ Статус и поддержка ] [ Краткий обзор ] [ FAQ ] [ Список рассылки ] [ Благодарности ] [ Поиск по серверу ] [ Powered by Russian Apache ] [ Apache-talk archive ]

"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.