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] Re: [apache-rus] POST и все,все, все...



In <132359384747.20000714170040@zhurnal.ru> Ilya Obshadko (ilya@zhurnal.ru) wrote:
IO> Hello Alex,

IO> пятница, 14 июля 2000 г., you wrote:

>>> Не понял, отрезается только при POST? Тогда это баг в API charset_bread,
>>> скорее всего. gdb, httpd -X, и фиксить, фиксить, фиксить...

AT>> Да, похоже там есть проблемы :)

IO> Они там однозначно есть. Вспомни историю с multipart-формами.

А какая история ? Не было там никакой истории. Перекодирование multipart-форм
в Apache - "bred of wery sif kobyl". Ибо не знает он ни про какие-такие
multipart-формы. Что пришло - то и скормили в скрипт или еще куда.

IO> Которые я сейчас перекодирую из скрипта при помощи Apache::Charset. ;)

А как их еще перекодировать ? Тебе-то всяко MIME разбирать приходится - деваться
некуда. А это не такая простая работа (особенно в bread'е), чтобы ее делать
дважды - и по времени и по размерам кода и по количеству возможных ошибок.
Или у тебя на сервере процесс сильно недогружен и его чем-то занять надо ?

А вот в charset_bread'е проблемы там есть. charset_bread неправильно
работает в одном-единственном, казалось бы, маловероятном случае: когда
его попросили считать сначала, скажем, 4096 байт так, что "на стык"
попала %XX последовательность (после чего charset_bread вернет
4095 или 4094 байта :-), а затем попросили прочитать один или
два байта. В этом случае charset_bread вернет 0 - признак конца !
Казалось бы - КАК такое может произойти ? Ну кому может придти в
голову читать по одному-два байтам ??? Ответ: системе буферизации apache.
Когда оно видит, что ему вернули не полный буффер, а немного "недодали",
то он просит дочитать еще "чуть-чуть" чтобы дополнить буффер.
Далее - см. выше.

Паtch при'attach'ен. С multipart формами пусть разбирается кто-нибудь
другой: ясно, что это можно сделать "заглядывая вперед" подальше, но вот
сложность кода и его размеры явно превзойдут разумные пределы... Про
скорость я уж и вообще молчу. Вот с unicode можно было бы попробовать
разобраться, но это требует отдельных таблиц: unicode -> current_charset
и т.п. Хороший проектик для кого-нибудь, кому нечем на выходных заняться :-)

P.S. Вообще безумие все это: столько слез было, а вот вооружиться gdb и
потратить час никому в голову не пришло :-( Grrr.


--- src/modules/extra/mod_charset.c	Sun Jul 16 05:54:41 2000
+++ src/modules/extra/mod_charset.c	Sun Jul 16 06:12:01 2000
@@ -2102,24 +2102,59 @@
     }
   memcpy(zbuf,ra_codep->postbuf,ra_codep->postlen);
   len = b_len+ra_codep->postlen;
-  ra_in_place_convert_by_table_esc(zbuf,len,tab);
 
   /* save chars for later processing */
   if(zbuf[len-2] == '%')
     {
       ra_codep->postbuf[0] = zbuf[len-2];
       ra_codep->postbuf[1] = zbuf[len-1];
-      ra_codep->postlen = 2;
-      len -=2;
+      ra_in_place_convert_by_table_esc(zbuf+ra_codep->postlen,b_len-2,tab);
+      b_len = ap_bread(fb,&ra_codep->postbuf[2],1);
+      if (b_len <= 0)
+        {
+          ra_codep->errflag = 1;
+          ra_codep->errcode = b_len;
+          ra_codep->postlen = 0;
+        }
+      else
+        {
+          ra_in_place_convert_by_table_esc(ra_codep->postbuf,3,tab);
+          zbuf[len-2] = ra_codep->postbuf[0];
+          zbuf[len-1] = ra_codep->postbuf[1];
+          ra_codep->postbuf[0] = ra_codep->postbuf[2];
+          ra_codep->postlen = 1;
+	}
     }
   else if(zbuf[len-1]=='%')
     {
       ra_codep->postbuf[0]=zbuf[len-1];
+      ra_in_place_convert_by_table_esc(zbuf+ra_codep->postlen,b_len-1,tab);
+      b_len = ap_bread(fb,&ra_codep->postbuf[1],2);
       ra_codep->postlen = 1;
-      len-=1;
+      if (b_len == 1)
+        {
+          ra_codep->postlen = 1;
+        }
+      else if (b_len <= 0)
+        {
+          ra_codep->errflag = 1;
+          ra_codep->errcode = b_len;
+          ra_codep->postlen = 0;
+	}
+      else
+        {
+          ra_in_place_convert_by_table_esc(ra_codep->postbuf,3,tab);
+          zbuf[len-1] = ra_codep->postbuf[0];
+          ra_codep->postbuf[0] = ra_codep->postbuf[1];
+          ra_codep->postbuf[1] = ra_codep->postbuf[2];
+          ra_codep->postlen = 2;
+	}
     }
   else
+    {
+    ra_in_place_convert_by_table_esc(zbuf+ra_codep->postlen,b_len,tab);
     ra_codep->postlen = 0;
+    }
 
   return len;
 }  





Спонсоры сайта:

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