diff --git a/uppsrc/Web/SSL/WebSSL.h b/uppsrc/Web/SSL/WebSSL.h index cdb57a517..4005e6702 100644 --- a/uppsrc/Web/SSL/WebSSL.h +++ b/uppsrc/Web/SSL/WebSSL.h @@ -125,7 +125,7 @@ private: class SSLContext { public: - SSLContext(SSL_CTX *c = NULL) : ssl_ctx(c) { /*SSLInit();*/ } + SSLContext(SSL_CTX *c = NULL); ~SSLContext() { Clear(); } bool IsEmpty() const { return !ssl_ctx; } @@ -172,6 +172,8 @@ public: One ssl_context; bool secure; + + enum { DEFAULT_HTTPS_PORT = 443 }; }; END_UPP_NAMESPACE diff --git a/uppsrc/Web/SSL/httpscli.cpp b/uppsrc/Web/SSL/httpscli.cpp index bf1580baa..0d7a28c6f 100644 --- a/uppsrc/Web/SSL/httpscli.cpp +++ b/uppsrc/Web/SSL/httpscli.cpp @@ -20,7 +20,8 @@ bool HttpsClient::CreateClientSocket() return false; } } - if(!SSLClientSocket(socket, *ssl_context, socket_host, socket_port, true, NULL, 0, false)) { + if(!SSLClientSocket(socket, *ssl_context, socket_host, + socket_port ? socket_port : DEFAULT_HTTPS_PORT, true, NULL, 0, false)) { error = Socket::GetErrorText(); return false; } diff --git a/uppsrc/Web/SSL/util.cpp b/uppsrc/Web/SSL/util.cpp index 085632587..cceca1ec0 100644 --- a/uppsrc/Web/SSL/util.cpp +++ b/uppsrc/Web/SSL/util.cpp @@ -3,6 +3,8 @@ #ifndef flagNOSSL +#include + NAMESPACE_UPP #define LOG_UPP_SSL_MALLOC 0 @@ -11,6 +13,48 @@ NAMESPACE_UPP static int UPP_SSL_alloc = 0; #endif +struct SSLInitCls { + SSLInitCls(); + ~SSLInitCls(); + + void AddThread(); + + Index threadlist; +}; + +GLOBAL_VAR(SSLInitCls, SSLInit); + +SSLInitCls::SSLInitCls() +{ + RLOG("SSLInitCls"); + Socket::Init(); + CRYPTO_set_mem_functions(SSLAlloc, SSLRealloc, SSLFree); + SSL_load_error_strings(); + SSL_library_init(); + AddThread(); +} + +SSLInitCls::~SSLInitCls() +{ + RLOG("~SSLInitCls"); + + CONF_modules_unload(1); +// destroy_ui_method(); + EVP_cleanup(); + ENGINE_cleanup(); + CRYPTO_cleanup_all_ex_data(); + for(int i = threadlist.GetCount(); --i >= 0;) + ERR_remove_state(threadlist[i]); + ERR_free_strings(); +} + +void SSLInitCls::AddThread() +{ + INTERLOCKED { + threadlist.FindAdd(CRYPTO_thread_id()); + } +} + void *SSLAlloc(size_t size) { size_t alloc = size + sizeof(int); @@ -74,23 +118,6 @@ void *SSLRealloc(void *ptr, size_t size) return newaptr; } -INITBLOCK { - Socket::Init(); - CRYPTO_set_mem_functions(SSLAlloc, SSLRealloc, SSLFree); - SSL_load_error_strings(); - SSL_library_init(); -} - -EXITBLOCK { - CONF_modules_unload(1); -// destroy_ui_method(); - EVP_cleanup(); -// ENGINE_cleanup(); - CRYPTO_cleanup_all_ex_data(); - ERR_remove_state(0); - ERR_free_strings(); -} - /* void SSLInit() { @@ -302,6 +329,12 @@ String SSLCertificate::GetHash() const } */ +SSLContext::SSLContext(SSL_CTX *c) +: ssl_ctx(c) +{ + SSLInit(); +} + bool SSLContext::CipherList(const char *list) { ASSERT(ssl_ctx); @@ -360,6 +393,7 @@ public: SSLSocketData::SSLSocketData(SSLContext& ssl_context) : ssl_context(ssl_context) { + SSLInit().AddThread(); ssl = NULL; } diff --git a/uppsrc/Web/httpcli.cpp b/uppsrc/Web/httpcli.cpp index 57c2c5fce..b96c25d71 100644 --- a/uppsrc/Web/httpcli.cpp +++ b/uppsrc/Web/httpcli.cpp @@ -17,7 +17,7 @@ void HttpClient::Trace(bool b) void HttpClient::Init() { - port = DEFAULT_PORT; + port = 0; timeout_msecs = DEFAULT_TIMEOUT_MSECS; max_header_size = DEFAULT_MAX_HEADER_SIZE; max_content_size = DEFAULT_MAX_CONTENT_SIZE; @@ -54,7 +54,7 @@ HttpClient& HttpClient::URL(const char *u) if(*u == '?' && u[1]) hasurlvar = true; host = String(t, u); - port = DEFAULT_PORT; + port = 0; if(*u == ':') port = ScanInt(u + 1, &u); path = u; @@ -239,7 +239,7 @@ String HttpClient::Execute(Gate2 progress) default: NEVER(); // invalid method } String host_port = host; - if(port != DEFAULT_PORT) + if(port) host_port << ':' << port; String url; url << "http://" << host_port << Nvl(path, "/"); @@ -557,7 +557,8 @@ String HttpClient::ExecuteRedirect(int max_redirect, int retries, Gate2