TsgcWebSocketServer_HTTPAPI | Bestandsrespons verzenden

Gebruik de eigenschap FileName van het THttpServerResponse-object als u een bestand als reactie op een HTTP-verzoek wilt verzenden.

 


void __fastcall OnHTTPRequest(TsgcWSConnection_HTTPAPI *aConnection,
	const THttpServerRequest *aRequestInfo,
	THttpServerResponse *aResponseInfo)
{
  if (aRequestInfo->Method == "GET")
  {
    if (aRequestInfo->Document == "/test.zip")
	{
	  aResponseInfo->ResponseNo = 200;
	  aResponseInfo->FileName = "c:\download\test.zip";
	  aResponseInfo->ContentType = "application/zip";
	}
	else
	{
	  aResponseInfo->ResponseNo = 404;
	}
  }
  else
  {  
    aResponseInfo->ResponseNo = 500;
  }
}

Hervat bare Downloads

Een HTTP 206 Partial Content-respons wordt gebruikt wanneer een server een verzoek voor een specifiek gedeelte (bereik) van een resource vervult, in plaats van het volledige bestand te verzenden. Dit wordt vaak gebruikt voor hervattbare downloads, mediastreaming en grote bestandsoverdrachten.

Hoe het werkt:

 

Client vraagt een gedeeltelijke resource aan: De client (browser, downloader of mediaspeler) verzendt een Range-header die het gewenste bytebereik aangeeft. Voorbeeldverzoek:

 

GET /video.mp4 HTTP/1.1
Host: example.com
Range: bytes=1000-5000

 

Dit verzoekt bytes 1000 tot 5000 van video.mp4.

 

Server reageert met HTTP 206: Als de server bereikverzoeken ondersteunt, reageert hij met 206 Partial Content en voegt een Content-Range-header toe. Voorbeeldreactie:

 

HTTP/1.1 206 Partial Content
Content-Range: bytes 1000-5000/1000000
Content-Length: 4001
Content-Type: video/mp4

 

De Content-Range-header toont:

 

Het bediende bereik (1000-5000)

De totale grootte van het bestand (1000000 bytes).

De Content-Length-header is de grootte van het geretourneerde gedeelte (4001 bytes).

 

Client kan meer fragmenten opvragen:

De client kan meerdere verzoeken indienen voor verschillende onderdelen.

Dit maakt hervattbare downloads en efficiënt streamen mogelijk.

 


void __fastcall OnHTTPRequest(TIdContext* AContext, TIdHTTPRequestInfo* ARequestInfo, TIdHTTPResponseInfo* AResponseInfo)
{
    std::unique_ptr<TFileStream> oStream(new TFileStream("test.pdf", fmOpenRead | fmShareDenyWrite));
    std::unique_ptr<TIdEntityRangeStrings> oRanges(new TIdEntityRangeStrings(nullptr));
    try {
        oRanges->Text = ARequestInfo->RawHeaders->Values["Range"];
        AResponseInfo->ContentType = "application/pdf";
        if (oRanges->Count > 0) {
            AResponseInfo->ResponseNo = 206; // Partial Content
            AResponseInfo->AcceptRanges = "bytes";
            AResponseInfo->ContentRangeStart = oRanges->Items[0]->StartPos;
            AResponseInfo->ContentRangeEnd = oRanges->Items[0]->EndPos;
            AResponseInfo->ContentRangeInstanceLength = oStream->Size;
            
            AResponseInfo->ContentStream = new TIdHTTPRangeStream(oStream.release(), 
                AResponseInfo->ContentRangeStart, AResponseInfo->ContentRangeEnd);
        } else {
            AResponseInfo->ResponseNo = 200; // OK
            AResponseInfo->ContentStream = oStream.release();
        }
    } catch (...) {
        // Handle exceptions
    }
}