HTTP는 일반적으로 요청/응답 패턴으로 작동합니다. 클라이언트가 리소스에 대한 REQUEST를 SERVER로 보내면, SERVER는 요청된 리소스나 오류와 함께 RESPONSE를 보냅니다. 일반적으로 브라우저와 같은 클라이언트는 서버가 제공하는 자산에 대해 일련의 요청을 합니다.

이 접근 방식의 주요 문제는 클라이언트가 먼저 리소스를 가져오는 요청을 보내고(예: index.html), 서버가 응답을 보낼 때까지 기다리고, 콘텐츠를 읽은 다음, 다른 모든 요청(예: styles.css)을 해야 한다는 것입니다.
HTTP/2 서버 푸시는 이 문제를 해결하려고 합니다. 클라이언트가 파일을 요청할 때 서버가 이 파일에 추가 파일이 필요하다고 판단하면 해당 파일이 자동으로 클라이언트에 PUSH됩니다.

위 스크린샷에서 클라이언트는 먼저 index.html을 요청합니다. 서버는 이 요청을 읽고 응답으로 2개의 파일을 보냅니다: index.html과 styles.css. 따라서 styles.css를 얻기 위한 두 번째 요청을 피합니다.
위의 스크린샷을 따라, /index.html 파일에 대한 새 요청이 있을 때마다 서버가 index.html과 styles.css를 보내도록 서버를 구성할 수 있습니다.
각 요청을 push promise 목록과 연결하려면 PushPromiseAddPreLoadLinks 메서드를 사용하십시오.
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;
Chrome 개발자 도구를 사용하여 styles.css 파일이 클라이언트로 어떻게 푸시되는지 볼 수 있습니다.
