{"id":27332,"date":"2025-07-29T09:05:29","date_gmt":"2025-07-29T07:05:29","guid":{"rendered":"https:\/\/daniel.haxx.se\/blog\/?p=27332"},"modified":"2025-07-29T09:05:29","modified_gmt":"2025-07-29T07:05:29","slug":"carving-out-msh3","status":"publish","type":"post","link":"https:\/\/daniel.haxx.se\/blog\/2025\/07\/29\/carving-out-msh3\/","title":{"rendered":"Carving out msh3"},"content":{"rendered":"\n<p>I hope that by now most readers of my blog have understood that curl, and libcurl specifically, is an architecture with a transfer core with a set of different <em>backends<\/em> plugged in. Backends powered by different third party libraries.<\/p>\n\n\n\n<p>The exact set of backends used in a particular build is decided by the person that builds curl.<\/p>\n\n\n\n<p>What backends that curl supports varies over time (and platform). We appreciate adding support for more backends and to let users decide which ones to use, as this allows us to approach it with a <em>survival of the fittest<\/em> attitude. What does not work in the long run or what isn&#8217;t actually used, we can deprecate and remove again. Ideally this helps us select the better ones for the future.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">HTTP\/3<\/h2>\n\n\n\n<p>For the last few years curl has supported the HTTP\/3  protocol powered by one out of <strong>four<\/strong> different backends:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>nghttp3 + ngtcp2<\/li>\n\n\n\n<li>quiche<\/li>\n\n\n\n<li>nghttp3 + OpenSSL-QUIC<\/li>\n\n\n\n<li><strong>msh3 + msquic<\/strong><\/li>\n<\/ol>\n\n\n\n<p>(All except the first listed combination, we still label <em>experimental<\/em>.)<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Dropping msh3<\/h2>\n\n\n\n<p>In this quartet, there is one option that stands out a little: the last one. The msh3 powered backend was brought in and merged into the curl source tree a few years ago with the hope that this solution would end up a good choice for people on Windows since it is the only choice in the list that can get built to use the native Windows TLS solution <em>SChannel<\/em>.<\/p>\n\n\n\n<p>Unfortunately, this work was never finalized. It never worked correctly in curl and the API and architecture of msh3 makes it quirky and cumbersome to integrate &#8211; and quite frankly we can&#8217;t seem to drum up any interest for people to test nor work on improving this backend.<\/p>\n\n\n\n<p>As we have three other working backends, all of which  also can build and run on Windows, we see no benefit in dragging msh3 along. In fact, there is a cost in maintenance and keeping the build working and the tests running etc that we rather avoid. In particular as we seem to be doing that for virtually no gain.<\/p>\n\n\n\n<p>I want to stress that I don&#8217;t think there is anything wrong with msh3 nor its underlying msquic library. They simply have not been made to work properly in curl.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Updated backend map<\/h2>\n\n\n\n<p>The msh3 backend has now been removed from git in the current master branch and this is how the HTTP\/3 offer will look like in the coming curl 8.16.0 release.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;69e7f7f292f54&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"69e7f7f292f54\" class=\"aligncenter size-full wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"1920\" height=\"1080\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/daniel.haxx.se\/blog\/wp-content\/uploads\/2025\/06\/curl-HTTP_3-backends8.jpg\" alt=\"\" class=\"wp-image-27930\"\/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Enlarge\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">HTTP\/3 backends in the pending curl 8.16.0<\/figcaption><\/figure>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>I hope that by now most readers of my blog have understood that curl, and libcurl specifically, is an architecture with a transfer core with a set of different backends plugged in. Backends powered by different third party libraries. The exact set of backends used in a particular build is decided by the person that &hellip; <a href=\"https:\/\/daniel.haxx.se\/blog\/2025\/07\/29\/carving-out-msh3\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Carving out msh3<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":5,"featured_media":20648,"comment_status":"open","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[33,436,414,125],"class_list":["post-27332","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-curl","tag-curl-and-libcurl","tag-http3","tag-quic","tag-windows"],"_links":{"self":[{"href":"https:\/\/daniel.haxx.se\/blog\/wp-json\/wp\/v2\/posts\/27332","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/daniel.haxx.se\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/daniel.haxx.se\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/daniel.haxx.se\/blog\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/daniel.haxx.se\/blog\/wp-json\/wp\/v2\/comments?post=27332"}],"version-history":[{"count":15,"href":"https:\/\/daniel.haxx.se\/blog\/wp-json\/wp\/v2\/posts\/27332\/revisions"}],"predecessor-version":[{"id":27934,"href":"https:\/\/daniel.haxx.se\/blog\/wp-json\/wp\/v2\/posts\/27332\/revisions\/27934"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/daniel.haxx.se\/blog\/wp-json\/wp\/v2\/media\/20648"}],"wp:attachment":[{"href":"https:\/\/daniel.haxx.se\/blog\/wp-json\/wp\/v2\/media?parent=27332"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/daniel.haxx.se\/blog\/wp-json\/wp\/v2\/categories?post=27332"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/daniel.haxx.se\/blog\/wp-json\/wp\/v2\/tags?post=27332"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}