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; --
