#endif
size_ = 0;
}
-int close_socket(socket_t sock) {
+int close_socket(socket_t sock) noexcept {
#ifdef _WIN32
return closesocket(sock);
#else
return callback(strm);
}
-int shutdown_socket(socket_t sock) {
+int shutdown_socket(socket_t sock) noexcept {
#ifdef _WIN32
return shutdown(sock, SD_BOTH);
#else
}
}
-void Server::stop() {
+void Server::stop() noexcept {
if (is_running_) {
assert(svr_sock_ != INVALID_SOCKET);
std::atomic<socket_t> sock(svr_sock_.exchange(INVALID_SOCKET));
template <typename Callback>
bool enumerate_macos_keychain_certs(Callback cb) {
bool loaded = false;
- CFArrayRef certs = nullptr;
- OSStatus status = SecTrustCopyAnchorCertificates(&certs);
- if (status == errSecSuccess && certs) {
+ const SecTrustSettingsDomain domains[] = {
+ kSecTrustSettingsDomainSystem,
+ kSecTrustSettingsDomainAdmin,
+ kSecTrustSettingsDomainUser,
+ };
+ for (auto domain : domains) {
+ CFArrayRef certs = nullptr;
+ OSStatus status = SecTrustSettingsCopyCertificates(domain, &certs);
+ if (status != errSecSuccess || !certs) {
+ if (certs) CFRelease(certs);
+ continue;
+ }
CFIndex count = CFArrayGetCount(certs);
for (CFIndex i = 0; i < count; i++) {
SecCertificateRef cert =
auto store = SSL_CTX_get_cert_store(ssl_ctx);
if (!store) return false;
- CFArrayRef certs = nullptr;
- if (SecTrustCopyAnchorCertificates(&certs) != errSecSuccess || !certs) {
- return SSL_CTX_set_default_verify_paths(ssl_ctx) == 1;
- }
-
bool loaded_any = false;
- auto count = CFArrayGetCount(certs);
- for (CFIndex i = 0; i < count; i++) {
- auto cert = reinterpret_cast<SecCertificateRef>(
- const_cast<void *>(CFArrayGetValueAtIndex(certs, i)));
- CFDataRef der = SecCertificateCopyData(cert);
- if (der) {
- const unsigned char *data = CFDataGetBytePtr(der);
- auto x509 = d2i_X509(nullptr, &data, CFDataGetLength(der));
- if (x509) {
- if (X509_STORE_add_cert(store, x509) == 1) { loaded_any = true; }
- X509_free(x509);
+ const SecTrustSettingsDomain domains[] = {
+ kSecTrustSettingsDomainSystem,
+ kSecTrustSettingsDomainAdmin,
+ kSecTrustSettingsDomainUser,
+ };
+ for (auto domain : domains) {
+ CFArrayRef certs = nullptr;
+ if (SecTrustSettingsCopyCertificates(domain, &certs) != errSecSuccess ||
+ !certs) {
+ if (certs) CFRelease(certs);
+ continue;
+ }
+ auto count = CFArrayGetCount(certs);
+ for (CFIndex i = 0; i < count; i++) {
+ auto cert = reinterpret_cast<SecCertificateRef>(
+ const_cast<void *>(CFArrayGetValueAtIndex(certs, i)));
+ CFDataRef der = SecCertificateCopyData(cert);
+ if (der) {
+ const unsigned char *data = CFDataGetBytePtr(der);
+ auto x509 = d2i_X509(nullptr, &data, CFDataGetLength(der));
+ if (x509) {
+ if (X509_STORE_add_cert(store, x509) == 1) { loaded_any = true; }
+ X509_free(x509);
+ }
+ CFRelease(der);
}
- CFRelease(der);
}
+ CFRelease(certs);
}
- CFRelease(certs);
return loaded_any || SSL_CTX_set_default_verify_paths(ssl_ctx) == 1;
#else
return SSL_CTX_set_default_verify_paths(ssl_ctx) == 1;
#ifndef CPPHTTPLIB_HTTPLIB_H
#define CPPHTTPLIB_HTTPLIB_H
-#define CPPHTTPLIB_VERSION "0.45.0"
-#define CPPHTTPLIB_VERSION_NUM "0x002d00"
+#define CPPHTTPLIB_VERSION "0.45.1"
+#define CPPHTTPLIB_VERSION_NUM "0x002d01"
#ifdef _WIN32
#if defined(_WIN32_WINNT) && _WIN32_WINNT < 0x0A00
#include <utility>
// On macOS with a TLS backend, enable Keychain root certificates by default
-// unless the user explicitly opts out.
+// unless the user explicitly opts out. Not enabled on iOS/tvOS/watchOS since
+// the SecTrustSettings APIs used to enumerate anchor certificates are macOS
+// only; on those platforms the user must provide a CA bundle explicitly.
#if defined(__APPLE__) && defined(__clang__) && \
!defined(CPPHTTPLIB_DISABLE_MACOSX_AUTOMATIC_ROOT_CERTIFICATES) && \
(defined(CPPHTTPLIB_OPENSSL_SUPPORT) || \
defined(CPPHTTPLIB_MBEDTLS_SUPPORT) || \
defined(CPPHTTPLIB_WOLFSSL_SUPPORT))
+#if TARGET_OS_OSX
#ifndef CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN
#define CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN
#endif
#endif
+#endif
+
+#if defined(CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN) && \
+ defined(__APPLE__) && !TARGET_OS_OSX
+#error \
+ "CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN is only supported on macOS. On iOS/tvOS/watchOS, supply a CA bundle via set_ca_cert_path()."
+#endif
// On Windows, enable Schannel certificate verification by default
// unless the user explicitly opts out.
#endif // _WIN32
#ifdef CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN
-#if TARGET_OS_MAC
+#if TARGET_OS_OSX
#include <Security/Security.h>
#endif
#endif
#endif
#endif // _WIN32
#ifdef CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN
-#if TARGET_OS_MAC
+#if TARGET_OS_OSX
#include <Security/Security.h>
#endif
#endif
#endif
#endif // _WIN32
#ifdef CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN
-#if TARGET_OS_MAC
+#if TARGET_OS_OSX
#include <Security/Security.h>
#endif
#endif
std::regex regex_;
};
-int close_socket(socket_t sock);
+int close_socket(socket_t sock) noexcept;
ssize_t write_headers(Stream &strm, const Headers &headers);
bool is_running() const;
void wait_until_ready() const;
- void stop();
+ void stop() noexcept;
void decommission();
std::function<TaskQueue *(void)> new_task_queue;
bool parse_accept_header(const std::string &s,
std::vector<std::string> &content_types);
-int close_socket(socket_t sock);
-
ssize_t send_socket(socket_t sock, const void *ptr, size_t size, int flags);
ssize_t read_socket(socket_t sock, void *ptr, size_t size, int flags);