TsgcWebSocketHTTPServer | HTTP/2 Server Push

HTTP arbeitet normalerweise mit einem Request/Response-Muster, bei dem der Client einen REQUEST für eine Ressource an den SERVER sendet und der SERVER eine RESPONSE mit der angeforderten Ressource oder einem Fehler sendet. Normalerweise stellt der Client, etwa ein Browser, eine Reihe von Requests für Assets, die vom Server bereitgestellt werden.

 

 

Das Hauptproblem bei diesem Ansatz besteht darin, dass der Client zuerst einen Request senden muss, um die Ressource abzurufen (zum Beispiel index.html), warten muss, bis der Server die Response sendet, den Inhalt lesen muss und dann alle anderen Requests stellen muss (zum Beispiel styles.css).

 

HTTP/2 Server Push versucht, dieses Problem zu lösen. Wenn der Client eine Datei anfordert und der Server feststellt, dass diese Datei zusätzliche Dateien benötigt, werden diese Dateien automatisch an den Client GEPUSHT.

 

 

Im obigen Screenshot fordert der Client zuerst index.html an. Der Server liest diese Anfrage und sendet 2 Dateien als Antwort: index.html und styles.css, wodurch eine zweite Anfrage zum Abrufen von styles.css vermieden wird.

 

Server Push konfigurieren

Gemäß den obigen Screenshots können Sie Ihren Server so konfigurieren, dass jedes Mal, wenn es eine neue Anfrage für die Datei /index.html gibt, der Server index.html und styles.css sendet.

 

Verwenden Sie die Methode PushPromiseAddPreLoadLinks, um jede Anfrage mit einer Push-Promise-Liste zu verknüpfen.

 


server := TsgcWebSocketHTTPServer.Create(nil);
oLinks := TStringList.Create;
Try
  oLinks.Add('/styles.css');
  server.PushPromiseAddPreLoadLinks('/index.html', oLinks);
Finally
  oLinks.Free;
End;
      
      procedure OnCommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo:
TIdHTTPResponseInfo);
begin
  if ARequestInfo.Document = '/index.html' then
  begin
    AResponseInfo.ContentText := '';
    AResponseInfo.ContentType := 'text/html';
    AResponseInfo.ResponseNo := 200;
  end
  else if ARequestInfo.Document = '/styles.css' then
  begin
    AResponseInfo.ContentText := '';
    AResponseInfo.ContentType := 'text/css';
    AResponseInfo.ResponseNo := 200;
  end;
end;

Mit dem Chrome-Entwicklertool können Sie sehen, wie die Datei styles.css an den Client gepusht wird.