|
25 | 25 | #include <lib/support/logging/CHIPLogging.h>
|
26 | 26 | #include <system/SystemError.h>
|
27 | 27 |
|
| 28 | +#ifdef CONFIG_ENABLE_HTTPS_REQUESTS |
28 | 29 | #if (CHIP_CRYPTO_OPENSSL || CHIP_CRYPTO_BORINGSSL)
|
29 | 30 | #include <netdb.h>
|
30 | 31 | #include <openssl/ssl.h>
|
|
33 | 34 | #define USE_CHIP_CRYPTO 1
|
34 | 35 | #endif
|
35 | 36 | #endif //(CHIP_CRYPTO_OPENSSL || CHIP_CRYPTO_BORINGSSL)
|
| 37 | +#endif // CONFIG_ENABLE_HTTPS_REQUESTS |
36 | 38 |
|
37 | 39 | namespace {
|
38 | 40 | constexpr const char * kHttpsPrefix = "https://";
|
@@ -68,9 +70,18 @@ class HTTPSSessionHolder
|
68 | 70 | private:
|
69 | 71 | CHIP_ERROR LogNotImplementedError() const
|
70 | 72 | {
|
| 73 | +#ifndef CONFIG_ENABLE_HTTPS_REQUESTS |
| 74 | + ChipLogError(chipTool, "HTTPS requests are disabled via build configuration (config_enable_https_requests=false)."); |
| 75 | +#elif !(CHIP_CRYPTO_OPENSSL || CHIP_CRYPTO_BORINGSSL) |
71 | 76 | ChipLogError(chipTool,
|
72 | 77 | "HTTPS requests are not available because neither OpenSSL nor BoringSSL is enabled. Contributions for "
|
73 | 78 | "alternative implementations are welcome!");
|
| 79 | +#elif !defined(SHA256_DIGEST_LENGTH) |
| 80 | + ChipLogError(chipTool, |
| 81 | + "HTTPS requests are not available because SHA256_DIGEST_LENGTH is not defined, meaning response integrity " |
| 82 | + "verification via SHA-256 digest checking cannot be performed."); |
| 83 | +#endif |
| 84 | + |
74 | 85 | return CHIP_ERROR_NOT_IMPLEMENTED;
|
75 | 86 | }
|
76 | 87 | };
|
@@ -134,19 +145,21 @@ class HTTPSSessionHolder
|
134 | 145 | private:
|
135 | 146 | CHIP_ERROR InitSocket(std::string & hostname, uint16_t port, int & sock)
|
136 | 147 | {
|
137 |
| - auto * server = gethostbyname(hostname.c_str()); |
138 |
| - VerifyOrReturnError(nullptr != server, CHIP_ERROR_NOT_CONNECTED); |
| 148 | + struct addrinfo * res = nullptr; |
| 149 | + struct addrinfo hints = {}; |
| 150 | + hints.ai_family = AF_INET; |
| 151 | + hints.ai_socktype = SOCK_STREAM; |
139 | 152 |
|
140 |
| - sock = socket(AF_INET, SOCK_STREAM, 0); |
141 |
| - VerifyOrReturnError(sock >= 0, CHIP_ERROR_NOT_CONNECTED); |
| 153 | + int err = getaddrinfo(hostname.c_str(), std::to_string(port).c_str(), &hints, &res); |
| 154 | + VerifyOrReturnError(err == 0 && res != nullptr, CHIP_ERROR_NOT_CONNECTED, |
| 155 | + ChipLogError(chipTool, "getaddrinfo failed: %s", gai_strerror(err))); |
142 | 156 |
|
143 |
| - struct sockaddr_in server_addr; |
144 |
| - memset(&server_addr, 0, sizeof(server_addr)); |
145 |
| - server_addr.sin_family = AF_INET; |
146 |
| - server_addr.sin_port = htons(port); |
147 |
| - memcpy(&server_addr.sin_addr.s_addr, server->h_addr, (size_t) server->h_length); |
| 157 | + sock = socket(res->ai_family, res->ai_socktype, res->ai_protocol); |
| 158 | + VerifyOrReturnError(sock >= 0, CHIP_ERROR_NOT_CONNECTED, |
| 159 | + ChipLogError(chipTool, "%s%s:%u", kErrorConnection, hostname.c_str(), port)); |
148 | 160 |
|
149 |
| - int rv = connect(sock, (struct sockaddr *) &server_addr, sizeof(server_addr)); |
| 161 | + int rv = connect(sock, res->ai_addr, res->ai_addrlen); |
| 162 | + freeaddrinfo(res); |
150 | 163 | VerifyOrReturnError(rv >= 0, CHIP_ERROR_POSIX(errno),
|
151 | 164 | ChipLogError(chipTool, "%s%s:%u", kErrorConnection, hostname.c_str(), port));
|
152 | 165 |
|
|
0 commit comments