C
C
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 C Downloads
#include <C_CkHttp.h>
#include <C_CkHttpRequest.h>
#include <C_CkHttpResponse.h>
#include <C_CkBinData.h>
#include <C_CkMime.h>
void ChilkatSample(void)
{
BOOL success;
HCkHttp http;
HCkHttpRequest req;
HCkHttpResponse resp;
HCkBinData respBody;
HCkMime mime;
int numParts;
HCkMime part0;
const char *xmlStr;
HCkMime part1;
HCkBinData zipData;
success = FALSE;
// This example requires the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.
http = CkHttp_Create();
req = CkHttpRequest_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 = CkHttpResponse_Create();
success = CkHttp_HttpSReq(http,"www.somedomain.com",443,TRUE,req,resp);
if (success == FALSE) {
printf("%s\n",CkHttp_lastErrorText(http));
CkHttp_Dispose(http);
CkHttpRequest_Dispose(req);
CkHttpResponse_Dispose(resp);
return;
}
// Get the response body (which is expected to be binary)
respBody = CkBinData_Create();
CkHttpResponse_GetBodyBd(resp,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 = CkMime_Create();
success = CkMime_LoadMimeBd(mime,respBody);
if (success == FALSE) {
printf("%s\n",CkMime_lastErrorText(mime));
CkHttp_Dispose(http);
CkHttpRequest_Dispose(req);
CkHttpResponse_Dispose(resp);
CkBinData_Dispose(respBody);
CkMime_Dispose(mime);
return;
}
numParts = CkMime_getNumParts(mime);
if (numParts < 2) {
printf("Expected multipart MIME with at least 2 sub-parts.\n");
CkHttp_Dispose(http);
CkHttpRequest_Dispose(req);
CkHttpResponse_Dispose(resp);
CkBinData_Dispose(respBody);
CkMime_Dispose(mime);
return;
}
// Get the 1st sub-part, which is the XML.
part0 = CkMime_Create();
CkMime_PartAt(mime,0,part0);
// Should be OK because we checked NumParts above..
xmlStr = CkMime_getBodyDecoded(part0);
printf("%s\n",xmlStr);
printf("----\n");
// Save the 2nd part to a file. (It is a .zip file in our test case..)
part1 = CkMime_Create();
CkMime_PartAt(mime,1,part1);
success = CkMime_SaveBody(part1,"qa_output/attachedZip.zip");
// Alternatively, we could extract the binary data to a BinData and use elsewhere..
zipData = CkBinData_Create();
success = CkMime_GetBodyBd(part1,zipData);
success = CkBinData_WriteFile(zipData,"qa_output/attachedZip_again.zip");
printf("OK.\n");
CkHttp_Dispose(http);
CkHttpRequest_Dispose(req);
CkHttpResponse_Dispose(resp);
CkBinData_Dispose(respBody);
CkMime_Dispose(mime);
CkMime_Dispose(part0);
CkMime_Dispose(part1);
CkBinData_Dispose(zipData);
}