Странная установка Разелителя-Boundary в TIdMultipartFormDataStream

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
jsa
постоялец
Сообщения: 299
Зарегистрирован: 28.11.2017 12:46:04

Странная установка Разелителя-Boundary в TIdMultipartFormDataStream

Сообщение jsa »

Здравствуйте.
Впервые столкнулся с тем, что в API при отсылке файлов через idHHTP типом запроса multipart/form-data требуется конкретный разделитель Boundary
Но при попытке указать его

Код: Выделить всё

multiData.Boundary:='RRRR';
Возникает ошибка

Код: Выделить всё

unit_sendout.pas(290,24) Error: No member is provided to access property
Посмотрел в модуле
там действительно только чтение прописано

Код: Выделить всё

property Boundary: string read FBoundary;   
ниже в конструкторе

Код: Выделить всё

constructor TIdMultiPartFormDataStream.Create;
begin
  ...
  FBoundary := GenerateUniqueBoundary;
  ...
end;  
процедура генерации

Код: Выделить всё

function TIdMultiPartFormDataStream.GenerateUniqueBoundary: string;
begin
  Result := '--------' + FormatDateTime('mmddyyhhnnsszzz', Now);  {do not localize}
end; 


Т.е. формирование разделителя прописано жестко да еще пометку поставили не менять.
Не понимаю идею.
Тут или забить и прописать свой прямо в конструктор.
Или что более правильно прописать в property Boundary возможность программного изменения.

Но почему сразу это не сделано разработчиком? У этого есть какие-нибудь объяснения?
sts
энтузиаст
Сообщения: 563
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Сообщение sts »

подозреваю что 25 лет назад не было необходимости в особенных Boundary и сделали как тогда было принято, при этом по инерции сделали свойство, но не дожали логику изменения.

как разработка идет, сначала набрасывают макет класса, а потом, по мере разработки его меняют, дорабатывают то что надо, вот видимо не возникло необходимости менять и не сделали изменяемым.
sts
энтузиаст
Сообщения: 563
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Сообщение sts »

по паттерну, методы типа GenerateUniqueBoundary должны быть сразу виртуальными и в протектед сидеть, чтобы потомок мог поменять реализацию, а конкретно TIdMultiPartFormDataStream.Boundary по идее меняться не должен, т.е. должен задаваться один раз, в конструкторе, протаскивать его параметром в Cretae(... ABoundary: string), тоже не очень решение.
кароче, ситуация неоднозначная, как правильно надо было сделать
sts
энтузиаст
Сообщения: 563
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Сообщение sts »

кстати
Based on Internet standards outlined in:
RFC 1867 - Form-based File Upload in HTML
RFC 2388 - Returning Values from Forms: multipart/form-data
не удивлюсь что там прописан конкретный Boundary
jsa
постоялец
Сообщения: 299
Зарегистрирован: 28.11.2017 12:46:04

Сообщение jsa »

sts писал(а): 08.04.2026 08:31:58 подозреваю что 25 лет назад не было необходимости в особенных Boundary и сделали как тогда было принято...
Спасибо. Ясно что весомой причины нет.

Себе в будущем напишу и закрываю тему.

В модуле IdMultipartFormData
дописал

Код: Выделить всё

    property Boundary: string read FBoundary write FBoundary; 
Ответить