Заголовок Last-Modified
определен в RFC 2616, раздел 14.29 1 как:
Last-Modified = "Last-Modified" ":" HTTP-date
1: Эквивалентное определение содержится в RFC 7232, раздел 2.2 .
HTTP-date
определено в RFC 2616, раздел 3.3 2 как:
HTTP-date = rfc1123-date | rfc850-date | asctime-date
rfc1123-date = wkday "," SP date1 SP time SP "GMT"
rfc850-date = weekday "," SP date2 SP time SP "GMT"
asctime-date = wkday SP date3 SP time SP 4DIGIT
date1 = 2DIGIT SP month SP 4DIGIT
; day month year (e.g., 02 Jun 1982)
date2 = 2DIGIT "-" month "-" 2DIGIT
; day-month-year (e.g., 02-Jun-82)
date3 = month SP ( 2DIGIT | ( SP 1DIGIT ))
; month day (e.g., Jun 2)
time = 2DIGIT ":" 2DIGIT ":" 2DIGIT
; 00:00:00 - 23:59:59
wkday = "Mon" | "Tue" | "Wed"
| "Thu" | "Fri" | "Sat" | "Sun"
weekday = "Monday" | "Tuesday" | "Wednesday"
| "Thursday" | "Friday" | "Saturday" | "Sunday"
month = "Jan" | "Feb" | "Mar" | "Apr"
| "May" | "Jun" | "Jul" | "Aug"
| "Sep" | "Oct" | "Nov" | "Dec"
2: Эквивалентные определения приведены в RFC 7231, раздел 7.1.1.1 .
Показанное вами Last-Modified
значение не соответствует ни одному из форматов, разрешенных HTTP.
TIdHTTP
использует функцию Indy GMTToLocalDateTime()
для анализа заголовка Last-Modified
(и Date
и Expires
). Эта функция является общей для компонентов HTTP, IMAP, NNTP и электронной почты, поэтому она более гибкая в 1038 * форматах даты / времени, которые она поддерживает. Например, он анализирует ISO 8601, который, как вы утверждаете, равен Last-Modified
. Однако указанное вами значение также не соответствует стандарту ISO 8601. Если бы это было так, это выглядело бы так:
Last-Modified: 2018-10-26T08:37:01+00:00
Что еще хуже, согласно предоставленной вами трассировке стека, GMTToLocalDateTime()
вызывается без какой-либо части даты вообще:
HIWBase.IdGlobalProtocols.GMTToLocalDateTime('07:53:37 +0000')
Способ only , который может произойти в TIdHTTP
, заключается в том, что HTTP-сервер отправляет заголовок Last-Modified
(или Date
или Expires
) с этим точным значением, которое также не является соответствует стандартам HTTP или ISO 8601 и не обрабатывается как есть GMTToLocalDateTime()
.
Короче говоря, API, который вы запрашиваете, отправляет недопустимый формат даты / времени , который TIdHTTP
не поддерживает синтаксический анализ (что иронично, потому что основной веб-сайт https://www.priceapi.com
отправляет правильно отформатированный HTTP строки даты / времени). Вам следует связаться с администратором сайта и сообщить, что их сервер API нарушает стандарты протокола HTTP в этом отношении.
При этом GMTToLocalDateTime()
НЕ вызывает исключение 'Invalid Argument to date encode'
, когда встречается неверно сформированная строка даты / времени. Вместо этого он возвращает TDateTime
из 0.0
. только способ, которым вы могли видеть это исключение, если вы выполняете свой код внутри отладчика. Когда GMTToLocalDateTime()
задана неверно сформированная строка даты / времени, возможно, что он может извлечь числовые компоненты, которые он считает действительными, но затем потерпит неудачу, когда попытается закодировать окончательный TDateTime
с ними. Исключение, которое вы видите, исходит из функции EncodeDate()
RTL, когда ему задается неверный месяц / день / год в качестве ввода. Но GMTToLocalDateTime()
ловит это исключение внутри. Ваш код никогда не увидит его во время выполнения, его увидит только отладчик.