From e62955d3cf266a7f7ff0f2085a64f1c99021127c Mon Sep 17 00:00:00 2001 From: Marvin W Date: Fri, 4 Nov 2022 15:29:18 -0600 Subject: HTTP: Make LimitInputStream pollable for better async compatibility Fixes #1307 --- plugins/http-files/src/file_provider.vala | 21 ++++++++++++++++++++- xmpp-vala/CMakeLists.txt | 11 ----------- xmpp-vala/src/core/direct_tls_xmpp_stream.vala | 2 +- 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); -- cgit v1.2.3-54-g00ecf