aboutsummaryrefslogtreecommitdiff
path: root/plugins/http-files/src
diff options
context:
space:
mode:
authorMarvin W <git@larma.de>2022-11-04 15:29:18 -0600
committerXavier Del Campo Romero <xavi92@disroot.org>2026-02-10 23:40:46 +0100
commit4641763e0a22d74205d81907b7459280d43d504d (patch)
treed696a671b9e7a3fe2e98d64599d2a2504700bca3 /plugins/http-files/src
parent42ff4c3a99c2cccfe73e3c166f8bd9c9d7f6600c (diff)
downloaddino-4641763e0a22d74205d81907b7459280d43d504d.tar.gz
HTTP: Make LimitInputStream pollable for better async compatibility
Fixes #1307
Diffstat (limited to 'plugins/http-files/src')
-rw-r--r--plugins/http-files/src/file_provider.vala21
1 files changed, 20 insertions, 1 deletions
diff --git a/plugins/http-files/src/file_provider.vala b/plugins/http-files/src/file_provider.vala
index df7d9c11..734ab102 100644
--- a/plugins/http-files/src/file_provider.vala
+++ b/plugins/http-files/src/file_provider.vala
@@ -46,7 +46,7 @@ public class FileProvider : Dino.FileProvider, Object {
}
}
- private class LimitInputStream : InputStream {
+ private class LimitInputStream : InputStream, PollableInputStream {
InputStream inner;
int64 remaining_size;
@@ -55,6 +55,20 @@ public class FileProvider : Dino.FileProvider, Object {
this.remaining_size = max_size;
}
+ public bool can_poll() {
+ return inner is PollableInputStream && ((PollableInputStream)inner).can_poll();
+ }
+
+ public PollableSource create_source(Cancellable? cancellable = null) {
+ if (!can_poll()) throw new IOError.NOT_SUPPORTED("Stream is not pollable");
+ return ((PollableInputStream)inner).create_source(cancellable);
+ }
+
+ public bool is_readable() {
+ if (!can_poll()) throw new IOError.NOT_SUPPORTED("Stream is not pollable");
+ return ((PollableInputStream)inner).is_readable();
+ }
+
private ssize_t check_limit(ssize_t read) throws IOError {
this.remaining_size -= read;
if (remaining_size < 0) throw new IOError.FAILED("Stream length exceeded limit");
@@ -69,6 +83,11 @@ public class FileProvider : Dino.FileProvider, Object {
return check_limit(yield inner.read_async(buffer, io_priority, cancellable));
}
+ public ssize_t read_nonblocking_fn(uint8[] buffer) throws Error {
+ if (!is_readable()) throw new IOError.WOULD_BLOCK("Stream is not readable");
+ return read(buffer);
+ }
+
public override bool close(Cancellable? cancellable = null) throws IOError {
return inner.close(cancellable);
}