aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarvin W <git@larma.de>2022-11-04 15:29:18 -0600
committerMarvin W <git@larma.de>2022-11-04 15:45:48 -0600
commite62955d3cf266a7f7ff0f2085a64f1c99021127c (patch)
treea376d6f6c8f7d040635ee213d031789177e1b3af
parent6e37f3fe3fa0f4ce9a25a91e9d97191c8e4abec1 (diff)
downloaddino-e62955d3cf266a7f7ff0f2085a64f1c99021127c.tar.gz
dino-e62955d3cf266a7f7ff0f2085a64f1c99021127c.zip
HTTP: Make LimitInputStream pollable for better async compatibility
Fixes #1307
-rw-r--r--plugins/http-files/src/file_provider.vala21
-rw-r--r--xmpp-vala/CMakeLists.txt11
-rw-r--r--xmpp-vala/src/core/direct_tls_xmpp_stream.vala2
3 files changed, 21 insertions, 13 deletions
diff --git a/plugins/http-files/src/file_provider.vala b/plugins/http-files/src/file_provider.vala
index 7928dc81..1433a74f 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);
}
diff --git a/xmpp-vala/CMakeLists.txt b/xmpp-vala/CMakeLists.txt
index de89f326..0513d597 100644
--- a/xmpp-vala/CMakeLists.txt
+++ b/xmpp-vala/CMakeLists.txt
@@ -7,15 +7,6 @@ find_packages(ENGINE_PACKAGES REQUIRED
ICU
)
-set(ENGINE_DEFINITIONS "")
-
-find_package(GIO)
-if(GIO_VERSION VERSION_GREATER "2.60")
- message(STATUS "ALPN support enabled")
- set(ENGINE_DEFINITIONS ALPN_SUPPORT)
-else()
- message(STATUS "No ALPN support, needs GIO >= 2.60")
-endif()
set(ENGINE_EXTRA_OPTIONS ${MAIN_EXTRA_OPTIONS} --vapidir=${CMAKE_CURRENT_SOURCE_DIR}/vapi)
vala_precompile(ENGINE_VALA_C
@@ -154,8 +145,6 @@ GENERATE_HEADER
xmpp-vala
CUSTOM_VAPIS
"${CMAKE_CURRENT_SOURCE_DIR}/src/glib_fixes.vapi"
-DEFINITIONS
- ${ENGINE_DEFINITIONS}
OPTIONS
${ENGINE_EXTRA_OPTIONS}
)
diff --git a/xmpp-vala/src/core/direct_tls_xmpp_stream.vala b/xmpp-vala/src/core/direct_tls_xmpp_stream.vala
index 8819e2df..aec17acd 100644
--- a/xmpp-vala/src/core/direct_tls_xmpp_stream.vala
+++ b/xmpp-vala/src/core/direct_tls_xmpp_stream.vala
@@ -19,7 +19,7 @@ public class Xmpp.DirectTlsXmppStream : TlsXmppStream {
debug("Connecting to %s:%i (tls)", host, port);
IOStream? io_stream = yield client.connect_to_host_async(host, port);
TlsConnection tls_connection = TlsClientConnection.new(io_stream, new NetworkAddress(remote_name.to_string(), port));
-#if ALPN_SUPPORT
+#if GLIB_2_60
tls_connection.set_advertised_protocols(ADVERTISED_PROTOCOLS);
#endif
tls_connection.accept_certificate.connect(on_invalid_certificate);