Все мои более ранние проекты имеющие совсем составе веб-сервер были написаны с использованием 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 Как можно использовать локальный веб-сервер не тревожа встроенный брандмауэр ? (а то внезапно всплывший запрос на открытие доступа может немного пугать юзеров)