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 메서드를 사용하십시오.
TsgcWebSocketHTTPServer *server = new TsgcWebSocketHTTPServer(this);
TStringList *oLinks = new TStringList();
try
{
oLinks->Add("/styles.css");
server->PushPromiseAddPreLoadLinks("/index.html", oLinks);
}
__finally
{
oLinks->Free();
}
void OnCommandGet(TIdContext *AContext, TIdHTTPRequestInfo *ARequestInfo, TIdHTTPResponseInfo *AResponseInfo)
{
if (ARequestInfo->Document == "/index.html")
{
AResponseInfo->ContentText = "";
AResponseInfo->ContentType = "text/html";
AResponseInfo->ResponseNo = 200;
}
else if (ARequestInfo->Document == "/styles.css")
{
AResponseInfo->ContentText = "";
AResponseInfo->ContentType = "text/css";
AResponseInfo->ResponseNo = 200;
}
}
Chrome 개발자 도구를 사용하여 styles.css 파일이 클라이언트로 어떻게 푸시되는지 볼 수 있습니다.
