Sample code for 30+ languages & platforms
Pascal (Lazarus/Delphi)

Parse Multipart Binary Http Response

See more HTTP Examples

This example demonstrates how to parse an HTTP response that is multipart and contains a binary file, such as a .zip or .pdf.

Chilkat Pascal (Lazarus/Delphi) Downloads

Pascal (Lazarus/Delphi)
program ChilkatDemo;

// Demonstrates using the Chilkat Pascal wrapper via the C bridge DLL.
// Builds as a console application under Lazarus (FPC) or Delphi.

{$IFDEF FPC}
  {$MODE DELPHI}
{$ENDIF}
{$APPTYPE CONSOLE}

uses
  {$IFDEF UNIX}
  cthreads,
  {$ENDIF}
  SysUtils,
  CkDllLoader,
  Chilkat.Http,
  Chilkat.HttpRequest,
  Chilkat.BinData,
  Chilkat.HttpResponse,
  Chilkat.Mime;

// ---------------------------------------------------------------------------

procedure RunDemo;
var
  success: Boolean;
  http: THttp;
  req: THttpRequest;
  resp: THttpResponse;
  respBody: TBinData;
  mime: TMime;
  numParts: Integer;
  part0: TMime;
  xmlStr: string;
  part1: TMime;
  zipData: TBinData;

begin
  success := False;

  //  This example requires the Chilkat API to have been previously unlocked.
  //  See Global Unlock Sample for sample code.

  http := THttp.Create;
  req := THttpRequest.Create;

  //  ...
  //  Insert code here to construct some kind of HTTP request.
  //  this example is to show how to parse a particular kind of response.
  //  ...
  //  ...

  //  Send the request (whatever it may be in your case) to get the HTTP response object.
  resp := THttpResponse.Create;
  success := http.HttpSReq('www.somedomain.com',443,True,req,resp);
  if (success = False) then
    begin
      WriteLn(http.LastErrorText);
      Exit;
    end;

  //  Get the response body (which is expected to be binary)
  respBody := TBinData.Create;
  resp.GetBodyBd(respBody);

  //  For this example, the response body contains something like this:

  //  ------=_Part_21302_2029949381.1547401515443
  //  Content-Type: application/xop+xml; charset=UTF-8; type="text/xml"
  //  Content-Transfer-Encoding: 8bit
  //  Content-ID: <rootpart@ws.jboss.org>
  //  
  //  <env:Envelope xmlns:env='http://schemas.xmlsoap.org/soap/envelope/'><env:Header></env:Header><env:Body>...</env:Body></env:Envelope>
  //  ------=_Part_21302_2029949381.1547401515443
  //  Content-Type: application/octet-stream
  //  Content-Transfer-Encoding: binary
  //  Content-Id: <fileArchivio-7d302908-4d64-43d3-bf4e-79ce806d43b3@ws.jboss.org>
  //  
  //  BINARY_CONTENT_HERE...
  //  
  //  ------=_Part_21302_2029949381.1547401515443--
  //  

  //  Load it into a Chilkat MIME object.
  mime := TMime.Create;
  success := mime.LoadMimeBd(respBody);
  if (success = False) then
    begin
      WriteLn(mime.LastErrorText);
      Exit;
    end;

  numParts := mime.NumParts;
  if (numParts < 2) then
    begin
      WriteLn('Expected multipart MIME with at least 2 sub-parts.');
      Exit;
    end;

  //  Get the 1st sub-part, which is the XML.

  part0 := TMime.Create;
  mime.PartAt(0,part0);

  //  Should be OK because we checked NumParts above..
  xmlStr := part0.GetBodyDecoded();
  WriteLn(xmlStr);
  WriteLn('----');

  //  Save the 2nd part to a file.  (It is a .zip file in our test case..)

  part1 := TMime.Create;
  mime.PartAt(1,part1);

  success := part1.SaveBody('qa_output/attachedZip.zip');

  //  Alternatively, we could extract the binary data to a BinData and use elsewhere..
  zipData := TBinData.Create;
  success := part1.GetBodyBd(zipData);
  success := zipData.WriteFile('qa_output/attachedZip_again.zip');

  WriteLn('OK.');


  http.Free;
  req.Free;
  resp.Free;
  respBody.Free;
  mime.Free;
  part0.Free;
  part1.Free;
  zipData.Free;

end;

// ---------------------------------------------------------------------------

begin

  try
    RunDemo;
  except
    on E: Exception do
      WriteLn('Unhandled exception: ', E.ClassName, ': ', E.Message);
  end;

  WriteLn;
  {$IFDEF MSWINDOWS}
  WriteLn('Press Enter to exit...');
  ReadLn;
  {$ENDIF}
end.