barbieri pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=fa3a2e6489deb7bbfc7772c4facf4cc27fb73a46

commit fa3a2e6489deb7bbfc7772c4facf4cc27fb73a46
Author: Gustavo Sverzut Barbieri <[email protected]>
Date:   Wed Oct 26 22:54:42 2016 -0200

    efl_net_dialer_http: fix short downloads.
    
    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 | 22 ++++++++++++++++++++--
 1 file changed, 20 insertions(+), 2 deletions(-)

diff --git a/src/lib/ecore_con/efl_net_dialer_http.c 
b/src/lib/ecore_con/efl_net_dialer_http.c
index 7399f06..af9f9fb 100644
--- a/src/lib/ecore_con/efl_net_dialer_http.c
+++ b/src/lib/ecore_con/efl_net_dialer_http.c
@@ -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;

-- 


Reply via email to