{"id":19894,"date":"2026-09-14T16:22:21","date_gmt":"2026-09-14T16:22:21","guid":{"rendered":"https:\/\/www.mailgun.com\/blog\/http-2-cleartext-h2c-client-beispiel-go\/"},"modified":"2026-09-14T16:22:21","modified_gmt":"2026-09-14T16:22:21","slug":"http-2-cleartext-h2c-client-beispiel-go","status":"publish","type":"blog","link":"https:\/\/www.mailgun.com\/de\/blog\/dev-life\/http-2-cleartext-h2c-client-beispiel-go\/","title":{"rendered":"Beispiel f\u00fcr einen HTTP\/2 Cleartext (H2C) Client in Go"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><i>Dieser Blogbeitrag wurde von einem Mitglied unseres Entwicklungsteams verfasst und selbst ver\u00f6ffentlicht. Sie finden ihn auch auf\u00a0<\/i><a href=\"https:\/\/medium.com\/@thrawn01\/http-2-cleartext-h2c-client-example-in-go-8167c7a4181e\" target=\"_tabs\" rel=\"noopener noreferrer\"><i>Mittel.<\/i><\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Da meine Internetrecherche ins Leere lief und das einzige brauchbare Beispiel f\u00fcr einen H2C-Client in der eigentlichen Go-Testsuite zu finden war, werde ich hier darlegen, was ich \u00fcber den H2C-Support in Golang herausgefunden habe.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Zun\u00e4chst einmal, falls Sie sich fragen, was H2C ist: E<b>s ist im Grunde HTTP\/2 ohne TLS.\u00a0<\/b>H2C ist verst\u00e4ndlicherweise nicht sehr verbreitet, da HTTP\/2 mit TLS sicherer ist und keine Angriffsfl\u00e4che f\u00fcr\u00a0bestimmte Arten von Attacken bietet. H2C hat jedoch durchaus seine Anwendungsf\u00e4lle; so nutzt GRPC beispielsweise H2C, wenn Sie einen Client mit\u00a0<code>grpc.WithInsecure().<\/code> erstellen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Zweitens unterst\u00fctzt der Standard-Golang-Code zwar HTTP\/2, bietet aber keinen direkten Support f\u00fcr H2C. H2C-Support gibt es nur im Paket\u00a0<code>golang.org\/x\/net\/http2\/h2c<\/code><i>\u00a0<\/i>. Sie machen Ihren HTTP-Server H2C-f\u00e4hig, indem Sie Ihren Handler oder Mux folgenderma\u00dfen in\u00a0<code>h2c.NewHandler()<\/code>\u00a0kapseln.<\/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-3591\"><p class=\"h5 m-0\" id=\"toc-title-3591\">Inhaltsverzeichnis<\/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=\"#ueber-http-1-1-verbinden-und-dann-upgrade-auf-http-2-h2c-durchfuehren\">\u00dcber HTTP\/1.1 verbinden und dann Upgrade auf HTTP\/2 (H2C) durchf\u00fchren<\/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=\"#verbindung-ueber-http-2-h2c\">Verbindung \u00fcber 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=\"In die Zwischenablage kopieren\" data-clipboard-success-label=\"Kopiert\" data-clipboard-error-label=\"Kopieren nicht m\u00f6glich\" data-tooltip=\"In die Zwischenablage kopieren\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"In die Zwischenablage kopieren\">\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\">Der obige Code erm\u00f6glicht es dem Server,\u00a0H2C-Upgrades\u00a0und\u00a0H2C Prior Knowledge\u00a0zusammen mit dem standardm\u00e4\u00dfigen HTTP\/2 und HTTP\/1.1 zu unterst\u00fctzen, die von Golang nativ unterst\u00fctzt werden.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn Ihnen der Support f\u00fcr HTTP\/1.1 nicht wichtig ist, f\u00fchren Sie diesen Code aus, der nur H2C Prior Knowledge unterst\u00fctzt.<\/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=\"In die Zwischenablage kopieren\" data-clipboard-success-label=\"Kopiert\" data-clipboard-error-label=\"Kopieren nicht m\u00f6glich\" data-tooltip=\"In die Zwischenablage kopieren\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"In die Zwischenablage kopieren\">\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\">Sobald der Server l\u00e4uft, installieren Sie\u00a0<code>curl-OpenSSL<\/code>\u00a0und verwenden curl, um Ihren H2C-f\u00e4higen Server zu \u00fcberpr\u00fcfen.<\/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=\"In die Zwischenablage kopieren\" data-clipboard-success-label=\"Kopiert\" data-clipboard-error-label=\"Kopieren nicht m\u00f6glich\" data-tooltip=\"In die Zwischenablage kopieren\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"In die Zwischenablage kopieren\">\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\">\u00dcber HTTP\/1.1 verbinden und dann Upgrade auf HTTP\/2 (H2C) durchf\u00fchren<\/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=\"In die Zwischenablage kopieren\" data-clipboard-success-label=\"Kopiert\" data-clipboard-error-label=\"Kopieren nicht m\u00f6glich\" data-tooltip=\"In die Zwischenablage kopieren\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"In die Zwischenablage kopieren\">\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\">Verbindung \u00fcber 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=\"In die Zwischenablage kopieren\" data-clipboard-success-label=\"Kopiert\" data-clipboard-error-label=\"Kopieren nicht m\u00f6glich\" data-tooltip=\"In die Zwischenablage kopieren\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"In die Zwischenablage kopieren\">\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\">Erinnern Sie sich, dass ich gesagt habe, dass die Golang-Standardbibliothek H2C nicht unterst\u00fctzt? Obwohl das technisch gesehen richtig ist,\u00a0<b>gibt es einen Workaround, um den Standard-HTTP\/2-Client von Golang mit einem H2C-f\u00e4higen Server zu verbinden<\/b>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dazu m\u00fcssen Sie\u00a0<code>DialTLS<\/code>\u00a0\u00fcberschreiben und das streng geheime Flag\u00a0<code>AllowHTTP<\/code>\u00a0setzen.<\/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=\"In die Zwischenablage kopieren\" data-clipboard-success-label=\"Kopiert\" data-clipboard-error-label=\"Kopieren nicht m\u00f6glich\" data-tooltip=\"In die Zwischenablage kopieren\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"In die Zwischenablage kopieren\">\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\">Obwohl das alles ein wenig abenteuerlich aussieht, funktioniert es tats\u00e4chlich sehr gut und liefert in Produktionsumgebungen eine hervorragende Leistung.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ein vollst\u00e4ndiges, funktionierendes Beispiel finden Sie hier\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>Erfahren Sie, was \u00fcber den H2C-Support in Golang herausgefunden wurde und wie Sie den Standard-HTTP\/2-Client von Golang mit einem H2C-f\u00e4higen Server verbinden. Weiterlesen&#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-19894","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>Beispiel f\u00fcr einen HTTP\/2 Cleartext (H2C) Client in Go | Mailgun<\/title>\n<meta name=\"description\" content=\"Erfahren Sie, was \u00fcber den H2C-Support in Golang herausgefunden wurde und wie Sie den Standard-HTTP\/2-Client von Golang mit einem H2C-f\u00e4higen Server verbinden. Weiterlesen...\" \/>\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\/de\/blog\/dev-life\/http-2-cleartext-h2c-client-beispiel-go\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Beispiel f\u00fcr einen HTTP\/2 Cleartext (H2C) Client in Go | Mailgun\" \/>\n<meta property=\"og:description\" content=\"Erfahren Sie, was \u00fcber den H2C-Support in Golang herausgefunden wurde und wie Sie den Standard-HTTP\/2-Client von Golang mit einem H2C-f\u00e4higen Server verbinden. Weiterlesen...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.mailgun.com\/de\/blog\/dev-life\/http-2-cleartext-h2c-client-beispiel-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\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/dev-life\\\/http-2-cleartext-h2c-client-beispiel-go\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/dev-life\\\/http-2-cleartext-h2c-client-beispiel-go\\\/\",\"name\":\"Beispiel f\u00fcr einen HTTP\\\/2 Cleartext (H2C) Client in Go | Mailgun\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/dev-life\\\/http-2-cleartext-h2c-client-beispiel-go\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/dev-life\\\/http-2-cleartext-h2c-client-beispiel-go\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Dev-Life.png\",\"datePublished\":\"2026-09-14T16:22:21+00:00\",\"description\":\"Erfahren Sie, was \u00fcber den H2C-Support in Golang herausgefunden wurde und wie Sie den Standard-HTTP\\\/2-Client von Golang mit einem H2C-f\u00e4higen Server verbinden. Weiterlesen...\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/dev-life\\\/http-2-cleartext-h2c-client-beispiel-go\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/dev-life\\\/http-2-cleartext-h2c-client-beispiel-go\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/dev-life\\\/http-2-cleartext-h2c-client-beispiel-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\\\/de\\\/blog\\\/dev-life\\\/http-2-cleartext-h2c-client-beispiel-go\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Blog\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Beispiel f\u00fcr einen HTTP\\\/2 Cleartext (H2C) Client in Go\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/#website\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"description\":\"Leistungsstarke Transaktions-E-Mail-APIs, mit denen Sie E-Mails senden, empfangen und nachverfolgen k\u00f6nnen, speziell f\u00fcr Entwickler konzipiert. Erfahren Sie noch heute mehr!\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/#organization\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/#\\\/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\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Beispiel f\u00fcr einen HTTP\/2 Cleartext (H2C) Client in Go | Mailgun","description":"Erfahren Sie, was \u00fcber den H2C-Support in Golang herausgefunden wurde und wie Sie den Standard-HTTP\/2-Client von Golang mit einem H2C-f\u00e4higen Server verbinden. Weiterlesen...","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\/de\/blog\/dev-life\/http-2-cleartext-h2c-client-beispiel-go\/","og_locale":"de_DE","og_type":"article","og_title":"Beispiel f\u00fcr einen HTTP\/2 Cleartext (H2C) Client in Go | Mailgun","og_description":"Erfahren Sie, was \u00fcber den H2C-Support in Golang herausgefunden wurde und wie Sie den Standard-HTTP\/2-Client von Golang mit einem H2C-f\u00e4higen Server verbinden. Weiterlesen...","og_url":"https:\/\/www.mailgun.com\/de\/blog\/dev-life\/http-2-cleartext-h2c-client-beispiel-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\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.mailgun.com\/de\/blog\/dev-life\/http-2-cleartext-h2c-client-beispiel-go\/","url":"https:\/\/www.mailgun.com\/de\/blog\/dev-life\/http-2-cleartext-h2c-client-beispiel-go\/","name":"Beispiel f\u00fcr einen HTTP\/2 Cleartext (H2C) Client in Go | Mailgun","isPartOf":{"@id":"https:\/\/www.mailgun.com\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.mailgun.com\/de\/blog\/dev-life\/http-2-cleartext-h2c-client-beispiel-go\/#primaryimage"},"image":{"@id":"https:\/\/www.mailgun.com\/de\/blog\/dev-life\/http-2-cleartext-h2c-client-beispiel-go\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Dev-Life.png","datePublished":"2026-09-14T16:22:21+00:00","description":"Erfahren Sie, was \u00fcber den H2C-Support in Golang herausgefunden wurde und wie Sie den Standard-HTTP\/2-Client von Golang mit einem H2C-f\u00e4higen Server verbinden. Weiterlesen...","breadcrumb":{"@id":"https:\/\/www.mailgun.com\/de\/blog\/dev-life\/http-2-cleartext-h2c-client-beispiel-go\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.mailgun.com\/de\/blog\/dev-life\/http-2-cleartext-h2c-client-beispiel-go\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.mailgun.com\/de\/blog\/dev-life\/http-2-cleartext-h2c-client-beispiel-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\/de\/blog\/dev-life\/http-2-cleartext-h2c-client-beispiel-go\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.mailgun.com\/de\/"},{"@type":"ListItem","position":2,"name":"Blog","item":"https:\/\/www.mailgun.com\/de\/blog\/"},{"@type":"ListItem","position":3,"name":"Beispiel f\u00fcr einen HTTP\/2 Cleartext (H2C) Client in Go"}]},{"@type":"WebSite","@id":"https:\/\/www.mailgun.com\/de\/#website","url":"https:\/\/www.mailgun.com\/de\/","name":"Transactional Email API Service For Developers | Mailgun","description":"Leistungsstarke Transaktions-E-Mail-APIs, mit denen Sie E-Mails senden, empfangen und nachverfolgen k\u00f6nnen, speziell f\u00fcr Entwickler konzipiert. Erfahren Sie noch heute mehr!","publisher":{"@id":"https:\/\/www.mailgun.com\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.mailgun.com\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/www.mailgun.com\/de\/#organization","name":"Transactional Email API Service For Developers | Mailgun","url":"https:\/\/www.mailgun.com\/de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.mailgun.com\/de\/#\/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\/de\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/blog\/19894","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/users\/13"}],"version-history":[{"count":0,"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/blog\/19894\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/media\/3952"}],"wp:attachment":[{"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/media?parent=19894"}],"wp:term":[{"taxonomy":"blog_category","embeddable":true,"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/blog_category?post=19894"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}