Hi Remy,

Thanks for your answer.

It feels a bit awkward this way though. Do you know any reason why user
code should be bothered with reloading the timeout ticks? Why doesn't
http_client deal with this when it gets notified about a new packet on "
httpc_tcp_recv" ?

And no, the opaque type is still as is in the latest and greatest version
of lwip. Clearly indicating "I shouldn't be using their httpc_state_t,
right?

Would this make sense to you:

/** http client tcp recv callback */
static err_t
httpc_tcp_recv(void *arg, struct altcp_pcb *pcb, struct pbuf *p, err_t r)
{
  httpc_state_t* req = (httpc_state_t*)arg;
  LWIP_UNUSED_ARG(r);
...
...
...
  if ((p != NULL) && (req->parse_state == HTTPC_PARSE_RX_DATA)) {
    req->rx_content_len += p->tot_len;


// ----- RESET TIMER TICKS HERE ------
    req->timeout_ticks = HTTPC_POLL_TIMEOUT;


    if (req->recv_fn != NULL) {

/* directly return here: the connection migth already be aborted from
the callback! */
      return req->recv_fn(req->callback_arg, pcb, p, r);
    } else {
      altcp_recved(pcb, p->tot_len);
      pbuf_free(p);
    }
  }
  return ERR_OK;
}

This solves my problem, and this way user code is not bothered with
something I think it shouldn't have to bother with. And the httpc_state_t
can remain opaque as well.

Best regards, bas



Op wo 16 jun. 2021 om 14:15 schreef Rémy DZIEMIASZKO <
remy.dziemias...@smile.fr>:

> Hello,
>
> When you call 'httpc_get_file' the parameter 'connection' gives you a
> handle on the http_state used for that connection
> then you can passes this handle to 'httpc_get_file' via the parameter
> 'void * callback_arg'
> then your received function will get the handle via the parameter 'void *
> arg'
> then in the received function you can do (http_state_t
> *)arg->timeout_ticks = MY_RELOAD_VALUE;
>
> http_state_t * foo;
> httpc_get_file(ip, port, uri, settings, my_recv_fn, foo, &foo)
>
> err_t  my_recv_fn(void * arg, ...)
> {
>    (http_state_t *)arg->timeout_ticks = MY_RELOAD_VALUE;
> }
>
> You might have a compilation issue because 'http_state_t' is normally
> an opaque type for the application then the member 'timeout_ticks' is
> not visible from the application.
> In a past project I solved that by exporting the definition of
> 'http_state_t' but maybe this is already fixed in the last release of
> lwip.
>
> Regards
> Rémy
>
> Le mer. 16 juin 2021 à 13:24, Bas Prins <bas.pri...@gmail.com> a écrit :
> >
> > Dear ,
> >
> > I don't think I am able to reset the timer. The 'arg' passed  in
> >
> > err_t rec_fn(void *arg, struct altcp_pcb *conn, struct pbuf *p, err_t
> err)
> >
> > is not of type httpc_state_t. The rec_fn callback is called here:
> >
> > static err_t
> > httpc_tcp_recv(void *arg, struct altcp_pcb *pcb, struct pbuf *p, err_t r)
> > ...
> > ...
> > ...
> >     if (req->recv_fn != NULL) {
> >       /* directly return here: the connection migth already be aborted
> from the callback! */
> >       return req->recv_fn(req->callback_arg, pcb, p, r);
> >     }
> >
> > So what's the deal with this function
> >
> > /** http client tcp poll callback */
> > static err_t
> > httpc_tcp_poll(void *arg, struct altcp_pcb *pcb)
> > {
> >   /* implement timeout */
> >   httpc_state_t* req = (httpc_state_t*)arg;
> >   LWIP_UNUSED_ARG(pcb);
> >   if (req != NULL) {
> >     if (req->timeout_ticks) {
> >       req->timeout_ticks--;
> >     }
> >     if (!req->timeout_ticks) {
> >       return httpc_close(req, HTTPC_RESULT_ERR_TIMEOUT, 0, ERR_OK);
> >     }
> >   }
> >   return ERR_OK;
> > }
> >
> > It only decreases the ticks counter. It never gets reset. So I am not
> allowed to download files longer than 30 secs? If the download doesn't
> succeed within that time, http_client closes the connection.
> >
> > I would expect that either the timeout counter is reset every chunk of
> data which is received, or that user code (my code) would receive a pointer
> to the httpc_state_t so that it could reset the timer.
> >
> > Can somebody please explain where I am wrong, what am I missing, or that
> indeed the current implementation of http_client is lacking ?
> >
> > Many thanks in advance
> >
> > best regards, bas
> >
> >
> >
> > Op wo 16 jun. 2021 om 09:29 schreef Bas Prins <bas.pri...@gmail.com>:
> >>
> >> Hi all,
> >>
> >> I found the problem, which was rather easy to find once I convinced
> myself I am man enough to actually read code ;-).
> >>
> >> But now I wonder how to solve this appropriately. The problem seems to
> be, that this function decreases the ticks, until the timeout period is
> consumed, and then simply closes the connection.
> >>
> >> /** http client tcp poll callback */
> >> static err_t
> >> httpc_tcp_poll(void *arg, struct altcp_pcb *pcb)
> >> {
> >>   /* implement timeout */
> >>   httpc_state_t* req = (httpc_state_t*)arg;
> >>   LWIP_UNUSED_ARG(pcb);
> >>   if (req != NULL) {
> >>     if (req->timeout_ticks) {
> >>       req->timeout_ticks--;
> >>     }
> >>     if (!req->timeout_ticks) {
> >>       return httpc_close(req, HTTPC_RESULT_ERR_TIMEOUT, 0, ERR_OK);
> >>     }
> >>   }
> >>   return ERR_OK;
> >> }
> >>
> >> So I wonder, who should be responsible for resetting the timeout
> counter? My code? The definition of the timeout_ticks seems to only visible
> for to http_client.c.
> >>
> >> If I simply comment the line which decreases the counter the download
> works.
> >>
> >> Am I still missing the obvious here?
> >>
> >> Many thanks.
> >>
> >> best regards, bas
> >>
> >> Op ma 14 jun. 2021 om 22:05 schreef Bas Prins <bas.pri...@gmail.com>:
> >>>
> >>> Hi Simon, all,
> >>>
> >>> Fixed the problems I had which led to missing a byte occasionally.
> >>>
> >>> Still unable to download a file using http_client.h. I did learn a
> small part. I log all arguments of
> >>>
> >>> void result_fn(void *arg, httpc_result_t httpc_result, u32_t
> rx_content_len, u32_t srv_res, err_t err)
> >>>
> >>> Which produces this log line:
> >>> 2021-06-14 21:31:52,041 [DEBUG][thread: 5][UartReader] DOWNLOAD
> finished: httpc_result=5, rx_content_len=5019, srv_res=0, error=0
> >>>
> >>>   /** Connection timed out (server didn't respond in time) */
> >>>   HTTPC_RESULT_ERR_TIMEOUT   = 5,
> >>>
> >>> I attached the pcap file of tcpdump.
> >>> - It contains a couple of attempts to download the file (513KB.zip).
> >>> - It shows TCP window full warnings. I don't care too much about that
> now. I'll deal with that once I have a stable download going.
> >>> - It shows the result of the timeout where my STM board closes the
> connection.
> >>>
> >>> I also attached my lwipopts.h and the loggings produced by my app
> (including lwip ppp logging).
> >>>
> >>> Can you help me understand what is going wrong?
> >>> Why is LWIP complaining about the server not responding in time, while
> it seems that the server is doing just fine?
> >>>
> >>> PS: obviously I tested the download on my desktop, I am able to
> download the file repeatedly.
> >>>
> >>> Many thanks in advance!
> >>>
> >>> Best regards, Bas
> >>>
> >>>
> >>> Op vr 11 jun. 2021 om 07:15 schreef goldsi...@gmx.de <goldsi...@gmx.de
> >:
> >>>>
> >>>> Am 10.06.2021 um 17:27 schrieb Bas Prins:
> >>>> > Hi Simon,
> >>>> >
> >>>> > Thanks, that's a very likely explanation already. I just added the
> >>>> > pbuf_free(p) but run into an assert occasionally.
> >>>>
> >>>> You might have to check for 'p != NULL' just like in tcp recv callback
> >>>> functions.
> >>>>
> >>>> Regards,
> >>>> Simon
> >>>>
> >>>> _______________________________________________
> >>>> lwip-users mailing list
> >>>> lwip-users@nongnu.org
> >>>> https://lists.nongnu.org/mailman/listinfo/lwip-users
> >
> > _______________________________________________
> > lwip-users mailing list
> > lwip-users@nongnu.org
> > https://lists.nongnu.org/mailman/listinfo/lwip-users
>
> _______________________________________________
> lwip-users mailing list
> lwip-users@nongnu.org
> https://lists.nongnu.org/mailman/listinfo/lwip-users
_______________________________________________
lwip-users mailing list
lwip-users@nongnu.org
https://lists.nongnu.org/mailman/listinfo/lwip-users

Reply via email to