TsgcWebSocketServer_HTTPAPI | Envoyer une réponse de fichier

Utilisez la propriété FileName de l'objet THttpServerResponse si vous souhaitez envoyer un fichier en réponse à une requête HTTP.

 


procedure OnHTTPRequest(aConnection: TsgcWSConnection_HTTPAPI; 
	const aRequestInfo: THttpServerRequest; 
	var aResponseInfo: THttpServerResponse);
begin
  if aRequestInfo.Method = 'GET' then
  begin
    if aRequestInfo.Document = '/test.zip' then
	begin
	  aResponseInfo.ResponseNo := 200;
	  aResponseInfo.FileName := 'c:\download\test.zip';
	  aResponseInfo.ContentType := 'application/zip';
	end
	else
	  aResponseInfo.ResponseNo := 404;
  end
  else 
    aResponseInfo.ResponseNo := 500;
end;

Téléchargements reprenables

Une réponse HTTP 206 Contenu partiel est utilisée lorsqu'un serveur répond à une demande concernant une portion spécifique (plage) d'une ressource, au lieu d'envoyer le fichier entier. Ceci est couramment utilisé pour les téléchargements reprenables, la diffusion multimédia et les transferts de fichiers volumineux.

Fonctionnement :

 

Le client demande une ressource partielle : Le client (navigateur, téléchargeur ou lecteur multimédia) envoie un en-tête Range spécifiant la plage d'octets souhaitée. Exemple de requête :

 

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

 

Cette requête demande les octets 1000 à 5000 de video.mp4.

 

Le serveur répond avec HTTP 206 : Si le serveur prend en charge les requêtes de plage, il répond avec 206 Partial Content et inclut un en-tête Content-Range. Exemple de réponse :

 

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

 

L'en-tête Content-Range affiche :

 

La plage servie (1000-5000)

La taille totale du fichier (1 000 000 octets).

L'en-tête Content-Length correspond à la taille de la portion retournée (4001 octets).

 

Le client peut demander plus de morceaux :

Le client peut envoyer plusieurs requêtes pour différentes parties.

Cela permet des téléchargements reprenables et un streaming efficace.

 


procedure OnHTTPRequest(aConnection: TsgcWSConnection_HTTPAPI;
const aRequestInfo: THttpServerRequest; var aResponseInfo: THttpServerResponse);
var
  oStream: TFileStream;
  oRanges: TIdEntityRanges;
begin
  oStream := TFileStream.Create('test.pdf', fmOpenRead);
  oRanges := TIdEntityRanges.Create(nil);
  Try
    oRanges.Text := aRequestInfo.Range;
    aResponseInfo.ContentType := 'application/pdf';
    if oRanges.Count > 0 then
    begin
      aResponseInfo.ResponseNo := 206;
      aResponseInfo.AcceptRanges := 'bytes';
      aResponseInfo.ContentRangeStart := oRanges[0].StartPos;
      aResponseInfo.ContentRangeEnd := oRanges[0].EndPos;
      aResponseInfo.ContentRangeInstanceLength := oStream.Size;
      aResponseInfo.ContentStream := TIdHTTPRangeStream.Create(oStream,
        aResponseInfo.ContentRangeStart, aResponseInfo.ContentRangeEnd);
    end
    else
    begin
      aResponseInfo.ResponseNo := 200;
      aResponseInfo.ContentStream := oStream;
    end;
  Finally
    oRanges.Free;
  End;
end;