void uclient_backend_reset_state(struct uclient *cl);
struct uclient_url *uclient_get_url(const char *url_str, const char *auth_str);
struct uclient_url *uclient_get_url_location(struct uclient_url *url, const char *location);
+static inline void uclient_backend_read_notify(struct uclient *cl)
+{
+ uloop_timeout_set(&cl->read_notify, 1);
+}
#endif
if (uh->state == HTTP_STATE_RECV_DATA) {
/* Now it's uclient user turn to read some data */
uloop_timeout_cancel(&uc->connection_timeout);
-
- if (uc->cb->data_read)
- uc->cb->data_read(uc);
+ uclient_backend_read_notify(uc);
}
}
uclient_backend_set_error(cl, UCLIENT_ERROR_TIMEDOUT);
}
+static void __uclient_read_notify(struct uloop_timeout *timeout)
+{
+ struct uclient *cl = container_of(timeout, struct uclient, read_notify);
+
+ if (cl->cb->data_read)
+ cl->cb->data_read(cl);
+}
+
struct uclient *uclient_new(const char *url_str, const char *auth_str, const struct uclient_cb *cb)
{
struct uclient *cl;
cl->url = url;
cl->timeout_msecs = UCLIENT_DEFAULT_TIMEOUT_MS;
cl->connection_timeout.cb = uclient_connection_timeout;
+ cl->read_notify.cb = __uclient_read_notify;
return cl;
}
{
uloop_timeout_cancel(&cl->connection_timeout);
uloop_timeout_cancel(&cl->timeout);
+ uloop_timeout_cancel(&cl->read_notify);
if (!cl->backend->disconnect)
return;
cl->eof = false;
cl->error_code = 0;
uloop_timeout_cancel(&cl->timeout);
+ uloop_timeout_cancel(&cl->read_notify);
}
const char * uclient_strerror(unsigned err)
struct blob_attr *meta;
struct uloop_timeout connection_timeout;
+ struct uloop_timeout read_notify;
struct uloop_timeout timeout;
};