Ver código fonte

fix #116: hssl_set_sni_hostname

ithewei 4 anos atrás
pai
commit
b3ca3b54cb
4 arquivos alterados com 21 adições e 6 exclusões
  1. 10 1
      base/hsocket.c
  2. 6 0
      base/hsocket.h
  3. 5 2
      http/client/http_client.cpp
  4. 0 3
      http/client/requests.h

+ 10 - 1
base/hsocket.c

@@ -26,6 +26,16 @@ const char* socket_strerror(int err) {
 #endif
 }
 
+bool is_ipv4(const char* host) {
+    struct sockaddr_in sin;
+    return inet_pton(AF_INET, host, &sin) == 1;
+}
+
+bool is_ipv6(const char* host) {
+    struct sockaddr_in6 sin6;
+    return inet_pton(AF_INET6, host, &sin6) == 1;
+}
+
 int Resolver(const char* host, sockaddr_u* addr) {
     if (inet_pton(AF_INET, host, &addr->sin.sin_addr) == 1) {
         addr->sa.sa_family = AF_INET; // host is ipv4, so easy ;)
@@ -35,7 +45,6 @@ int Resolver(const char* host, sockaddr_u* addr) {
 #ifdef ENABLE_IPV6
     if (inet_pton(AF_INET6, host, &addr->sin6.sin6_addr) == 1) {
         addr->sa.sa_family = AF_INET6; // host is ipv6
-        return 0;
     }
     struct addrinfo* ais = NULL;
     struct addrinfo hint;

+ 6 - 0
base/hsocket.h

@@ -76,6 +76,12 @@ typedef union {
 #endif
 } sockaddr_u;
 
+HV_EXPORT bool is_ipv4(const char* host);
+HV_EXPORT bool is_ipv6(const char* host);
+HV_INLINE bool is_ipaddr(const char* host) {
+    return is_ipv4(host) || is_ipv6(host);
+}
+
 // @param host: domain or ip
 // @retval 0:succeed
 HV_EXPORT int Resolver(const char* host, sockaddr_u* addr);

+ 5 - 2
http/client/http_client.cpp

@@ -350,7 +350,8 @@ static int __http_client_connect(http_client_t* cli, HttpRequest* req) {
         blocktime = MIN(req->timeout*1000, blocktime);
     }
     req->ParseUrl();
-    int connfd = ConnectTimeout(req->host.c_str(), req->port, blocktime);
+    const char* host = req->host.c_str();
+    int connfd = ConnectTimeout(host, req->port, blocktime);
     if (connfd < 0) {
         return connfd;
     }
@@ -367,7 +368,9 @@ static int __http_client_connect(http_client_t* cli, HttpRequest* req) {
             closesocket(connfd);
             return HSSL_ERROR;
         }
-        // hssl_set_sni_hostname(cli->ssl, req->host.c_str());
+        if (!is_ipaddr(host)) {
+            hssl_set_sni_hostname(cli->ssl, host);
+        }
         int ret = hssl_connect(cli->ssl);
         if (ret != 0) {
             fprintf(stderr, "ssl handshake failed: %d\n", ret);

+ 0 - 3
http/client/requests.h

@@ -39,9 +39,6 @@ typedef HttpRequestPtr          Request;
 typedef HttpResponsePtr         Response;
 typedef HttpResponseCallback    ResponseCallback;
 
-static http_headers DefaultHeaders;
-static http_body    NoBody;
-
 HV_INLINE Response request(Request req) {
     Response resp(new HttpResponse);
     int ret = http_client_send(req.get(), resp.get());