ecere/net: (WIP) Further tweaks for HTTP client
authorJerome St-Louis <jerome@ecere.com>
Tue, 27 Sep 2016 10:05:45 +0000 (06:05 -0400)
committerJerome St-Louis <jerome@ecere.com>
Mon, 21 Nov 2016 14:19:04 +0000 (09:19 -0500)
ecere/src/net/HTTPFile.ec
ecere/src/net/Socket.ec

index f13a5b0..dfb483f 100644 (file)
@@ -424,6 +424,7 @@ private:
                         connection = c;      // TOFIX: 'incref c' doesn't work
                         incref connection;      // HTTPFile reference if we keep it
                         connectionsMutex.Release();
+                        connection.OnReceive = Socket::OnReceive;
                         connection.ProcessTimeOut(0.000001);
                         connectionsMutex.Wait();
                         if(!connection.connected || connection.file)
@@ -559,9 +560,17 @@ private:
             // ::PrintLn("Sending GET for ", name, " ", (uint64)this, " in thread ", GetCurrentThreadID(), "\n");
             connection.Send(msg, len);
 
-            while(this.connection && this.connection.connected && !done)
             {
-               this.connection.Process();
+               Time startTime = GetTime();
+               while(this.connection && this.connection.connected && !done)
+               {
+                  //this.connection.Process();
+                  if(!this.connection.ProcessTimeOut(5) || GetTime() - startTime > 5)
+                  {
+                     status = 0;
+                     break;
+                  }
+               }
             }
             //::PrintLn("Got DONE for ", name, " ", (uint64)this, " in thread ", GetCurrentThreadID(), "\n");
 
@@ -759,7 +768,10 @@ private:
                // First time check if we already have bytes, second time wait for an event
                connection.Process();
                if(wait && bufferCount - bufferPos == 0 && GetTime() - lastTime > 5)
+               {
+                  connection.Disconnect(remoteClosed);
                   eof = true;
+               }
                wait = true;
             }
          }
index 6736908..5befdd3 100644 (file)
@@ -659,35 +659,38 @@ private:
          int count = 0;
 
          result = true;
-         if((int)recvBufferSize - recvBytes < MAX_RECEIVE)
+         if(!leftOver)
          {
-            recvBuffer = renew recvBuffer byte[recvBufferSize + MAX_RECEIVE];
-            recvBufferSize += MAX_RECEIVE;
-         }
-
-         if(FD_ISSET(s, rs) && disconnectCode == (DisconnectCode)-1)
-         {
-            if(type == tcp /*|| _connected*/)
-               count = ReceiveData(recvBuffer + recvBytes, recvBufferSize - recvBytes, 0);
-            else
+            if((int)recvBufferSize - recvBytes < MAX_RECEIVE)
             {
-               SOCKLEN_TYPE len = sizeof(a);
-               count = (int)recvfrom(s, (char *)recvBuffer + recvBytes,
-                  recvBufferSize - recvBytes, 0, (SOCKADDR *)&a, &len);
-               strcpy(inetAddress, inet_ntoa(this.a.sin_addr));
-               inetPort = ntohs((uint16)a.sin_port);
+               recvBuffer = renew recvBuffer byte[recvBufferSize + MAX_RECEIVE];
+               recvBufferSize += MAX_RECEIVE;
             }
-            switch(count)
+
+            if(FD_ISSET(s, rs) && disconnectCode == (DisconnectCode)-1)
             {
-               case 0:
-                  disconnectCode = remoteClosed;
-                  break;
-               case -1:
+               if(type == tcp /*|| _connected*/)
+                  count = ReceiveData(recvBuffer + recvBytes, recvBufferSize - recvBytes, 0);
+               else
                {
-                  /*int yo = errno;
-                  printf("Errno is %d", errno);*/
-                  disconnectCode = remoteLost;
-                  break;
+                  SOCKLEN_TYPE len = sizeof(a);
+                  count = (int)recvfrom(s, (char *)recvBuffer + recvBytes,
+                     recvBufferSize - recvBytes, 0, (SOCKADDR *)&a, &len);
+                  strcpy(inetAddress, inet_ntoa(this.a.sin_addr));
+                  inetPort = ntohs((uint16)a.sin_port);
+               }
+               switch(count)
+               {
+                  case 0:
+                     disconnectCode = remoteClosed;
+                     break;
+                  case -1:
+                  {
+                     /*int yo = errno;
+                     printf("Errno is %d", errno);*/
+                     disconnectCode = remoteLost;
+                     break;
+                  }
                }
             }
          }
@@ -771,8 +774,27 @@ private:
       fd_set rs, ws, es;
       int selectResult;
       Mutex mutex;
+      bool deleteMutex = false;
+      bool leftOver;
+
+      mutex = this.mutex;
+      mutex.Wait();
+      incref this;
 
-      if(disconnectCode > 0 && !leftOver) return false;
+      leftOver = this.leftOver;
+      if(disconnectCode > 0 && !leftOver)
+      {
+         if(_refCount == 1)
+         {
+            deleteMutex = true;
+            this.mutex = null;
+         }
+         delete this;
+         mutex.Release();
+         if(deleteMutex)
+            delete mutex;
+         return false;
+      }
       FD_ZERO(&rs);
       FD_ZERO(&ws);
       FD_ZERO(&es);
@@ -780,9 +802,6 @@ private:
       //FD_SET(s, &ws);
       FD_SET(s, &es);
 
-      mutex = this.mutex;
-      mutex.Wait();
-      incref this;
       mutex.Release();
       selectResult = select((int)(s+1), &rs, &ws, &es, leftOver ? &tv : (timeOut ? &tvTO : null));
 
@@ -791,10 +810,15 @@ private:
          gotEvent |= ProcessSocket(&rs, &ws, &es);
       }
       mutex.Wait();
-      this.mutex = null;
+      if(_refCount == 1)
+      {
+         deleteMutex = true;
+         this.mutex = null;
+      }
       delete this;
       mutex.Release();
-      delete mutex;
+      if(deleteMutex)
+         delete mutex;
       return gotEvent;
    }