PureBasic
PureBasic
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 PureBasic Downloads
IncludeFile "CkHttpResponse.pb"
IncludeFile "CkHttp.pb"
IncludeFile "CkBinData.pb"
IncludeFile "CkMime.pb"
IncludeFile "CkHttpRequest.pb"
Procedure ChilkatExample()
success.i = 0
; This example requires the Chilkat API to have been previously unlocked.
; See Global Unlock Sample for sample code.
http.i = CkHttp::ckCreate()
If http.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
req.i = CkHttpRequest::ckCreate()
If req.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
; ...
; 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.i = CkHttpResponse::ckCreate()
If resp.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
success = CkHttp::ckHttpSReq(http,"www.somedomain.com",443,1,req,resp)
If success = 0
Debug CkHttp::ckLastErrorText(http)
CkHttp::ckDispose(http)
CkHttpRequest::ckDispose(req)
CkHttpResponse::ckDispose(resp)
ProcedureReturn
EndIf
; Get the response body (which is expected to be binary)
respBody.i = CkBinData::ckCreate()
If respBody.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
CkHttpResponse::ckGetBodyBd(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.i = CkMime::ckCreate()
If mime.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
success = CkMime::ckLoadMimeBd(mime,respBody)
If success = 0
Debug CkMime::ckLastErrorText(mime)
CkHttp::ckDispose(http)
CkHttpRequest::ckDispose(req)
CkHttpResponse::ckDispose(resp)
CkBinData::ckDispose(respBody)
CkMime::ckDispose(mime)
ProcedureReturn
EndIf
numParts.i = CkMime::ckNumParts(mime)
If numParts < 2
Debug "Expected multipart MIME with at least 2 sub-parts."
CkHttp::ckDispose(http)
CkHttpRequest::ckDispose(req)
CkHttpResponse::ckDispose(resp)
CkBinData::ckDispose(respBody)
CkMime::ckDispose(mime)
ProcedureReturn
EndIf
; Get the 1st sub-part, which is the XML.
part0.i = CkMime::ckCreate()
If part0.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
CkMime::ckPartAt(mime,0,part0)
; Should be OK because we checked NumParts above..
xmlStr.s = CkMime::ckGetBodyDecoded(part0)
Debug xmlStr
Debug "----"
; Save the 2nd part to a file. (It is a .zip file in our test case..)
part1.i = CkMime::ckCreate()
If part1.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
CkMime::ckPartAt(mime,1,part1)
success = CkMime::ckSaveBody(part1,"qa_output/attachedZip.zip")
; Alternatively, we could extract the binary data to a BinData and use elsewhere..
zipData.i = CkBinData::ckCreate()
If zipData.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
success = CkMime::ckGetBodyBd(part1,zipData)
success = CkBinData::ckWriteFile(zipData,"qa_output/attachedZip_again.zip")
Debug "OK."
CkHttp::ckDispose(http)
CkHttpRequest::ckDispose(req)
CkHttpResponse::ckDispose(resp)
CkBinData::ckDispose(respBody)
CkMime::ckDispose(mime)
CkMime::ckDispose(part0)
CkMime::ckDispose(part1)
CkBinData::ckDispose(zipData)
ProcedureReturn
EndProcedure