efl_net_dialer_http: fix short downloads.
authorGustavo Sverzut Barbieri <barbieri@profusion.mobi>
Thu, 27 Oct 2016 00:54:42 +0000 (22:54 -0200)
committerGustavo Sverzut Barbieri <barbieri@profusion.mobi>
Thu, 27 Oct 2016 01:19:46 +0000 (23:19 -0200)
for short downloads the CURL handle will be done before the client had
time to read it, like done by efl_io_copier's job. We need to wait it
drain before we emit eos/closed.

src/lib/ecore_con/efl_net_dialer_http.c

index 7399f06..af9f9fb 100644 (file)
@@ -214,6 +214,7 @@ typedef struct
    Eina_Bool closed;
    Eina_Bool close_on_exec;
    Eina_Bool close_on_destructor;
+   Eina_Bool pending_eos;
    Eina_Bool eos;
    Eina_Bool can_read;
    Eina_Bool can_write;
@@ -313,8 +314,13 @@ _efl_net_dialer_http_curlm_check(Efl_Net_Dialer_Http_Curlm *cm)
         pd = efl_data_scope_get(dialer, MY_CLASS);
         if (pd->error)
           efl_event_callback_call(dialer, EFL_NET_DIALER_EVENT_ERROR, &pd->error);
-        efl_io_reader_eos_set(dialer, EINA_TRUE);
-        efl_io_closer_close(dialer);
+        if (pd->recv.used > 0) pd->pending_eos = EINA_TRUE;
+        else
+          {
+             efl_io_reader_eos_set(dialer, EINA_TRUE);
+             efl_io_closer_close(dialer);
+          }
+
         _efl_net_dialer_http_curlm_check_finished_object_remove(&finished, dialer);
         efl_unref(dialer);
      }
@@ -1534,6 +1540,11 @@ _efl_net_dialer_http_efl_io_reader_read(Eo *o, Efl_Net_Dialer_Http_Data *pd, Ein
    if (ro_slice.len == 0)
      {
         rw_slice->len = 0;
+        if (pd->pending_eos)
+          {
+             efl_io_reader_eos_set(o, EINA_TRUE);
+             efl_io_closer_close(o);
+          }
         return EAGAIN;
      }
    ro_slice.bytes = pd->recv.bytes;
@@ -1547,6 +1558,13 @@ _efl_net_dialer_http_efl_io_reader_read(Eo *o, Efl_Net_Dialer_Http_Data *pd, Ein
    pd->recv.used = remaining;
    efl_io_reader_can_read_set(o, remaining > 0);
 
+   if ((pd->pending_eos) && (remaining == 0))
+     {
+        efl_io_reader_eos_set(o, EINA_TRUE);
+        efl_io_closer_close(o);
+        return 0;
+     }
+
    if ((pd->pause & CURLPAUSE_RECV) && (pd->recv.used < pd->recv.limit))
      {
         Eina_Error err;