{"id":19979,"date":"2026-09-14T21:17:25","date_gmt":"2026-09-14T21:17:25","guid":{"rendered":"https:\/\/www.mailgun.com\/blog\/exemple-client-http-2-clair-h2c-go\/"},"modified":"2026-09-14T21:17:25","modified_gmt":"2026-09-14T21:17:25","slug":"exemple-client-http-2-clair-h2c-go","status":"publish","type":"blog","link":"https:\/\/www.mailgun.com\/fr\/blog\/dev-life\/exemple-client-http-2-clair-h2c-go\/","title":{"rendered":"Exemple de client HTTP\/2 en clair (H2C) en Go"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><i>L&rsquo;un de nos d\u00e9veloppeurs a r\u00e9dig\u00e9 et auto-publi\u00e9 cet article de blog. Vous pouvez \u00e9galement le retrouver sur\u00a0<\/i><a href=\"https:\/\/medium.com\/@thrawn01\/http-2-cleartext-h2c-client-example-in-go-8167c7a4181e\" target=\"_tabs\" rel=\"noopener noreferrer\"><i>Moyen.<\/i><\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mes recherches sur Internet n&rsquo;ayant rien donn\u00e9, et le seul exemple fonctionnel de client H2C que j&rsquo;ai pu trouver se trouvant dans la suite de tests de Go, je vais vous expliquer ici ce que j&rsquo;ai d\u00e9couvert sur le support de H2C dans golang.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tout d&rsquo;abord, si vous vous demandez ce qu&rsquo;est H2C, i<b>l s&rsquo;agit essentiellement de HTTP\/2 mais sans TLS.\u00a0<\/b>H2C n&rsquo;est naturellement pas tr\u00e8s m\u00e9diatis\u00e9, car HTTP\/2 avec TLS est plus s\u00e9curis\u00e9 et n&rsquo;est pas vuln\u00e9rable \u00e0\u00a0certains types d&rsquo;attaques. Cependant, H2C n&rsquo;est pas sans utilit\u00e9\u00a0; par exemple, GRPC utilise H2C lorsque vous cr\u00e9ez un client avec\u00a0<code>grpc.WithInsecure().<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ensuite, il faut savoir que le code golang standard prend en charge HTTP2, mais ne prend pas directement en charge H2C. Le support de H2C n&rsquo;existe que dans le package\u00a0<code>golang.org\/x\/net\/http2\/h2c<\/code><i>\u00a0<\/i>. Vous pouvez rendre votre serveur HTTP compatible avec H2C en enveloppant votre gestionnaire ou mux avec\u00a0<code>h2c.NewHandler()<\/code>\u00a0comme ceci.<\/p>\n\n\n\r\n    <nav data-content-type=\"longform\" class=\"toc-block longform-spacings px-5 py-6 px-md-6 px-lg-7 py-md-7 bg-light fs-sm rounded-lg\" aria-labelledby=\"toc-title-7482\"><p class=\"h5 m-0\" id=\"toc-title-7482\">Table des mati\u00e8res<\/p><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">01<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#se-connecter-via-http1-1-puis-mettre-a-niveau-vers-http-2-h2c\">Se connecter via HTTP1.1 puis mettre \u00e0 niveau vers HTTP\/2 (H2C)<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">02<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#se-connecter-via-http-2-h2c\">Se connecter via HTTP\/2 (H2C)<\/a><\/div><\/div><\/nav>\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                PHP                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"Copier dans le presse-papiers\" data-clipboard-success-label=\"Copi\u00e9\u00a0!\" data-clipboard-error-label=\"Impossible de copier\" data-tooltip=\"Copier dans le presse-papiers\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copier dans le presse-papiers\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-PHP\">\r\n                                <code id=\"code_0_content\" class=\"language-PHP\">\r\n\r\n                                    h2s := &amp;http2.Server{}\r\n\r\nhandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\r\n    fmt.Fprintf(w, &quot;Hello, %v, http: %v&quot;, r.URL.Path, r.TLS == nil)\r\n})\r\n\r\nserver := &amp;http.Server{\r\n    Addr:    &quot;0.0.0.0:1010&quot;,\r\n    Handler: h2c.NewHandler(handler, h2s),\r\n}\r\n\r\nfmt.Printf(&quot;Listening [0.0.0.0:1010]... &quot;)\r\ncheckErr(server.ListenAndServe(), &quot;while listening&quot;)\r\n\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Le code ci-dessus permet au serveur de prendre en charge la\u00a0mise \u00e0 niveau H2C\u00a0et la\u00a0connaissance pr\u00e9alable H2C, ainsi que les standards HTTP\/2 et HTTP\/1.1 que golang prend en charge nativement.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Si la prise en charge de HTTP\/1.1 ne vous int\u00e9resse pas, vous pouvez ex\u00e9cuter ce code, qui ne prend en charge que la connaissance pr\u00e9alable H2C.<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                PHP                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"Copier dans le presse-papiers\" data-clipboard-success-label=\"Copi\u00e9\u00a0!\" data-clipboard-error-label=\"Impossible de copier\" data-tooltip=\"Copier dans le presse-papiers\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copier dans le presse-papiers\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-PHP\">\r\n                                <code id=\"code_0_content\" class=\"language-PHP\">\r\n\r\n                                    server := http2.Server{}\r\n\r\nl, err := net.Listen(&quot;tcp&quot;, &quot;0.0.0.0:1010&quot;)\r\ncheckErr(err, &quot;while listening&quot;)\r\n\r\nfmt.Printf(&quot;Listening [0.0.0.0:1010]... &quot;)\r\n\r\nfor {\r\n    conn, err := l.Accept()\r\n    checkErr(err, &quot;during accept&quot;)\r\n\r\n    server.ServeConn(conn, &amp;http2.ServeConnOpts{\r\n        Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\r\n            fmt.Fprintf(w, &quot;Hello, %v, http: %v&quot;, r.URL.Path, r.TLS == nil)\r\n        }),\r\n    })\r\n}\r\n\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Une fois que vous avez un serveur en cours d&rsquo;ex\u00e9cution, vous pouvez le tester en installant\u00a0<code>curl-OpenSSL<\/code>\u00a0et en utilisant curl pour tester votre serveur compatible H2C.<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                PHP                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"Copier dans le presse-papiers\" data-clipboard-success-label=\"Copi\u00e9\u00a0!\" data-clipboard-error-label=\"Impossible de copier\" data-tooltip=\"Copier dans le presse-papiers\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copier dans le presse-papiers\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-PHP\">\r\n                                <code id=\"code_0_content\" class=\"language-PHP\">\r\n\r\n                                    $ brew install curl-openssl\r\n\r\n# Add curl-openssl to the front of your PATH\r\n$ export PATH=&quot;\/usr\/local\/opt\/curl-openssl\/bin:$PATH&quot;\r\n\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<h2 class=\"wp-block-heading\">Se connecter via HTTP1.1 puis mettre \u00e0 niveau vers HTTP\/2 (H2C)<\/h2>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                PHP                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"Copier dans le presse-papiers\" data-clipboard-success-label=\"Copi\u00e9\u00a0!\" data-clipboard-error-label=\"Impossible de copier\" data-tooltip=\"Copier dans le presse-papiers\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copier dans le presse-papiers\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-PHP\">\r\n                                <code id=\"code_0_content\" class=\"language-PHP\">\r\n\r\n                                    $ curl -v --http2 http:\/\/localhost:1010\r\n\r\n* Trying ::1:1010...\r\n* TCP_NODELAY set\r\n* Connected to localhost (::1) port 1010 (#0)\r\n\r\n&gt; GET \/ HTTP\/1.1\r\n&gt; Host: localhost:1010\r\n&gt; User-Agent: curl\/7.65.0\r\n&gt; Accept: *\/*\r\n&gt; Connection: Upgrade, HTTP2-Settings\r\n&gt; Upgrade: h2c\r\n&gt; HTTP2-Settings: AAMAAABkAARAAAAAAAIAAAAA\r\n&gt;\r\n* Mark bundle as not supporting multiuse\r\n\r\n&lt; HTTP\/1.1 101 Switching Protocols\r\n&lt; Connection: Upgrade\r\n&lt; Upgrade: h2c\r\n* Received 101\r\n* Using HTTP2, server supports multi-use\r\n* Connection state changed (HTTP\/2 confirmed)\r\n* Copying HTTP\/2 data in stream buffer to connection buffer after upgrade: len=0\r\n* Connection state changed (MAX_CONCURRENT_STREAMS == 250)!\r\n\r\n&lt; HTTP\/2 200\r\n&lt; content-type: text\/plain; charset=utf-8\r\n&lt; content-length: 20\r\n&lt; date: Wed, 05 Jun 2019 19:01:40 GMT\r\n&lt;\r\nHello, \/, http: true\r\n\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<h2 class=\"wp-block-heading\">Se connecter via HTTP\/2 (H2C)<\/h2>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                PHP                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"Copier dans le presse-papiers\" data-clipboard-success-label=\"Copi\u00e9\u00a0!\" data-clipboard-error-label=\"Impossible de copier\" data-tooltip=\"Copier dans le presse-papiers\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copier dans le presse-papiers\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-PHP\">\r\n                                <code id=\"code_0_content\" class=\"language-PHP\">\r\n\r\n                                    curl -v --http2-prior-knowledge http:\/\/localhost:1010\r\n\r\n* Trying ::1:1010...\r\n* TCP_NODELAY set\r\n* Connected to localhost (::1) port 1010 (#0)\r\n* Using HTTP2, server supports multi-use\r\n* Connection state changed (HTTP\/2 confirmed)\r\n* Copying HTTP\/2 data in stream buffer to connection buffer after upgrade: len=0\r\n* Using Stream ID: 1 (easy handle 0x7fdab8007000)\r\n\r\n&gt; GET \/ HTTP\/2\r\n&gt; Host: localhost:1010\r\n&gt; User-Agent: curl\/7.65.0\r\n&gt; Accept: *\/*\r\n&gt;\r\n* Connection state changed (MAX_CONCURRENT_STREAMS == 250)!\r\n\r\n&lt; HTTP\/2 200\r\n&lt; content-type: text\/plain; charset=utf-8\r\n&lt; content-length: 20\r\n&lt; date: Wed, 05 Jun 2019 19:00:43 GMT\r\n&lt;\r\nHello, \/, http: true\r\n\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Maintenant, vous souvenez-vous quand j&rsquo;ai dit que la biblioth\u00e8que standard de golang ne prend pas en charge H2C\u00a0? Bien que cela soit techniquement exact,\u00a0<b>il existe une solution de contournement pour que le client HTTP\/2 standard de golang se connecte \u00e0 un serveur compatible H2C<\/b>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pour ce faire, vous devez surcharger\u00a0<code>DialTLS<\/code>\u00a0et d\u00e9finir l&rsquo;indicateur super secret\u00a0<code>AllowHTTP<\/code>.<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                PHP                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"Copier dans le presse-papiers\" data-clipboard-success-label=\"Copi\u00e9\u00a0!\" data-clipboard-error-label=\"Impossible de copier\" data-tooltip=\"Copier dans le presse-papiers\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copier dans le presse-papiers\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-PHP\">\r\n                                <code id=\"code_0_content\" class=\"language-PHP\">\r\n\r\n                                    client := http.Client{\r\n    Transport: &amp;http2.Transport{\r\n        \/\/ So http2.Transport doesn&#039;t complain the URL scheme isn&#039;t &#039;https&#039;\r\n        AllowHTTP: true,\r\n\r\n        \/\/ Pretend we are dialing a TLS endpoint.\r\n        \/\/ Note: we ignore the passed tls.Config\r\n        DialTLS: func(network, addr string, cfg *tls.Config) (net.Conn, error) {\r\n            return net.Dial(network, addr)\r\n        },\r\n    },\r\n}\r\n\r\nresp, _ := client.Get(url)\r\nfmt.Printf(&quot;Client Proto: %d\\n&quot;, resp.ProtoMajor)\r\n\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Bien que tout cela paraisse un peu bancal, cela fonctionne en r\u00e9alit\u00e9 tr\u00e8s bien et offre de bonnes performances dans les environnements de production.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Un exemple complet et fonctionnel est disponible ici\u00a0<a href=\"http:\/\/github.com\/thrawn01\/h2c-golang-example\" target=\"_blank\" rel=\"noreferrer noopener\">http:\/\/github.com\/thrawn01\/h2c-golang-example<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>D\u00e9couvrez ce que nous avons appris sur le support de H2C dans golang et comment configurer le client http2 standard de golang pour se connecter \u00e0 un serveur compatible H2C. En savoir plus&#8230;<\/p>\n","protected":false},"author":13,"featured_media":3952,"menu_order":0,"template":"","meta":{"_acf_changed":true,"footnotes":""},"blog_category":[19],"class_list":["post-19979","blog","type-blog","status-publish","has-post-thumbnail","hentry","blog_category-dev-life"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Exemple de client HTTP\/2 en clair (H2C) en Go | Mailgun<\/title>\n<meta name=\"description\" content=\"D\u00e9couvrez ce que nous avons appris sur le support de H2C dans golang et comment configurer le client http2 standard de golang pour se connecter \u00e0 un serveur compatible H2C. En savoir plus...\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.mailgun.com\/fr\/blog\/dev-life\/exemple-client-http-2-clair-h2c-go\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Exemple de client HTTP\/2 en clair (H2C) en Go | Mailgun\" \/>\n<meta property=\"og:description\" content=\"D\u00e9couvrez ce que nous avons appris sur le support de H2C dans golang et comment configurer le client http2 standard de golang pour se connecter \u00e0 un serveur compatible H2C. En savoir plus...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.mailgun.com\/fr\/blog\/dev-life\/exemple-client-http-2-clair-h2c-go\/\" \/>\n<meta property=\"og:site_name\" content=\"Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Dev-Life.png\" \/>\n\t<meta property=\"og:image:width\" content=\"720\" \/>\n\t<meta property=\"og:image:height\" content=\"448\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/dev-life\\\/exemple-client-http-2-clair-h2c-go\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/dev-life\\\/exemple-client-http-2-clair-h2c-go\\\/\",\"name\":\"Exemple de client HTTP\\\/2 en clair (H2C) en Go | Mailgun\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/dev-life\\\/exemple-client-http-2-clair-h2c-go\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/dev-life\\\/exemple-client-http-2-clair-h2c-go\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Dev-Life.png\",\"datePublished\":\"2026-09-14T21:17:25+00:00\",\"description\":\"D\u00e9couvrez ce que nous avons appris sur le support de H2C dans golang et comment configurer le client http2 standard de golang pour se connecter \u00e0 un serveur compatible H2C. En savoir plus...\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/dev-life\\\/exemple-client-http-2-clair-h2c-go\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/dev-life\\\/exemple-client-http-2-clair-h2c-go\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/dev-life\\\/exemple-client-http-2-clair-h2c-go\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Dev-Life.png\",\"contentUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Dev-Life.png\",\"width\":720,\"height\":448},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/dev-life\\\/exemple-client-http-2-clair-h2c-go\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Blog\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Exemple de client HTTP\\\/2 en clair (H2C) en Go\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/#website\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"description\":\"Des API d\u2019emails transactionnels puissantes qui vous permettent d'envoyer, de recevoir et de suivre des emails, con\u00e7ues pour les d\u00e9veloppeurs. En savoir plus d\u00e8s aujourd'hui !\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/#organization\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/cropped-android-chrome-512x512-1.png\",\"contentUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/cropped-android-chrome-512x512-1.png\",\"width\":512,\"height\":512,\"caption\":\"Transactional Email API Service For Developers | Mailgun\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Exemple de client HTTP\/2 en clair (H2C) en Go | Mailgun","description":"D\u00e9couvrez ce que nous avons appris sur le support de H2C dans golang et comment configurer le client http2 standard de golang pour se connecter \u00e0 un serveur compatible H2C. En savoir plus...","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.mailgun.com\/fr\/blog\/dev-life\/exemple-client-http-2-clair-h2c-go\/","og_locale":"fr_FR","og_type":"article","og_title":"Exemple de client HTTP\/2 en clair (H2C) en Go | Mailgun","og_description":"D\u00e9couvrez ce que nous avons appris sur le support de H2C dans golang et comment configurer le client http2 standard de golang pour se connecter \u00e0 un serveur compatible H2C. En savoir plus...","og_url":"https:\/\/www.mailgun.com\/fr\/blog\/dev-life\/exemple-client-http-2-clair-h2c-go\/","og_site_name":"Transactional Email API Service For Developers | Mailgun","og_image":[{"width":720,"height":448,"url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Dev-Life.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.mailgun.com\/fr\/blog\/dev-life\/exemple-client-http-2-clair-h2c-go\/","url":"https:\/\/www.mailgun.com\/fr\/blog\/dev-life\/exemple-client-http-2-clair-h2c-go\/","name":"Exemple de client HTTP\/2 en clair (H2C) en Go | Mailgun","isPartOf":{"@id":"https:\/\/www.mailgun.com\/fr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.mailgun.com\/fr\/blog\/dev-life\/exemple-client-http-2-clair-h2c-go\/#primaryimage"},"image":{"@id":"https:\/\/www.mailgun.com\/fr\/blog\/dev-life\/exemple-client-http-2-clair-h2c-go\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Dev-Life.png","datePublished":"2026-09-14T21:17:25+00:00","description":"D\u00e9couvrez ce que nous avons appris sur le support de H2C dans golang et comment configurer le client http2 standard de golang pour se connecter \u00e0 un serveur compatible H2C. En savoir plus...","breadcrumb":{"@id":"https:\/\/www.mailgun.com\/fr\/blog\/dev-life\/exemple-client-http-2-clair-h2c-go\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.mailgun.com\/fr\/blog\/dev-life\/exemple-client-http-2-clair-h2c-go\/"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/www.mailgun.com\/fr\/blog\/dev-life\/exemple-client-http-2-clair-h2c-go\/#primaryimage","url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Dev-Life.png","contentUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Dev-Life.png","width":720,"height":448},{"@type":"BreadcrumbList","@id":"https:\/\/www.mailgun.com\/fr\/blog\/dev-life\/exemple-client-http-2-clair-h2c-go\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.mailgun.com\/fr\/"},{"@type":"ListItem","position":2,"name":"Blog","item":"https:\/\/www.mailgun.com\/fr\/blog\/"},{"@type":"ListItem","position":3,"name":"Exemple de client HTTP\/2 en clair (H2C) en Go"}]},{"@type":"WebSite","@id":"https:\/\/www.mailgun.com\/fr\/#website","url":"https:\/\/www.mailgun.com\/fr\/","name":"Transactional Email API Service For Developers | Mailgun","description":"Des API d\u2019emails transactionnels puissantes qui vous permettent d'envoyer, de recevoir et de suivre des emails, con\u00e7ues pour les d\u00e9veloppeurs. En savoir plus d\u00e8s aujourd'hui !","publisher":{"@id":"https:\/\/www.mailgun.com\/fr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.mailgun.com\/fr\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/www.mailgun.com\/fr\/#organization","name":"Transactional Email API Service For Developers | Mailgun","url":"https:\/\/www.mailgun.com\/fr\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/www.mailgun.com\/fr\/#\/schema\/logo\/image\/","url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/06\/cropped-android-chrome-512x512-1.png","contentUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/06\/cropped-android-chrome-512x512-1.png","width":512,"height":512,"caption":"Transactional Email API Service For Developers | Mailgun"},"image":{"@id":"https:\/\/www.mailgun.com\/fr\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/blog\/19979","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/users\/13"}],"version-history":[{"count":0,"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/blog\/19979\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/media\/3952"}],"wp:attachment":[{"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/media?parent=19979"}],"wp:term":[{"taxonomy":"blog_category","embeddable":true,"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/blog_category?post=19979"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}