Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package libsoup for openSUSE:Factory checked in at 2022-04-03 21:30:39 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/libsoup (Old) and /work/SRC/openSUSE:Factory/.libsoup.new.1900 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "libsoup" Sun Apr 3 21:30:39 2022 rev:134 rq:966417 version:3.0.6 Changes: -------- --- /work/SRC/openSUSE:Factory/libsoup/libsoup.changes 2022-03-23 20:17:48.286443289 +0100 +++ /work/SRC/openSUSE:Factory/.libsoup.new.1900/libsoup.changes 2022-04-03 21:30:44.607985144 +0200 @@ -1,0 +2,10 @@ +Fri Apr 1 11:08:14 UTC 2022 - Bj??rn Lie <bjorn....@gmail.com> + +- Update to version 3.0.6: + + Misc HTTP/2 fixes. + + Add PUT/POST support to examples/get. + + Add `--user-agent` option to examples/get. + + Misc meson improvements. + + Fix build with Visual Studio. + +------------------------------------------------------------------- Old: ---- libsoup-3.0.5.tar.xz New: ---- libsoup-3.0.6.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ libsoup.spec ++++++ --- /var/tmp/diff_new_pack.M5ybZK/_old 2022-04-03 21:30:45.099979636 +0200 +++ /var/tmp/diff_new_pack.M5ybZK/_new 2022-04-03 21:30:45.107979546 +0200 @@ -18,7 +18,7 @@ %define api_version 3.0 Name: libsoup -Version: 3.0.5 +Version: 3.0.6 Release: 0 Summary: HTTP client/server library for GNOME License: LGPL-2.1-or-later ++++++ libsoup-3.0.5.tar.xz -> libsoup-3.0.6.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsoup-3.0.5/.gitlab-ci.yml new/libsoup-3.0.6/.gitlab-ci.yml --- old/libsoup-3.0.5/.gitlab-ci.yml 2022-03-18 18:43:31.596026700 +0100 +++ new/libsoup-3.0.6/.gitlab-ci.yml 2022-03-31 20:33:58.622886700 +0200 @@ -41,6 +41,7 @@ artifacts: paths: - "_build/meson-logs/autobahn-report" + allow_failure: true fedora-scan: extends: .build diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsoup-3.0.5/NEWS new/libsoup-3.0.6/NEWS --- old/libsoup-3.0.5/NEWS 2022-03-18 18:43:31.598026800 +0100 +++ new/libsoup-3.0.6/NEWS 2022-03-31 20:33:58.624886500 +0200 @@ -1,3 +1,11 @@ +Changes in libsoup from 3.0.5 to 3.0.6: + +* Misc HTTP/2 fixes [Carlos Garcia Campos] +* Add PUT/POST support to examples/get [Carlos Garcia Campos] +* Add `--user-agent` option to examples/get [Carlos Garcia Campos] +* Misc meson improvements [Nirbheek Chauhan] +* Fix build with Visual Studio [Chun-wei Fan] + Changes in libsoup from 3.0.4 to 3.0.5: * Misc HTTP/2 fixes [Carlos Garcia Campos] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsoup-3.0.5/examples/get.c new/libsoup-3.0.6/examples/get.c --- old/libsoup-3.0.5/examples/get.c 2022-03-18 18:43:31.600026800 +0100 +++ new/libsoup-3.0.6/examples/get.c 2022-03-31 20:33:58.625886700 +0200 @@ -11,12 +11,19 @@ #include <stdio.h> #include <stdlib.h> +#include <gio/gio.h> +#ifdef G_OS_UNIX +#include <gio/gunixinputstream.h> +#endif + #include <libsoup/soup.h> static SoupSession *session; static GMainLoop *loop; -static gboolean debug, head, quiet; -static const gchar *output_file_path = NULL; +static gboolean debug, head, expect_continue, quiet, ignore_tls; +static const gchar *method; +static const gchar *output_file_path; +static const gchar *input_file_path; #define OUTPUT_BUFFER_SIZE 8192 @@ -110,8 +117,17 @@ g_object_unref (in); } +static gboolean +accept_certificate (SoupMessage *msg, + GTlsCertificate *certificate, + GTlsCertificateFlags errors) +{ + return TRUE; +} + static const char *ca_file, *proxy; static char *client_cert_file, *client_key_file; +static char *user_agent; static gboolean ntlm; static gboolean negotiate; @@ -125,18 +141,33 @@ { "key", 0, 0, G_OPTION_ARG_STRING, &client_key_file, "Use FILE as the TLS client key file", "FILE" }, + { "ignore-tls", 0, 0, + G_OPTION_ARG_NONE, &ignore_tls, + "Ignore TLS certificate errors", NULL }, { "debug", 'd', 0, G_OPTION_ARG_NONE, &debug, "Show HTTP headers", NULL }, + { "user-agent", 'u', 0, + G_OPTION_ARG_STRING, &user_agent, + "User agent string", "STRING" }, + { "method", 'm', 0, + G_OPTION_ARG_STRING, &method, + "HTTP method to use", "STRING" }, { "head", 'h', 0, G_OPTION_ARG_NONE, &head, - "Do HEAD rather than GET", NULL }, + "Do HEAD rather than GET (equivalent to --method=HEAD)", NULL }, + { "expect-continue", 0, 0, + G_OPTION_ARG_NONE, &expect_continue, + "Include Expects: 100-continue header in the request", NULL }, { "ntlm", 'n', 0, G_OPTION_ARG_NONE, &ntlm, "Use NTLM authentication", NULL }, { "output", 'o', 0, G_OPTION_ARG_STRING, &output_file_path, "Write the received data to FILE instead of stdout", "FILE" }, + { "input", 'i', 0, + G_OPTION_ARG_STRING, &input_file_path, + "Read data from FILE when method is PUT or POST", "FILE" }, { "proxy", 'p', 0, G_OPTION_ARG_STRING, &proxy, "Use URL as an HTTP proxy", "URL" }, @@ -234,6 +265,9 @@ } } + if (user_agent) + soup_session_set_user_agent (session, user_agent); + if (debug) { SoupLogger *logger = soup_logger_new (SOUP_LOGGER_LOG_HEADERS); soup_session_add_feature (session, SOUP_SESSION_FEATURE (logger)); @@ -257,8 +291,48 @@ g_object_unref (resolver); } + if (!method) + method = head ? "HEAD" : "GET"; + msg = soup_message_new (method, url); + + if (g_strcmp0 (method, "PUT") == 0 || g_strcmp0 (method, "POST") == 0) { + GInputStream *stream; + + if (input_file_path) { + GFile *input_file = g_file_new_for_commandline_arg (input_file_path); + stream = G_INPUT_STREAM (g_file_read (input_file, NULL, &error)); + if (!stream) { + g_printerr ("Failed to open input file \"%s\": %s\n", input_file_path, error->message); + g_error_free (error); + g_object_unref (session); + exit (1); + } + } else { +#ifdef G_OS_UNIX + stream = g_unix_input_stream_new (0, FALSE); +#else + g_printerr ("Input file is required for method %s\n", method); + g_object_unref (session); + exit (1); +#endif + } + + soup_message_set_request_body (msg, NULL, stream, -1); + g_object_unref (stream); + + if (expect_continue) { + soup_message_headers_set_expectations (soup_message_get_request_headers (msg), + SOUP_EXPECTATION_CONTINUE); + } + } + + if (ignore_tls) { + g_signal_connect (msg, "accept-certificate", + G_CALLBACK (accept_certificate), + NULL); + } + /* Send the request */ - msg = soup_message_new (head ? "HEAD" : "GET", url); soup_message_set_tls_client_certificate (msg, client_cert); soup_session_send_async (session, msg, G_PRIORITY_DEFAULT, NULL, on_request_sent, NULL); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsoup-3.0.5/libsoup/http2/soup-client-message-io-http2.c new/libsoup-3.0.6/libsoup/http2/soup-client-message-io-http2.c --- old/libsoup-3.0.5/libsoup/http2/soup-client-message-io-http2.c 2022-03-18 18:43:31.609026700 +0100 +++ new/libsoup-3.0.6/libsoup/http2/soup-client-message-io-http2.c 2022-03-31 20:33:58.630886600 +0200 @@ -119,9 +119,11 @@ gboolean paused; guint32 stream_id; gboolean can_be_restarted; + gboolean expect_continue; } SoupHTTP2MessageData; static void soup_client_message_io_http2_finished (SoupClientMessageIO *iface, SoupMessage *msg); +static ssize_t on_data_source_read_callback (nghttp2_session *session, int32_t stream_id, uint8_t *buf, size_t length, uint32_t *data_flags, nghttp2_data_source *source, void *user_data); static void NGCHECK (int return_code) @@ -169,6 +171,22 @@ } static const char * +headers_category_to_string (nghttp2_headers_category catergory) +{ + switch (catergory) { + case NGHTTP2_HCAT_REQUEST: + return "REQUEST"; + case NGHTTP2_HCAT_RESPONSE: + return "RESPONSE"; + case NGHTTP2_HCAT_PUSH_RESPONSE: + return "PUSH_RESPONSE"; + case NGHTTP2_HCAT_HEADERS: + return "HEADERS"; + } + g_assert_not_reached (); +} + +static const char * state_to_string (SoupHTTP2IOState state) { switch (state) { @@ -347,7 +365,7 @@ if (io->write_buffer == NULL) { io->written_bytes = 0; - g_assert (io->in_callback == 0); + g_warn_if_fail (io->in_callback == 0); io->write_buffer_size = nghttp2_session_mem_send (io->session, (const guint8**)&io->write_buffer); NGCHECK (io->write_buffer_size); if (io->write_buffer_size == 0) { @@ -437,7 +455,7 @@ blocking, cancellable, error)) < 0) return FALSE; - g_assert (io->in_callback == 0); + g_warn_if_fail (io->in_callback == 0); ret = nghttp2_session_mem_recv (io->session, buffer, read); NGCHECK (ret); return ret != 0; @@ -599,7 +617,7 @@ switch (hd->type) { case NGHTTP2_HEADERS: - if (data->state < STATE_READ_HEADERS) { + if (data->state == STATE_WRITE_DONE) { soup_message_set_metrics_timestamp (data->item->msg, SOUP_MESSAGE_METRICS_RESPONSE_START); advance_state_from (data, STATE_WRITE_DONE, STATE_READ_HEADERS); } @@ -691,41 +709,69 @@ } switch (frame->hd.type) { - case NGHTTP2_HEADERS: + case NGHTTP2_HEADERS: { + guint status = soup_message_get_status (data->msg); + if (data->metrics) data->metrics->response_header_bytes_received += frame->hd.length + FRAME_HEADER_SIZE; - if (frame->headers.cat == NGHTTP2_HCAT_RESPONSE && frame->hd.flags & NGHTTP2_FLAG_END_HEADERS) { - h2_debug (io, data, "[HEADERS] status %u", soup_message_get_status (data->msg)); - if (SOUP_STATUS_IS_INFORMATIONAL (soup_message_get_status (data->msg))) { + h2_debug (io, data, "[HEADERS] category=%s status=%u", + headers_category_to_string (frame->headers.cat), status); + switch (frame->headers.cat) { + case NGHTTP2_HCAT_HEADERS: + if (!(frame->hd.flags & NGHTTP2_FLAG_END_HEADERS)) { + io->in_callback--; + return 0; + } + break; + case NGHTTP2_HCAT_RESPONSE: + if (SOUP_STATUS_IS_INFORMATIONAL (status)) { + if (data->expect_continue && status == SOUP_STATUS_CONTINUE) { + nghttp2_data_provider data_provider; + + data_provider.source.ptr = soup_message_get_request_body_stream (data->msg); + data_provider.read_callback = on_data_source_read_callback; + nghttp2_submit_data (io->session, NGHTTP2_FLAG_END_STREAM, frame->hd.stream_id, &data_provider); + io_try_write (io, !data->item->async); + } + soup_message_got_informational (data->msg); soup_message_cleanup_response (data->msg); - advance_state_from (data, STATE_READ_HEADERS, STATE_READ_DONE); io->in_callback--; return 0; } + break; + case NGHTTP2_HCAT_PUSH_RESPONSE: + g_warn_if_reached (); + break; + default: + g_assert_not_reached (); + } - if (soup_message_get_status (data->msg) == SOUP_STATUS_NO_CONTENT || - frame->hd.flags & NGHTTP2_FLAG_END_STREAM) { - h2_debug (io, data, "Stream done"); - advance_state_from (data, STATE_READ_HEADERS, STATE_READ_DATA); - } - soup_message_got_headers (data->msg); + if (soup_message_get_status (data->msg) == SOUP_STATUS_NO_CONTENT || frame->hd.flags & NGHTTP2_FLAG_END_STREAM) { + h2_debug (io, data, "Stream done"); + advance_state_from (data, STATE_READ_HEADERS, STATE_READ_DATA); } + soup_message_got_headers (data->msg); + break; + } case NGHTTP2_DATA: if (data->metrics) data->metrics->response_body_bytes_received += frame->data.hd.length + FRAME_HEADER_SIZE; - if (frame->hd.flags & NGHTTP2_FLAG_END_STREAM && data->body_istream) { - soup_body_input_stream_http2_complete (SOUP_BODY_INPUT_STREAM_HTTP2 (data->body_istream)); - if (data->state == STATE_READ_DATA_START) { - io_try_sniff_content (data, FALSE, data->item->cancellable); - if (data->state == STATE_READ_DATA && data->item->async) - soup_http2_message_data_check_status (data); + if (frame->hd.flags & NGHTTP2_FLAG_END_STREAM) { + if (data->body_istream) { + soup_body_input_stream_http2_complete (SOUP_BODY_INPUT_STREAM_HTTP2 (data->body_istream)); + if (data->state == STATE_READ_DATA_START) { + io_try_sniff_content (data, FALSE, data->item->cancellable); + if (data->state == STATE_READ_DATA && data->item->async) + soup_http2_message_data_check_status (data); + } } + } else { + /* Try to write after every data frame, since nghttp2 might need to send a window update. */ + io_try_write (io, !data->item->async); } - /* Try to write after every data frame, since nghttp2 might need to send a window update. */ - io_try_write (io, !data->item->async); break; case NGHTTP2_RST_STREAM: if (frame->rst_stream.error_code != NGHTTP2_NO_ERROR) { @@ -826,7 +872,8 @@ switch (frame->hd.type) { case NGHTTP2_HEADERS: g_assert (data); - h2_debug (io, data, "[SEND] [HEADERS] finished=%d", + h2_debug (io, data, "[SEND] [HEADERS] category=%s finished=%d", + headers_category_to_string (frame->headers.cat), (frame->hd.flags & NGHTTP2_FLAG_END_HEADERS) ? 1 : 0); if (data->metrics) @@ -1267,13 +1314,18 @@ nghttp2_priority_spec priority_spec; nghttp2_priority_spec_init (&priority_spec, 0, message_priority_to_weight (msg), 0); - nghttp2_data_provider data_provider; - if (body_stream) { - data_provider.source.ptr = body_stream; - data_provider.read_callback = on_data_source_read_callback; + int32_t stream_id; + if (body_stream && soup_message_headers_get_expectations (soup_message_get_request_headers (msg)) & SOUP_EXPECTATION_CONTINUE) { + data->expect_continue = TRUE; + stream_id = nghttp2_submit_headers (io->session, 0, -1, &priority_spec, (const nghttp2_nv *)headers->data, headers->len, data); + } else { + nghttp2_data_provider data_provider; + if (body_stream) { + data_provider.source.ptr = body_stream; + data_provider.read_callback = on_data_source_read_callback; + } + stream_id = nghttp2_submit_request (io->session, &priority_spec, (const nghttp2_nv *)headers->data, headers->len, body_stream ? &data_provider : NULL, data); } - - int32_t stream_id = nghttp2_submit_request (io->session, &priority_spec, (const nghttp2_nv *)headers->data, headers->len, body_stream ? &data_provider : NULL, data); if (stream_id == NGHTTP2_ERR_STREAM_ID_NOT_AVAILABLE) { set_error_for_data (data, g_error_new_literal (G_IO_ERROR, G_IO_ERROR_FAILED, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsoup-3.0.5/libsoup/meson.build new/libsoup-3.0.6/libsoup/meson.build --- old/libsoup-3.0.5/libsoup/meson.build 2022-03-18 18:43:31.609026700 +0100 +++ new/libsoup-3.0.6/libsoup/meson.build 2022-03-31 20:33:58.631886500 +0200 @@ -244,6 +244,8 @@ dependencies : [ platform_deps, gssapi_dep, glib_deps ] ) +meson.override_dependency('libsoup-3.0', libsoup_dep) + libsoup_static_dep = declare_dependency(link_with : libsoup_static, include_directories : libsoup_includes, sources : soup_enum_h, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsoup-3.0.5/libsoup/soup-status.c new/libsoup-3.0.6/libsoup/soup-status.c --- old/libsoup-3.0.5/libsoup/soup-status.c 2022-03-18 18:43:31.618026700 +0100 +++ new/libsoup-3.0.6/libsoup/soup-status.c 2022-03-31 20:33:58.636886600 +0200 @@ -160,6 +160,7 @@ { SOUP_STATUS_CONTINUE, "Continue" }, { SOUP_STATUS_SWITCHING_PROTOCOLS, "Switching Protocols" }, { SOUP_STATUS_PROCESSING, "Processing" }, + { 103, "Early Hints" }, /* Success */ { SOUP_STATUS_OK, "OK" }, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsoup-3.0.5/meson.build new/libsoup-3.0.6/meson.build --- old/libsoup-3.0.5/meson.build 2022-03-18 18:43:31.620026800 +0100 +++ new/libsoup-3.0.6/meson.build 2022-03-31 20:33:58.638886700 +0200 @@ -1,6 +1,6 @@ project('libsoup', 'c', - version: '3.0.5', - meson_version : '>= 0.53', + version: '3.0.6', + meson_version : '>= 0.54', license : 'LGPL-2.0-or-later', default_options : [ 'c_std=gnu99', @@ -234,11 +234,11 @@ have_apache=false apache_httpd2_version = '' if apache_httpd2.found() and apachectl.found() - apache_httpd2_version_raw = run_command(apachectl.path(), '-v') + apache_httpd2_version_raw = run_command(apachectl.path(), '-v', check: false) # It seems that from version 2.4.39 apachectl doesn't take arguments, fallback # to calling apache directly just in case. if apache_httpd2_version_raw.returncode() != 0 - apache_httpd2_version_raw = run_command(apache_httpd2.path(), '-v') + apache_httpd2_version_raw = run_command(apache_httpd2.path(), '-v', check: false) endif if apache_httpd2_version_raw.returncode() == 0 apache_httpd2_version = apache_httpd2_version_raw.stdout().split('\n')[0] @@ -253,11 +253,11 @@ endif if have_apache - apache_modules_dirs_out = run_command('get_apache_modules_dirs.py', apachectl.path()) + apache_modules_dirs_out = run_command('get_apache_modules_dirs.py', apachectl.path(), check: false) have_apache = (apache_modules_dirs_out.returncode() == 0) # Same as above, using apachectl might fail, try apache directly. if not have_apache - apache_modules_dirs_out = run_command('get_apache_modules_dirs.py', apache_httpd2.path()) + apache_modules_dirs_out = run_command('get_apache_modules_dirs.py', apache_httpd2.path(), check: false) have_apache = (apache_modules_dirs_out.returncode() == 0) endif if have_apache @@ -291,7 +291,7 @@ pymod = import('python') python = pymod.find_installation('python3') if python.found() - ret = run_command(python, '-c', 'import importlib\nassert(importlib.find_loader("quart"))') + ret = run_command(python, '-c', 'import importlib\nassert(importlib.find_loader("quart"))', check: false) if ret.returncode() == 0 quart_found = true endif @@ -332,8 +332,8 @@ endif krb5_config = find_program(krb5_config_path, required : gssapi_opt) if krb5_config.found() - libs_output = run_command (krb5_config, '--libs', 'gssapi', check: gssapi_opt.enabled()) - cflags_output = run_command (krb5_config, '--cflags', 'gssapi', check: gssapi_opt.enabled()) + libs_output = run_command(krb5_config, '--libs', 'gssapi', check: gssapi_opt.enabled()) + cflags_output = run_command(krb5_config, '--cflags', 'gssapi', check: gssapi_opt.enabled()) if libs_output.returncode() == 0 and cflags_output.returncode() == 0 enable_gssapi = true gssapi_dep = declare_dependency( @@ -374,7 +374,7 @@ # Vala API # ############ vapi_opt = get_option('vapi') -enable_vapi = add_languages('vala', required: vapi_opt) +enable_vapi = add_languages('vala', required: vapi_opt, native: false) if enable_vapi and not enable_introspection enable_vapi = false if vapi_opt.enabled() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsoup-3.0.5/tests/http2-test.c new/libsoup-3.0.6/tests/http2-test.c --- old/libsoup-3.0.5/tests/http2-test.c 2022-03-18 18:43:31.632027000 +0100 +++ new/libsoup-3.0.6/tests/http2-test.c 2022-03-31 20:33:58.644886500 +0200 @@ -566,7 +566,7 @@ #define N_TESTS 100 - for (uint i = 0; i < N_TESTS; ++i) { + for (unsigned int i = 0; i < N_TESTS; ++i) { SoupMessage *msg = soup_message_new ("GET", "https://127.0.0.1:5000/slow"); soup_session_send_async (test->session, msg, G_PRIORITY_DEFAULT, NULL, on_send_ready, &complete_count); g_object_unref (msg);