BastliBridge

A bot framework bridgin multiple IM protocols, and mail
git clone git://xatko.vsos.ethz.ch/BastliBridge.git
Log | Files | Refs | Submodules

commit da987ff20a43bef86df3571ac7146c1fd65bd144
parent 4edb2e2b6a607ce052a218c65064ffd00ba7e495
Author: Dominik Schmidt <das1993@hotmail.com>
Date:   Sun, 24 Sep 2017 00:12:36 +0200

Create receiveDynamic function, which expands a buffer as it reads.

Diffstat:
src/telegram.d | 45+++++++++++++++++++++++++--------------------
1 file changed, 25 insertions(+), 20 deletions(-)

diff --git a/src/telegram.d b/src/telegram.d @@ -33,6 +33,29 @@ class TelegramError : Error{ } } +ubyte[] receiveDynamic(Socket sock, ubyte[] buffer, size_t chunk_size=1024){ + ubyte[] buf=buffer; + size_t pos=0,res=0; + while(true){ + trace("Reading on ", sock.handle, "(", sock , ") ", " with buffer ", buf.ptr, " of length ", buf.length); + res=sock.receive(buf); + if(res==0){ + info("Socket ", sock.handle, " died"); + return []; + } + else if(res==Socket.ERROR){ + throw new ErrnoException("Error reading from socket"); + } + pos+=res; + if(pos<buffer.length) + break; + if(pos>=buffer.length){ + buffer.length+=chunk_size; + } + buf=buffer[pos..$]; + } + return buffer[0..pos]; +} struct Telegram{ string token=""; @@ -161,27 +184,9 @@ struct Telegram{ } body{ static immutable size_t chunk_size=1024; + static ubyte[] buffer=new ubyte[chunk_size]; //This initialization is static, i.e. only done once - ubyte[] buf=buffer; - size_t pos=0,res=0; - while(true){ - res=sock.receive(buf); - if(res==0){ - info("Socket ", sock.handle, " died"); - return []; - } - else if(res==Socket.ERROR){ - throw new TelegramErrnoException("Error reading from socket"); - } - pos+=res; - if(pos<buffer.length) - break; - if(pos>=buffer.length){ - buffer.length+=chunk_size; - } - buf=buffer[pos..$]; - } - return cast(const(char)[])buffer[0..pos]; + return cast(char[])sock.receiveDynamic(buffer, chunk_size); } Nullable!(JSONValue) response(Socket sock){