Все мои более ранние проекты имеющие совсем составе веб-сервер были написаны с использованием Synapse и были чрезмерно "низкоуровневым" и сложными для такой ерундовской задачи . Но поскольку в моем проекте и так используется пакет Indy я решил что он не сильно вырастет если я добавлю "веб-сервер на Инди ".
Вообщем пока написал тестовую прогу (код "проще не бывает" все работает и плеер этот псевдо-сервер видит без проблем )
- Код: Выделить всё
- unit WSunit1;
 {$mode objfpc}{$H+}
 interface
 uses
 Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls,IdBaseComponent, IdComponent,
 IdCustomTCPServer, IdHTTPServer,
 IdCustomHTTPServer, IdContext;
 type
 { TWS_Form }
 TWS_Form = class(TForm)
 Button1: TButton;
 Button2: TButton;
 Edit1: TEdit;
 IdHTTPServer1: TIdHTTPServer;
 Label1: TLabel;
 procedure Button1Click(Sender: TObject);
 procedure Button2Click(Sender: TObject);
 procedure IdHTTPServer1CommandGet(AContext: TIdContext;
 ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
 private
 public
 end;
 var
 WS_Form: TWS_Form;
 implementation
 {$R *.lfm}
 { TWS_Form }
 procedure TWS_Form.IdHTTPServer1CommandGet(AContext: TIdContext;
 ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
 begin
 try
 //отдача индексного или иного файла с диска
 //http://127.0.0.1:8888/media.m3u8
 if ARequestInfo.Document = '/media.m3u8' then
 AResponseInfo.ContentStream := TFileStream.Create(Edit1.Text, fmOpenRead)
 except
 AResponseInfo.ContentText := '<b>File not found or access denied!';
 end;
 end;
 procedure TWS_Form.Button1Click(Sender: TObject);
 begin
 IdHTTPServer1.Active := false;
 IdHTTPServer1.DefaultPort := 8888; // Port 8888 ist Standard
 try
 IdHTTPServer1.Active := true;
 except
 raise;
 end;
 if IdHTTPServer1.Active then
 begin
 label1.Caption := 'Server ist: ONLINE an Port 8888';
 end;
 end;
 procedure TWS_Form.Button2Click(Sender: TObject);
 begin
 try
 IdHTTPServer1.Active := false;
 except
 raise;
 end;
 if not IdHTTPServer1.Active then
 begin
 Label1.Caption := 'Server ist: OFFLINE';
 end;
 end;
 end.
Однако появились вопросы :
1 Программа создает TFileStream, но нигде его явно не освобождает. Вопрос: не будет ли из за этого утечки памяти?
(То есть нужно ли освобождать его "в вручную" при смене файла или об этом позаботится сам IdHTTPServer ? Сори, этот вопрос даже мне самому кажется чуть туповатым , но тем не менее ... )
2 Есть идея затолкать этот псевдо-сервер в DLL с динамической загрузкой . Вопрос: как с этим у Инди ?
3 Как можно использовать локальный веб-сервер не тревожа встроенный брандмауэр ? (а то внезапно всплывший запрос на открытие доступа может немного пугать юзеров)


