diff --git a/man/ostree.repo-config.xml b/man/ostree.repo-config.xml
index 388b9e627f..9378a6b951 100644
--- a/man/ostree.repo-config.xml
+++ b/man/ostree.repo-config.xml
@@ -222,6 +222,14 @@ Boston, MA 02111-1307, USA.
Path to file containing trusted anchors instead of the system CA database.
+
+ http2
+ A boolean value, defaults to true. By
+ default, libostree will use HTTP2; setting this to false
+ will disable it. May be useful to work around broken servers.
+
+
+
unconfigured-state
If set, pulls from this remote will fail with the configured text. This is intended for OS vendors which have a subscription process to access content.
diff --git a/src/libostree/ostree-fetcher-curl.c b/src/libostree/ostree-fetcher-curl.c
index 58835529dc..a233a191fc 100644
--- a/src/libostree/ostree-fetcher-curl.c
+++ b/src/libostree/ostree-fetcher-curl.c
@@ -771,14 +771,17 @@ initiate_next_curl_request (FetcherRequest *req,
* there are numerous HTTP/2 fixes since the original version in
* libcurl 7.43.0.
*/
+ if (!(self->config_flags & OSTREE_FETCHER_FLAGS_DISABLE_HTTP2))
+ {
#if CURL_AT_LEAST_VERSION(7, 51, 0)
- curl_easy_setopt (req->easy, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
+ curl_easy_setopt (req->easy, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
#endif
- /* https://github.com/curl/curl/blob/curl-7_53_0/docs/examples/http2-download.c */
+ /* https://github.com/curl/curl/blob/curl-7_53_0/docs/examples/http2-download.c */
#if (CURLPIPE_MULTIPLEX > 0)
- /* wait for pipe connection to confirm */
- curl_easy_setopt (req->easy, CURLOPT_PIPEWAIT, 1L);
+ /* wait for pipe connection to confirm */
+ curl_easy_setopt (req->easy, CURLOPT_PIPEWAIT, 1L);
#endif
+ }
curl_easy_setopt (req->easy, CURLOPT_WRITEFUNCTION, write_cb);
if (g_getenv ("OSTREE_DEBUG_HTTP"))
curl_easy_setopt (req->easy, CURLOPT_VERBOSE, 1L);
diff --git a/src/libostree/ostree-fetcher.h b/src/libostree/ostree-fetcher.h
index 18aaec4000..9cd2f008db 100644
--- a/src/libostree/ostree-fetcher.h
+++ b/src/libostree/ostree-fetcher.h
@@ -50,7 +50,8 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC(OstreeFetcher, g_object_unref)
typedef enum {
OSTREE_FETCHER_FLAGS_NONE = 0,
OSTREE_FETCHER_FLAGS_TLS_PERMISSIVE = (1 << 0),
- OSTREE_FETCHER_FLAGS_TRANSFER_GZIP = (1 << 1)
+ OSTREE_FETCHER_FLAGS_TRANSFER_GZIP = (1 << 1),
+ OSTREE_FETCHER_FLAGS_DISABLE_HTTP2 = (1 << 2),
} OstreeFetcherConfigFlags;
typedef enum {
diff --git a/src/libostree/ostree-repo-pull.c b/src/libostree/ostree-repo-pull.c
index c6fe7625e9..8ac4850655 100644
--- a/src/libostree/ostree-repo-pull.c
+++ b/src/libostree/ostree-repo-pull.c
@@ -2690,6 +2690,15 @@ _ostree_repo_remote_new_fetcher (OstreeRepo *self,
if (gzip)
fetcher_flags |= OSTREE_FETCHER_FLAGS_TRANSFER_GZIP;
+ { gboolean http2 = TRUE;
+ if (!ostree_repo_get_remote_boolean_option (self, remote_name,
+ "http2", TRUE,
+ &http2, error))
+ goto out;
+ if (!http2)
+ fetcher_flags |= OSTREE_FETCHER_FLAGS_DISABLE_HTTP2;
+ }
+
fetcher = _ostree_fetcher_new (self->tmp_dir_fd, remote_name, fetcher_flags);
{