Sample code for 30+ languages & platforms
DataFlex

ReceiveString Returns Only the Immediately Available Data

See more Socket/SSL/TLS Examples

Demonstrates that Socket.ReceiveString returns only the text immediately available and not the entire response. The example connects to chilkatsoft.com over TLS and requests big_helloWorld.txt, a large text file of roughly 74,000 lines. A single ReceiveString call returns just the first portion of the response, and the example reports how many characters were received compared with the total size given by the response Content-Length header.

Background. Because ReceiveString returns whatever text is currently available, one call cannot indicate whether the full response has arrived. Knowing when a response is complete requires either a known expected length (such as a Content-Length header or an application-defined length prefix), receiving in a loop until that many bytes are collected, or receiving until the peer closes the connection. This example sends a minimal HTTP request only to exercise ReceiveString against a public server; for actual HTTP work, use the Chilkat Http, Rest, or HttpCurl classes.

Chilkat DataFlex Downloads

DataFlex
Use ChilkatAx-win32.pkg

Procedure Test
    Boolean iSuccess
    Handle hoSocket
    Boolean iBTls
    Integer iMaxWaitMs
    String sHttpReq
    String sResponseText
    Handle hoSb
    String sContentLength
    String sTemp1
    Integer iTemp1
    Boolean bTemp1

    Move False To iSuccess

    Get Create (RefClass(cComChilkatSocket)) To hoSocket
    If (Not(IsComObjectCreated(hoSocket))) Begin
        Send CreateComObject of hoSocket
    End

    //  Connect to chilkatsoft.com over TLS.
    Move True To iBTls
    Move 5000 To iMaxWaitMs
    Get ComConnect Of hoSocket "chilkatsoft.com" 443 iBTls iMaxWaitMs To iSuccess
    If (iSuccess = False) Begin
        Get ComLastErrorText Of hoSocket To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    Set ComStringCharset Of hoSocket To "utf-8"

    //  Send an HTTP GET request for big_helloWorld.txt, a large text file of roughly 74,000 lines of
    //  "Hello World!".  This uses a minimal HTTP request only to exercise ReceiveString against a public
    //  server -- for real HTTP work, use the Chilkat Http, Rest, or HttpCurl classes instead.
    Move "GET /big_helloWorld.txt HTTP/1.1" + (character(13)) + (character(10)) + "Host: chilkatsoft.com" + (character(13)) + (character(10)) + "Connection: close" + (character(13)) + (character(10)) + (character(13)) + (character(10)) To sHttpReq
    Get ComSendString Of hoSocket sHttpReq To iSuccess
    If (iSuccess = False) Begin
        Get ComLastErrorText Of hoSocket To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    //  Call ReceiveString a single time.  It returns only the text that is immediately available --
    //  typically just the first network packet -- and does NOT wait for the entire response to arrive.
    Get ComReceiveString Of hoSocket To sResponseText
    Get ComLastMethodSuccess Of hoSocket To bTemp1
    If (bTemp1 = False) Begin
        Get ComLastErrorText Of hoSocket To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    //  Load the received text into a StringBuilder so its length can be measured and the Content-Length
    //  header extracted.  The Content-Length header gives the total size, in bytes, of the response body.
    Get Create (RefClass(cComChilkatStringBuilder)) To hoSb
    If (Not(IsComObjectCreated(hoSb))) Begin
        Send CreateComObject of hoSb
    End
    Get ComAppend Of hoSb sResponseText To iSuccess
    Get ComGetBetween Of hoSb "Content-Length: " (character(13)) + (character(10)) To sContentLength
    Get ComLastMethodSuccess Of hoSb To bTemp1
    If (bTemp1 = False) Begin
        Get ComLastErrorText Of hoSb To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    //  Compare what this single ReceiveString returned against the full size of the expected response.
    //  The received amount is only a small fraction of the total.
    Get ComLength Of hoSb To iTemp1
    Showln "Characters received so far (headers + partial body): " iTemp1
    Showln "Expected response body size (Content-Length): " sContentLength " bytes"

    //  A single ReceiveString call returns whatever is currently available, so it cannot indicate whether
    //  the full response has arrived.  This makes it difficult to know when a response is complete: the
    //  application must either know how many bytes to expect (for example from a Content-Length header or
    //  an application-defined length prefix) and keep receiving until that many bytes are collected, or
    //  keep receiving until the peer closes the connection.


End_Procedure