|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
TWebModule непонятки с IfModifiedSince
Задавал вопрос на другом форуме, но никто не смог ответить, можут тут кто знает
Для настройки кэширования, решил использовать параметр из HTTP запроса IfModifiedSince. Т.е. на сколько я понял, то в этом поле передается дата файла хранящегося в кэше браузера клиента. CGI-приложение, проверяет эту дату и дату файла хранящегося на сервере, и если даты не поменялись, то возвращает статус 304, и пустой поток. Периодически, при обращении к этому полю объекта Request Класса TWebRequest, приложение вылетает с ошибкой 500 Internal server error HTTP запрос выглядит вполне корректно: Код:
Accept */* Accept-Encoding gzip, deflate Accept-Language ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3 Cache-Control max-age=0 Connection keep-alive Cookie nut=7b8e525fd6d014a036822efa1e868dcc Host test.tst If-Modified-Since Mon, 13 Mar 2017 16:00:46 GMT HTTP заголовок ответа: Код:
Connection close Content Content-Length 129 Content-Type text/html; charset=windows-1251 Date Thu, 16 Mar 2017 07:29:50 GMT А вот содержимое ответа: Код HTML:
Сделал проверку, непосредственно в теле процедуры ответа: Код:
procedure TCGI.WebModule1indexAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); var st:TstringList; begin //main func st:=TStringList.Create; st.LoadFromFile(ExtractFileDir(ParamStr(0))+'\111.log'); try st.Append(request.Query+' : '+DateTimeToStr(Request.IfModifiedSince)); except on e : Exception do st.Append(request.Query+' : exception:'+e.Message); end; st.SaveToFile(ExtractFileDir(ParamStr(0))+'\111.log'); st.Free; .... Содержимое лога вот такое: Код:
what=/index.html&id=200&log=1 : 29.12.1899 what=/css/struct.css : exception:'Tue' is not a valid integer value what=/image/img.png : exception:'Mon' is not a valid integer value Т.е. поле IfModifiedSince, в TwebRequest, работает не правильно, не может преобразовать строку типа "Mon, 13 Mar 2017 16:00:46 GMT" в тип TDateTime Тогда вопрос: Как вытащить заголовок HTTP запроса? Я сам распарсю это поле, но как его получить? попробовал вытащить в виде строки значение этого поля Код:
Request.GetFieldByName('If-Modified-Since') возвращает всегда пустую строку, несмотря на то что в заголовке HTTP запроса этот параметр есть!!! Его видно в Firebug!! Попробовал получить значения других полей, нуу мало ли может не работает, класс то абстрактный. Значения полей "Connection", "Refer" и остальные возвращает нормально! |
#2
|
|||
|
|||
Подсказали, где искать. Оказывается борланд несоклько по другому назвал эти поля. Они описаны в модуле CGIHTTP.pas
Код:
CGIServerVariables: array[0..28] of string = ( 'REQUEST_METHOD', 'SERVER_PROTOCOL', 'URL', 'QUERY_STRING', 'PATH_INFO', 'PATH_TRANSLATED', 'HTTP_CACHE_CONTROL', 'HTTP_DATE', 'HTTP_ACCEPT', 'HTTP_FROM', 'HTTP_HOST', 'HTTP_IF_MODIFIED_SINCE', 'HTTP_REFERER', 'HTTP_USER_AGENT', 'HTTP_CONTENT_ENCODING', 'HTTP_CONTENT_TYPE', 'HTTP_CONTENT_LENGTH', 'HTTP_CONTENT_VERSION', 'HTTP_DERIVED_FROM', 'HTTP_EXPIRES', 'HTTP_TITLE', 'REMOTE_ADDR', 'REMOTE_HOST', 'SCRIPT_NAME', 'SERVER_PORT', '', 'HTTP_CONNECTION', 'HTTP_COOKIE', 'HTTP_AUTHORIZATION'); т.е. надо запрашивать не IF-MODIFIED-SINCE (что логично, т.к. в заголовке поле называется именно так), а вот HTTP_IF_MODIFIED_SINCE. тогда возвращается строка со значением этого поля. Нууу а дальше преобразовывай не хочу |