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:
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){