client: fix spurious keepalive connection timeouts
authorJo-Philipp Wich <jo@mein.io>
Thu, 1 Oct 2020 12:59:09 +0000 (14:59 +0200)
committerJo-Philipp Wich <jo@mein.io>
Sun, 4 Oct 2020 20:59:11 +0000 (22:59 +0200)
commit0f38b0370718518e66dabeaa5522f546cb459393
tree7ba991ecba724a36002f04f416c7983801077319
parent88ba2fa7b414f3f63e66d1708f5bda9465e0ee89
client: fix spurious keepalive connection timeouts

When an uhttpd dispatch_handler provides a data_done callback which is
synchroneously finishing the request through ops->request_done(), the
calling client_poll_post_data() procedure incorrectly resets the resulting
client state from CLIENT_STATE_INIT to CLIENT_STATE_DONE which causes the
next uh_client_read_cb() invocation to bail out since no callback is
available for the CLIENT_STATE_DONE state, effectively discarding the
just received inbound request and sending the persistent connection state
into a deadlock sitation where the http client waits for a response to
its just sent request and uhttpd for further data to read.

Fix this issue by only setting CLIENT_STATE_DONE if the data_done callback
has not modified the state in the meanwhile.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
client.c