Unicode C
Unicode 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 Unicode C Downloads
#include <C_CkHttpW.h>
#include <C_CkHttpRequestW.h>
#include <C_CkHttpResponseW.h>
#include <C_CkBinDataW.h>
#include <C_CkMimeW.h>
void ChilkatSample(void)
{
BOOL success;
HCkHttpW http;
HCkHttpRequestW req;
HCkHttpResponseW resp;
HCkBinDataW respBody;
HCkMimeW mime;
int numParts;
HCkMimeW part0;
const wchar_t *xmlStr;
HCkMimeW part1;
HCkBinDataW zipData;
success = FALSE;
// This example requires the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.
http = CkHttpW_Create();
req = CkHttpRequestW_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 = CkHttpResponseW_Create();
success = CkHttpW_HttpSReq(http,L"www.somedomain.com",443,TRUE,req,resp);
if (success == FALSE) {
wprintf(L"%s\n",CkHttpW_lastErrorText(http));
CkHttpW_Dispose(http);
CkHttpRequestW_Dispose(req);
CkHttpResponseW_Dispose(resp);
return;
}
// Get the response body (which is expected to be binary)
respBody = CkBinDataW_Create();
CkHttpResponseW_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 = CkMimeW_Create();
success = CkMimeW_LoadMimeBd(mime,respBody);
if (success == FALSE) {
wprintf(L"%s\n",CkMimeW_lastErrorText(mime));
CkHttpW_Dispose(http);
CkHttpRequestW_Dispose(req);
CkHttpResponseW_Dispose(resp);
CkBinDataW_Dispose(respBody);
CkMimeW_Dispose(mime);
return;
}
numParts = CkMimeW_getNumParts(mime);
if (numParts < 2) {
wprintf(L"Expected multipart MIME with at least 2 sub-parts.\n");
CkHttpW_Dispose(http);
CkHttpRequestW_Dispose(req);
CkHttpResponseW_Dispose(resp);
CkBinDataW_Dispose(respBody);
CkMimeW_Dispose(mime);
return;
}
// Get the 1st sub-part, which is the XML.
part0 = CkMimeW_Create();
CkMimeW_PartAt(mime,0,part0);
// Should be OK because we checked NumParts above..
xmlStr = CkMimeW_getBodyDecoded(part0);
wprintf(L"%s\n",xmlStr);
wprintf(L"----\n");
// Save the 2nd part to a file. (It is a .zip file in our test case..)
part1 = CkMimeW_Create();
CkMimeW_PartAt(mime,1,part1);
success = CkMimeW_SaveBody(part1,L"qa_output/attachedZip.zip");
// Alternatively, we could extract the binary data to a BinData and use elsewhere..
zipData = CkBinDataW_Create();
success = CkMimeW_GetBodyBd(part1,zipData);
success = CkBinDataW_WriteFile(zipData,L"qa_output/attachedZip_again.zip");
wprintf(L"OK.\n");
CkHttpW_Dispose(http);
CkHttpRequestW_Dispose(req);
CkHttpResponseW_Dispose(resp);
CkBinDataW_Dispose(respBody);
CkMimeW_Dispose(mime);
CkMimeW_Dispose(part0);
CkMimeW_Dispose(part1);
CkBinDataW_Dispose(zipData);
}