Я пытаюсь добавить поддержку HTTPS на существующий веб-сервер, написанный на Delphi XE7 с использованием Indy. Я написал простое приложение, которое просто возвращает отметку даты / времени для каждого запроса HTTPS.
Я добавил обработчики к событиям OnCommandGet
и OnException
:
procedure TForm13.HTTPServerCommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
AResponseInfo.ContentText := DateTimeToStr(Now());
AResponseInfo.ContentEncoding := 'utf8';
Log('Request: %s', [ARequestInfo.URI]);
end;
procedure TForm13.HTTPServerException(AContext: TIdContext; AException: Exception);
begin
Log('Exception raised %s:%s', [AException.ClassName, AException.Message]);
end;
Код привязки:
with HTTPServer do
begin
with Bindings.Add() do
begin
IP := '0.0.0.0';
Port := 443;
end;
Active := true;
end;
Когда я выполняю запрос из браузера, в большинстве случаев я получаю это:
12.03.2019 0:50:29 Exception raised EIdConnClosedGracefully:Connection Closed Gracefully.
12.03.2019 0:50:29 Exception raised EIdConnClosedGracefully:Connection Closed Gracefully.
12.03.2019 0:50:30 Request: /
12.03.2019 0:50:30 Exception raised EIdConnClosedGracefully:Connection Closed Gracefully.
12.03.2019 0:50:30 Request: /favicon.ico
12.03.2019 0:51:00 Exception raised EIdSocketError:Socket Error # 10060 Connection timed out.
Обслуживает запрос, а браузер показывает метку времени. Но почему изящное закрытие соединения вызывает исключение?
Что меня беспокоит, так это то, что иногда через 30 секунд после последнего запроса я получаю еще одно исключение, например:
12.03.2019 1:44:53 Exception raised EIdConnClosedGracefully:Connection Closed Gracefully.
12.03.2019 1:44:53 Exception raised EIdConnClosedGracefully:Connection Closed Gracefully.
12.03.2019 1:44:53 Request: /
12.03.2019 1:44:54 Exception raised EIdConnClosedGracefully:Connection Closed Gracefully.
12.03.2019 1:44:54 Request: /favicon.ico
12.03.2019 1:45:24 Exception raised EIdOSSLAcceptError:Error accepting connection with SSL. EOF was observed that violates the protocol
Это происходит случайно, иногда это тайм-аут, иногда этот. Это выглядит неправильно для меня. Есть идеи, почему это происходит?
PS: в Delphi 10.3 это происходит так же, как в Delphi XE7, поэтому, вероятно, затронуты все версии Indy.