[Gambas-user] Support for IMAP in gb.net.curl

Tony Morehen tmorehen at ...3602...
Thu Sep 28 04:34:57 CEST 2017

Benoit, the Read issue is resolved.  I tested using both the the 
existing code, with the read loop and the original code where it tries 
to read the entire message at once.  Both work for both a TCP connection 
and an openssl connection.

However, the send comand for a TCP connection raises a socket closed 
error.  Not right away, but after several send commands. It seems to be 
a timing issue, the error is not raised when I step through the code.  
The send command is simply:

Public Sub Send(Data As String)

   Print #$hStream, Data


There is no error at all using an ssl connection.

On 2017-09-26 08:59 PM, Benoît Minisini via Gambas-user wrote:
> Hi, Tony.
> I have just pushed the 'rework-stream-interface' branch to the gitlab 
> repository.
> I have reworked the internal interpreter stream interface, so that 
> incomplete reads are retried automatically until all the data is read 
> or an error occurs, whatever the underlying stream.
> Can you try it and tell me if it fixes the incomplete read on TCP 
> sockets?
> Regards,
> Le 24/09/2017 à 04:07, Tony Morehen a écrit :
>> I came across an interesting issue when working on Imap's Fetch 
>> command.  Fetch is used to down load messages.  The response to a 
>> Fetch has 4 parts:
>> 1) a single line providing the size of the download, say, 69000 bytes.
>> 2) the mime-encoded download (a string 69000 bytes long)
>> 3) one line whose only contents is ")"
>> 4) one line status line.
>> So my code does:
>> Readline
>> response = Read #stream, iSize    'iSize=69000
>> Readline
>> Readline
>> Using a TCP socket,  the Read # line has no error but the download is 
>> incomplete, say only 50000 bytes.  The remaining 19000 byes is read 
>> by the next Readline.  However, the response variable is the correct 
>> 69000 bytes in length, with the last 19000 bytes zero-filled.  Its 
>> like the Read # timed out but the timeout is set to 10000 and 10 
>> seconds had not elapsed. Socket.blocking was set to True.
>> Using an openssl process, the Read # line raises an error: Error 9, 
>> Bad file descriptor.
>> I have a workaround:  Read # is replaced with
>>    Dim result as new String[]
>>    Bytesread=0
>>    Do While BytesRead < iSize
>>      Response = Read #$hStream,  IIf(iSize - BytesRead > 4096, 4096, 
>> iSize - BytesRead)
>>      result.Add(Response)
>>      bytesread += 4096
>>    Loop
>>    Response = result.Join("")
>> Now both TCP and openssl work, no zero-fill no errors.
>> Any ideas? Other fixes?

More information about the User mailing list