Форум по программированию Delphi Sources

 


   Сайт  
   Исходники  
   Компоненты  
   Статьи  
   FAQ  
   Поиск по исходникам  
   Футболки  

Вернуться   Форум по программированию Delphi Sources > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 17.03.2017, 09:57
ford ford вне форума
Прохожий
 
Регистрация: 17.03.2017
Сообщения: 2
Версия Delphi: Delphi7
Репутация: 10
Восклицание 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:
<html><body><h1>Internal Application Error</h1> <p>'Tue' is not a valid integer value <p><hr width="100%"></body></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  
Старый 17.03.2017, 14:59
ford ford вне форума
Прохожий
 
Регистрация: 17.03.2017
Сообщения: 2
Версия Delphi: Delphi7
Репутация: 10
Злость

Подсказали, где искать. Оказывается борланд несоклько по другому назвал эти поля. Они описаны в модуле 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.
тогда возвращается строка со значением этого поля. Нууу а дальше преобразовывай не хочу
Ответить с цитированием
Ответ



Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 20:17.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources", 2004-2017

ВКонтакте   Facebook   Twitter