Как закрыть все соединения на моем idHTTPServer? - PullRequest
0 голосов
/ 29 января 2019

Имея idHTTPServer и хочу, чтобы он прекратил получать запросы.Как правильно это сделать?

Я не уверен в своем коде ниже

function TRPSystem.CloseAllConnections: boolean;
var
  i: Integer;
  l: TList;
  c: TIdThreadSafeObjectList;

begin
  Result := false;
  c := Main.Server.Contexts;
  if c = nil then
    Exit();

  l := c.LockList();

  try
    for i := 0 to  l.Count - 1 do
      TIdContext(l.Items[i]).Connection.Disconnect(False);
    Result := true;
  finally
    c.UnlockList;
  end;
end;

procedure TRPSystem.ServerStop;
begin
  CloseAllConnections();
  Main.Server.Scheduler.ActiveYarns.Clear; 
  Main.Server.IsActive := false;
end;

1 Ответ

0 голосов
/ 29 января 2019

Чтобы полностью деактивировать сервер, вам нужно только установить для свойства сервера Active значение False.Это останавливает сервер от прослушивания новых соединений и закрывает все активные в данный момент соединения.Нет необходимости закрывать клиентские подключения вручную или очищать список активных нитей.Сеттер Active обрабатывает все за вас:

procedure TRPSystem.ServerStop;
begin
  Main.Server.Active := false;
end;

В противном случае, если вы не хотите полностью деактивировать сервер, просто временно отключите его, вы можете отклонить новые HTTP-запросы по мере их поступления, используяOnHeadersAvailable и OnHeadersBlocked события.Верните False из OnHeadersAvailable, а затем верните подходящий код состояния из OnHeadersBlocked, например 503 Service Unavailable (по умолчанию 403 Forbidden), например:

procedure TMain.ServerHeadersAvailable(AContext: TIdContext; const AUri: string; AHeaders: TIdHeaderList; var VContinueProcessing: Boolean);
begin
  if Offline then
    VContinueProcessing := False;
end;

procedure TMain.ServerHeadersBlocked(AContext: TIdContext; AHeaders: TIdHeaderList; var VResponseNo: Integer; var VResponseText, VContentText: String);
begin
  VResponseNo := 503;
end;
...