uclient: add function for getting the amount of pending read/write data
authorFelix Fietkau <nbd@nbd.name>
Thu, 4 Apr 2024 18:45:16 +0000 (20:45 +0200)
committerFelix Fietkau <nbd@nbd.name>
Thu, 4 Apr 2024 18:45:18 +0000 (20:45 +0200)
This can be used to throttle writes when doing large POST requests

Signed-off-by: Felix Fietkau <nbd@nbd.name>
uclient-backend.h
uclient-http.c
uclient.c
uclient.h

index b013cde0b05dd04c4ffaa97a26ef430191ab1bd0..1b808ac8f705369d12006f119122c813839c9009 100644 (file)
@@ -34,6 +34,7 @@ struct uclient_backend {
 
        int (*read)(struct uclient *cl, char *buf, unsigned int len);
        int (*write)(struct uclient *cl, const char *buf, unsigned int len);
+       int (*pending_bytes)(struct uclient *cl, bool write);
 };
 
 void uclient_backend_set_error(struct uclient *cl, int code);
index 33f651301d4e373751808c2c517ebbfee4df53cd..d6e9dcfd542e8584d97e2e4cf0050fb399121984 100644 (file)
@@ -1229,6 +1229,14 @@ int uclient_http_set_address_family(struct uclient *cl, int af)
        return 0;
 }
 
+static int
+uclient_http_pending_bytes(struct uclient *cl, bool write)
+{
+       struct uclient_http *uh = container_of(cl, struct uclient_http, uc);
+
+       return ustream_pending_data(uh->us, write);
+}
+
 const struct uclient_backend uclient_backend_http = {
        .prefix = uclient_http_prefix,
 
@@ -1242,4 +1250,5 @@ const struct uclient_backend uclient_backend_http = {
        .read = uclient_http_read,
        .write = uclient_http_send_data,
        .request = uclient_http_request_done,
+       .pending_bytes = uclient_http_pending_bytes,
 };
index a309de8595f2ac168c2056d249805fe1eff7c11f..0fb92b869ac0f15d7a0a13c9b3771f9feb39aa5b 100644 (file)
--- a/uclient.c
+++ b/uclient.c
@@ -406,6 +406,14 @@ int uclient_read(struct uclient *cl, char *buf, int len)
        return cl->backend->read(cl, buf, len);
 }
 
+int uclient_pending_bytes(struct uclient *cl, bool write)
+{
+       if (!cl->backend->pending_bytes)
+               return -1;
+
+       return cl->backend->pending_bytes(cl, write);
+}
+
 void uclient_disconnect(struct uclient *cl)
 {
        uloop_timeout_cancel(&cl->connection_timeout);
index 29563b35d215bd297962bdfca3e0dd22cf2f219e..5ccda748c0312fabc883fd1fb8cef1779579ce7b 100644 (file)
--- a/uclient.h
+++ b/uclient.h
@@ -113,6 +113,7 @@ void uclient_disconnect(struct uclient *cl);
 
 int uclient_read(struct uclient *cl, char *buf, int len);
 int uclient_write(struct uclient *cl, const char *buf, int len);
+int uclient_pending_bytes(struct uclient *cl, bool write);
 int uclient_request(struct uclient *cl);
 
 char *uclient_get_addr(char *dest, int *port, union uclient_addr *a);