Простой веб-сервер с помощью Indy и его нюансы

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

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

Простой веб-сервер с помощью Indy и его нюансы

Сообщение Alex2013 » 14.07.2023 18:59:26

В общем суть проблемы из за чего я озадачился этим вопросом: есть плеер на основе ffmpeg. Работает нормально, но есть нюанс плеер отказывается проигрывать плейлисты m3u8 из локального файла . Вообщем появилась идея, что можно обойти эту проблему если включить проект простой вспомогательный веб-сервер.

Все мои более ранние проекты имеющие совсем составе веб-сервер были написаны с использованием 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 Как можно использовать локальный веб-сервер не тревожа встроенный брандмауэр ? (а то внезапно всплывший запрос на открытие доступа может немного пугать юзеров)
Alex2013
долгожитель
 
Сообщения: 3048
Зарегистрирован: 03.04.2013 11:59:44

Re: Простой веб-сервер с помощью Indy и его нюансы

Сообщение jsa » 18.07.2023 10:58:25

3 Как можно использовать локальный веб-сервер не тревожа встроенный брандмауэр ? (а то внезапно всплывший запрос на открытие доступа может немного пугать юзеров)

Брандмауэр по умолчанию перекрывает использование портов на локальной петле 127.0.0.1 ?
Если нет то проблемм нет.
jsa
постоялец
 
Сообщения: 282
Зарегистрирован: 28.11.2017 13:46:04

Re: Простой веб-сервер с помощью Indy и его нюансы

Сообщение Alex2013 » 19.07.2023 12:30:47

jsa писал(а):
3 Как можно использовать локальный веб-сервер не тревожа встроенный брандмауэр ? (а то внезапно всплывший запрос на открытие доступа может немного пугать юзеров)

Брандмауэр по умолчанию перекрывает использование портов на локальной петле 127.0.0.1 ?
Если нет то проблем нет.

Так это у кого как. ( У меня спрашивает, возможно потому что порт нестандартный, хотя в примере из которого я выдрал код было написано обратное )
Alex2013
долгожитель
 
Сообщения: 3048
Зарегистрирован: 03.04.2013 11:59:44


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

Рейтинг@Mail.ru