Sample code for 30+ languages & platforms
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

PureBasic
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