{"id":19936,"date":"2026-09-14T18:33:06","date_gmt":"2026-09-14T18:33:06","guid":{"rendered":"https:\/\/www.mailgun.com\/blog\/ejemplo-cliente-http-2-cleartext-h2c-go\/"},"modified":"2026-09-14T18:33:06","modified_gmt":"2026-09-14T18:33:06","slug":"ejemplo-cliente-http-2-cleartext-h2c-go","status":"publish","type":"blog","link":"https:\/\/www.mailgun.com\/es\/blog\/dev-life\/ejemplo-cliente-http-2-cleartext-h2c-go\/","title":{"rendered":"Ejemplo de cliente HTTP\/2 Cleartext (H2C) en Go"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><i>Este art\u00edculo del blog fue escrito y autopublicado por un miembro de nuestro equipo de desarrollo. Tambi\u00e9n puedes encontrarlo en\u00a0<\/i><a href=\"https:\/\/medium.com\/@thrawn01\/http-2-cleartext-h2c-client-example-in-go-8167c7a4181e\" target=\"_tabs\" rel=\"noopener noreferrer\"><i>Mediano.<\/i><\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dado que mis habilidades de b\u00fasqueda en internet me fallaron y el \u00fanico ejemplo funcional de un cliente H2C que pude encontrar estaba en la propia suite de pruebas de go, aqu\u00ed voy a exponer lo que descubr\u00ed sobre la asistencia para H2C en golang.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En primer lugar, por si te preguntas qu\u00e9 es H2C, b\u00e1sicamente <b>es HTTP\/2 pero sin TLS.\u00a0<\/b>Es comprensible que H2C no se promocione de forma generalizada, ya que HTTP\/2 con TLS es m\u00e1s seguro y no es vulnerable a\u00a0ciertos tipos de ataques. Sin embargo, H2C tiene sus casos de uso; por ejemplo, GRPC utiliza H2C cuando creas un cliente con\u00a0<code>grpc.WithInsecure().<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En segundo lugar, el c\u00f3digo est\u00e1ndar de golang es compatible con HTTP2, pero no admite H2C directamente. La asistencia para H2C solo existe en el<i>\u00a0<\/i>paquete\u00a0<code>golang.org\/x\/net\/http2\/h2c<\/code>. Puedes hacer que tu servidor HTTP sea compatible con H2C si envuelves tu manejador o mux con\u00a0<code>h2c.NewHandler()<\/code>\u00a0de la siguiente manera.<\/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-2255\"><p class=\"h5 m-0\" id=\"toc-title-2255\">\u00cdndice<\/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=\"#conexion-a-traves-de-http1-1-y-luego-actualizacion-a-http-2-h2c\">Conexi\u00f3n a trav\u00e9s de HTTP1.1 y luego actualizaci\u00f3n a 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=\"#conexion-a-traves-de-http-2-h2c\">Conexi\u00f3n a trav\u00e9s de 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=\"Copia al portapapeles\" data-clipboard-success-label=\"\u00a1Copiado!\" data-clipboard-error-label=\"No se ha podido copiar\" data-tooltip=\"Copia al portapapeles\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copia al portapapeles\">\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\">El c\u00f3digo anterior permite que el servidor admita\u00a0la actualizaci\u00f3n a H2C\u00a0y\u00a0el conocimiento previo de H2C\u00a0junto con los protocolos est\u00e1ndar HTTP\/2 y HTTP\/1.1 que golang admite de forma nativa.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Si no te interesa admitir HTTP\/1.1, puedes ejecutar este c\u00f3digo, que solo admite el conocimiento previo de 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=\"Copia al portapapeles\" data-clipboard-success-label=\"\u00a1Copiado!\" data-clipboard-error-label=\"No se ha podido copiar\" data-tooltip=\"Copia al portapapeles\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copia al portapapeles\">\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\">Una vez que tengas un servidor en ejecuci\u00f3n, puedes probarlo instalando\u00a0<code>curl-OpenSSL<\/code>\u00a0y usando curl para probar tu servidor habilitado para 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=\"Copia al portapapeles\" data-clipboard-success-label=\"\u00a1Copiado!\" data-clipboard-error-label=\"No se ha podido copiar\" data-tooltip=\"Copia al portapapeles\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copia al portapapeles\">\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\">Conexi\u00f3n a trav\u00e9s de HTTP1.1 y luego actualizaci\u00f3n a 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=\"Copia al portapapeles\" data-clipboard-success-label=\"\u00a1Copiado!\" data-clipboard-error-label=\"No se ha podido copiar\" data-tooltip=\"Copia al portapapeles\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copia al portapapeles\">\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\">Conexi\u00f3n a trav\u00e9s de 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=\"Copia al portapapeles\" data-clipboard-success-label=\"\u00a1Copiado!\" data-clipboard-error-label=\"No se ha podido copiar\" data-tooltip=\"Copia al portapapeles\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copia al portapapeles\">\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\">Ahora bien, \u00bfrecuerdas que dije que la biblioteca est\u00e1ndar de golang no admite H2C? Aunque eso es t\u00e9cnicamente correcto,\u00a0<b>hay una soluci\u00f3n alternativa para lograr que el cliente est\u00e1ndar HTTP\/2 de golang se conecte a un servidor habilitado para H2C<\/b>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para ello, tienes que sobrescribir\u00a0<code>DialTLS<\/code>\u00a0y establecer el indicador\u00a0supersecreto\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=\"Copia al portapapeles\" data-clipboard-success-label=\"\u00a1Copiado!\" data-clipboard-error-label=\"No se ha podido copiar\" data-tooltip=\"Copia al portapapeles\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copia al portapapeles\">\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\">Aunque todo esto parezca un poco extra\u00f1o, la verdad es que funciona muy bien y tiene un buen rendimiento en entornos de producci\u00f3n.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Hay un ejemplo completo y funcional disponible aqu\u00ed\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>Descubre lo que hemos averiguado sobre la asistencia para H2C en golang y c\u00f3mo hacer que el cliente est\u00e1ndar http2 de golang se conecte a un servidor habilitado para H2C. M\u00e1s informaci\u00f3n&#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-19936","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>Ejemplo de cliente HTTP\/2 Cleartext (H2C) en Go | Mailgun<\/title>\n<meta name=\"description\" content=\"Descubre lo que hemos averiguado sobre la asistencia para H2C en golang y c\u00f3mo hacer que el cliente est\u00e1ndar http2 de golang se conecte a un servidor habilitado para H2C. M\u00e1s informaci\u00f3n...\" \/>\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\/es\/blog\/dev-life\/ejemplo-cliente-http-2-cleartext-h2c-go\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Ejemplo de cliente HTTP\/2 Cleartext (H2C) en Go | Mailgun\" \/>\n<meta property=\"og:description\" content=\"Descubre lo que hemos averiguado sobre la asistencia para H2C en golang y c\u00f3mo hacer que el cliente est\u00e1ndar http2 de golang se conecte a un servidor habilitado para H2C. M\u00e1s informaci\u00f3n...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.mailgun.com\/es\/blog\/dev-life\/ejemplo-cliente-http-2-cleartext-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 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/dev-life\\\/ejemplo-cliente-http-2-cleartext-h2c-go\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/dev-life\\\/ejemplo-cliente-http-2-cleartext-h2c-go\\\/\",\"name\":\"Ejemplo de cliente HTTP\\\/2 Cleartext (H2C) en Go | Mailgun\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/dev-life\\\/ejemplo-cliente-http-2-cleartext-h2c-go\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/dev-life\\\/ejemplo-cliente-http-2-cleartext-h2c-go\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Dev-Life.png\",\"datePublished\":\"2026-09-14T18:33:06+00:00\",\"description\":\"Descubre lo que hemos averiguado sobre la asistencia para H2C en golang y c\u00f3mo hacer que el cliente est\u00e1ndar http2 de golang se conecte a un servidor habilitado para H2C. M\u00e1s informaci\u00f3n...\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/dev-life\\\/ejemplo-cliente-http-2-cleartext-h2c-go\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/dev-life\\\/ejemplo-cliente-http-2-cleartext-h2c-go\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/dev-life\\\/ejemplo-cliente-http-2-cleartext-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\\\/es\\\/blog\\\/dev-life\\\/ejemplo-cliente-http-2-cleartext-h2c-go\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Blog\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Ejemplo de cliente HTTP\\\/2 Cleartext (H2C) en Go\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#website\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"description\":\"Potentes API de email transaccional que te permiten enviar, recibir y hacer seguimiento de emails, creadas pensando en los desarrolladores. \u00a1Descubre m\u00e1s!\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#organization\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#\\\/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\\\/es\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Ejemplo de cliente HTTP\/2 Cleartext (H2C) en Go | Mailgun","description":"Descubre lo que hemos averiguado sobre la asistencia para H2C en golang y c\u00f3mo hacer que el cliente est\u00e1ndar http2 de golang se conecte a un servidor habilitado para H2C. M\u00e1s informaci\u00f3n...","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\/es\/blog\/dev-life\/ejemplo-cliente-http-2-cleartext-h2c-go\/","og_locale":"es_ES","og_type":"article","og_title":"Ejemplo de cliente HTTP\/2 Cleartext (H2C) en Go | Mailgun","og_description":"Descubre lo que hemos averiguado sobre la asistencia para H2C en golang y c\u00f3mo hacer que el cliente est\u00e1ndar http2 de golang se conecte a un servidor habilitado para H2C. M\u00e1s informaci\u00f3n...","og_url":"https:\/\/www.mailgun.com\/es\/blog\/dev-life\/ejemplo-cliente-http-2-cleartext-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 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.mailgun.com\/es\/blog\/dev-life\/ejemplo-cliente-http-2-cleartext-h2c-go\/","url":"https:\/\/www.mailgun.com\/es\/blog\/dev-life\/ejemplo-cliente-http-2-cleartext-h2c-go\/","name":"Ejemplo de cliente HTTP\/2 Cleartext (H2C) en Go | Mailgun","isPartOf":{"@id":"https:\/\/www.mailgun.com\/es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.mailgun.com\/es\/blog\/dev-life\/ejemplo-cliente-http-2-cleartext-h2c-go\/#primaryimage"},"image":{"@id":"https:\/\/www.mailgun.com\/es\/blog\/dev-life\/ejemplo-cliente-http-2-cleartext-h2c-go\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Dev-Life.png","datePublished":"2026-09-14T18:33:06+00:00","description":"Descubre lo que hemos averiguado sobre la asistencia para H2C en golang y c\u00f3mo hacer que el cliente est\u00e1ndar http2 de golang se conecte a un servidor habilitado para H2C. M\u00e1s informaci\u00f3n...","breadcrumb":{"@id":"https:\/\/www.mailgun.com\/es\/blog\/dev-life\/ejemplo-cliente-http-2-cleartext-h2c-go\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.mailgun.com\/es\/blog\/dev-life\/ejemplo-cliente-http-2-cleartext-h2c-go\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.mailgun.com\/es\/blog\/dev-life\/ejemplo-cliente-http-2-cleartext-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\/es\/blog\/dev-life\/ejemplo-cliente-http-2-cleartext-h2c-go\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.mailgun.com\/es\/"},{"@type":"ListItem","position":2,"name":"Blog","item":"https:\/\/www.mailgun.com\/es\/blog\/"},{"@type":"ListItem","position":3,"name":"Ejemplo de cliente HTTP\/2 Cleartext (H2C) en Go"}]},{"@type":"WebSite","@id":"https:\/\/www.mailgun.com\/es\/#website","url":"https:\/\/www.mailgun.com\/es\/","name":"Transactional Email API Service For Developers | Mailgun","description":"Potentes API de email transaccional que te permiten enviar, recibir y hacer seguimiento de emails, creadas pensando en los desarrolladores. \u00a1Descubre m\u00e1s!","publisher":{"@id":"https:\/\/www.mailgun.com\/es\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.mailgun.com\/es\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/www.mailgun.com\/es\/#organization","name":"Transactional Email API Service For Developers | Mailgun","url":"https:\/\/www.mailgun.com\/es\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.mailgun.com\/es\/#\/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\/es\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/blog\/19936","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/users\/13"}],"version-history":[{"count":0,"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/blog\/19936\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/media\/3952"}],"wp:attachment":[{"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/media?parent=19936"}],"wp:term":[{"taxonomy":"blog_category","embeddable":true,"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/blog_category?post=19936"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}