TsgcWebSocketHTTPServer | HTTP/2 Server Push

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

 

 

이 접근 방식의 주요 문제는 클라이언트가 먼저 리소스를 가져오는 요청을 보내고(예: index.html), 서버가 응답을 보낼 때까지 기다리고, 콘텐츠를 읽은 다음, 다른 모든 요청(예: styles.css)을 해야 한다는 것입니다.

 

HTTP/2 서버 푸시는 이 문제를 해결하려고 합니다. 클라이언트가 파일을 요청할 때 서버가 이 파일에 추가 파일이 필요하다고 판단하면 해당 파일이 자동으로 클라이언트에 PUSH됩니다.

 

 

위 스크린샷에서 클라이언트는 먼저 index.html을 요청합니다. 서버는 이 요청을 읽고 응답으로 2개의 파일을 보냅니다: index.html과 styles.css. 따라서 styles.css를 얻기 위한 두 번째 요청을 피합니다.

 

Server Push 구성

위의 스크린샷을 따라, /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 파일이 클라이언트로 어떻게 푸시되는지 볼 수 있습니다.