]> granicus.if.org Git - esp-idf/commitdiff
esp-tls: Fix HTTP2 failure
authorJitin George <jitin@espressif.com>
Fri, 20 Apr 2018 05:20:38 +0000 (10:50 +0530)
committerJitin George <jitin@espressif.com>
Fri, 20 Apr 2018 11:29:36 +0000 (16:59 +0530)
Closes https://github.com/espressif/esp-idf/issues/1874

components/esp-tls/esp_tls.c
components/esp-tls/esp_tls.h
examples/protocols/http2_request/components/sh2lib/sh2lib.c
examples/protocols/http2_request/components/sh2lib/sh2lib.h

index 5309d7796a50fe287d6b113cae4d6ead4379dbce..a7040b3d2c22c9e8a43a49827db8def749580e33 100644 (file)
@@ -182,6 +182,10 @@ static int create_ssl_handle(esp_tls_t *tls, const char *hostname, size_t hostle
         goto exit;
     }
 
+    if (cfg->alpn_protos) {
+        mbedtls_ssl_conf_alpn_protocols(&tls->conf, cfg->alpn_protos);
+    }
+
     if (cfg->cacert_pem_buf != NULL) {
         mbedtls_x509_crt_init(&tls->cacert);
         ret = mbedtls_x509_crt_parse(&tls->cacert, cfg->cacert_pem_buf, cfg->cacert_pem_bytes);
index 4f2f35a03ac43fde0dcc857edc8bf391f9adfe07..92b0734ebef8066e15a7bfd0179a4c6ac0149b03 100644 (file)
@@ -36,7 +36,7 @@ extern "C" {
  * @brief      ESP-TLS configuration parameters 
  */ 
 typedef struct esp_tls_cfg {
-    const unsigned char *alpn_protos;       /*!< Application protocols required for HTTP2. 
+    const char **alpn_protos;               /*!< Application protocols required for HTTP2.
                                                  If HTTP2/ALPN support is required, a list
                                                  of protocols that should be negotiated. 
                                                  The format is length followed by protocol
index 4026db456232ce9e77ec747c5dd172a706500eae..8273265aef6da6fb492b6e66132f09deb9bda608 100644 (file)
@@ -20,6 +20,7 @@
 #include <ctype.h>
 #include <netdb.h>
 #include <esp_log.h>
+#include <http_parser.h>
 
 #include "sh2lib.h"
 
@@ -240,14 +241,19 @@ static int do_http2_connect(struct sh2lib_handle *hd)
 int sh2lib_connect(struct sh2lib_handle *hd, const char *uri)
 {
     memset(hd, 0, sizeof(*hd));
+    const char *proto[] = {"h2", NULL};
     esp_tls_cfg_t tls_cfg = {
-        .alpn_protos = (unsigned char *) "\x02h2",
+        .alpn_protos = proto,
         .non_block = true,
     };    
     if ((hd->http2_tls = esp_tls_conn_http_new(uri, &tls_cfg)) == NULL) {
         ESP_LOGE(TAG, "[sh2-connect] esp-tls connection failed");
         goto error;
     }
+    struct http_parser_url u;
+    http_parser_url_init(&u);
+    http_parser_parse_url(uri, strlen(uri), 0, &u);
+    hd->hostname = strndup(&uri[u.field_data[UF_HOST].off], u.field_data[UF_HOST].len);
 
     /* HTTP/2 Connection */
     if (do_http2_connect(hd) != 0) {
index 44d1a5333ee62a3317cce9fb883b548c43735167..f67137695ca42a427ebeb76d19af1a15a9706fb4 100644 (file)
@@ -34,7 +34,6 @@
  */
 struct sh2lib_handle {
     nghttp2_session *http2_sess;   /*!< Pointer to the HTTP2 session handle */
-    int              sockfd;       /*!< Socket file descriptor */
     char            *hostname;     /*!< The hostname we are connected to */
     struct esp_tls  *http2_tls;    /*!< Pointer to the TLS session handle */
 };