Hello community,

here is the log from the commit of package uwsgi for openSUSE:Factory checked 
in at 2018-08-06 11:54:22
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/uwsgi (Old)
 and      /work/SRC/openSUSE:Factory/.uwsgi.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "uwsgi"

Mon Aug  6 11:54:22 2018 rev:30 rq:627484 version:2.0.17.1

Changes:
--------
--- /work/SRC/openSUSE:Factory/uwsgi/uwsgi.changes      2018-07-31 
16:03:13.279936214 +0200
+++ /work/SRC/openSUSE:Factory/.uwsgi.new/uwsgi.changes 2018-08-06 
11:54:23.685256553 +0200
@@ -1,0 +2,5 @@
+Thu Aug  2 22:12:22 UTC 2018 - [email protected]
+
+- Trimmed package description
+
+-------------------------------------------------------------------
@@ -4,0 +10,15 @@
+
+-------------------------------------------------------------------
+Mon Jul  9 14:52:54 UTC 2018 - [email protected]
+
+- update to upstream release 2.0.17.1
+  * Fixed memory leak in HTTPS_CLIENT_CERTIFICATE
+  * TLSv1 is now disabled by default
+  * Improved daemons throttle system
+  * Add “secs” log formatting variable
+  * Improved snprintf() usage to be OpenBSD-friendly
+  * Improved glibc crypt/crypt_r management
+  * Fixed websocket pong timeout check
+  * Add the “License” classifier to setup.py
+  * Add support for php user.ini
+  * Official support for Python 3.7

Old:
----
  uwsgi-2.0.17.tar.gz

New:
----
  uwsgi-2.0.17.1.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ uwsgi.spec ++++++
--- /var/tmp/diff_new_pack.6LLKvv/_old  2018-08-06 11:54:24.289257602 +0200
+++ /var/tmp/diff_new_pack.6LLKvv/_new  2018-08-06 11:54:24.293257608 +0200
@@ -17,7 +17,7 @@
 
 
 Name:           uwsgi
-Version:        2.0.17
+Version:        2.0.17.1
 Release:        0
 Summary:        Application Container Server for Networked/Clustered Web 
Applications
 License:        Apache-2.0 AND GPL-2.0-only WITH GCC-exception-2.0
@@ -146,8 +146,7 @@
 It is a WSGI server with a stack for networked/clustered web applications,
 implementing message/object passing, caching, RPC and process management.
 
-It uses the uwsgi (all lowercase, already included by default in the Nginx and
-Cherokee releases) protocol for all the networking/interprocess communications,
+It uses the uwsgi protocol for all the networking/interprocess communications,
 but it can speak other protocols as well (http, fastcgi, mongrel2...)
 
 It can be run in preforking mode, threaded, asynchronous/evented and supports

++++++ uwsgi-2.0.17.tar.gz -> uwsgi-2.0.17.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/uwsgi-2.0.17/PKG-INFO new/uwsgi-2.0.17.1/PKG-INFO
--- old/uwsgi-2.0.17/PKG-INFO   2018-02-26 19:34:40.000000000 +0100
+++ new/uwsgi-2.0.17.1/PKG-INFO 2018-07-08 19:33:15.000000000 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: uWSGI
-Version: 2.0.17
+Version: 2.0.17.1
 Summary: The uWSGI server
 Home-page: https://uwsgi-docs.readthedocs.io/en/latest/
 Author: Unbit
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/uwsgi-2.0.17/core/daemons.c 
new/uwsgi-2.0.17.1/core/daemons.c
--- old/uwsgi-2.0.17/core/daemons.c     2018-02-26 19:34:40.000000000 +0100
+++ new/uwsgi-2.0.17.1/core/daemons.c   2018-07-08 19:33:15.000000000 +0200
@@ -271,6 +271,15 @@
                ud->throttle = ud->respawns - (uwsgi.current_time - 
ud->last_spawn);
                // if ud->respawns == 0 then we can end up with throttle < 0
                if (ud->throttle <= 0) ud->throttle = 1;
+               if (ud->max_throttle > 0 ) {
+                       if (ud->throttle > ud->max_throttle) {
+                               ud->throttle = ud->max_throttle;
+                       }
+               }
+               // use an arbitrary value (5 minutes to avoid endless sleeps...)
+               else if (ud->throttle > 300) {
+                       ud->throttle = 300;
+               }
        }
 
        pid_t pid = uwsgi_fork("uWSGI external daemon");
@@ -510,6 +519,7 @@
        char *d_gid = NULL;
        char *d_ns_pid = NULL;
        char *d_chdir = NULL;
+       char *d_max_throttle = NULL;
 
        char *arg = uwsgi_str(value);
 
@@ -532,6 +542,7 @@
                "gid", &d_gid,  
                "ns_pid", &d_ns_pid,    
                "chdir", &d_chdir,      
+               "max_throttle", &d_max_throttle,        
        NULL)) {
                uwsgi_log("invalid --%s keyval syntax\n", opt);
                exit(1);
@@ -581,6 +592,8 @@
 
        uwsgi_ud->chdir = d_chdir;
 
+       uwsgi_ud->max_throttle = d_max_throttle ? atoi(d_max_throttle) : 0;
+
        if (d_touch) {
                size_t i,rlen = 0;
                char **argv = uwsgi_split_quoted(d_touch, strlen(d_touch), ";", 
&rlen);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/uwsgi-2.0.17/core/logging.c 
new/uwsgi-2.0.17.1/core/logging.c
--- old/uwsgi-2.0.17/core/logging.c     2018-02-26 19:34:40.000000000 +0100
+++ new/uwsgi-2.0.17.1/core/logging.c   2018-07-08 19:33:15.000000000 +0200
@@ -715,7 +715,8 @@
 
        }
 
-       rlen = snprintf(logpkt, 4096, "[pid: %d|app: %d|req: %d/%llu] %.*s 
(%.*s) {%d vars in %d bytes} [%.*s] %.*s %.*s => generated %llu bytes in %llu 
%s%s(%.*s %d) %d headers in %llu bytes (%d switches on core %d)\n", (int) 
uwsgi.mypid, wsgi_req->app_id, app_req, (unsigned long long) 
uwsgi.workers[0].requests, wsgi_req->remote_addr_len, wsgi_req->remote_addr, 
wsgi_req->remote_user_len, wsgi_req->remote_user, wsgi_req->var_cnt, 
wsgi_req->uh->pktsize,
+       char *remote_user = wsgi_req->remote_user == NULL ? "" : 
wsgi_req->remote_user;
+       rlen = snprintf(logpkt, 4096, "[pid: %d|app: %d|req: %d/%llu] %.*s 
(%.*s) {%d vars in %d bytes} [%.*s] %.*s %.*s => generated %llu bytes in %llu 
%s%s(%.*s %d) %d headers in %llu bytes (%d switches on core %d)\n", (int) 
uwsgi.mypid, wsgi_req->app_id, app_req, (unsigned long long) 
uwsgi.workers[0].requests, wsgi_req->remote_addr_len, wsgi_req->remote_addr, 
wsgi_req->remote_user_len, remote_user, wsgi_req->var_cnt, 
wsgi_req->uh->pktsize,
                        24, time_request, wsgi_req->method_len, 
wsgi_req->method, wsgi_req->uri_len, wsgi_req->uri, (unsigned long long) 
wsgi_req->response_size, (unsigned long long) rt, tsize, via, 
wsgi_req->protocol_len, wsgi_req->protocol, wsgi_req->status, 
wsgi_req->header_cnt, (unsigned long long) wsgi_req->headers_size, 
wsgi_req->switches, wsgi_req->async_id);
 
        // not enough space for logging the request, just log a (safe) minimal 
message
@@ -1169,6 +1170,11 @@
        return strlen(*buf);
 }
 
+static ssize_t uwsgi_lf_secs(struct wsgi_request * wsgi_req, char **buf) {
+       *buf = uwsgi_float2str((wsgi_req->end_of_request - 
wsgi_req->start_of_request) / 1000000.0);
+       return strlen(*buf);
+}
+
 static ssize_t uwsgi_lf_pid(struct wsgi_request * wsgi_req, char **buf) {
        *buf = uwsgi_num2str(uwsgi.mypid);
        return strlen(*buf);
@@ -1937,6 +1943,7 @@
        r_logchunk(cl);
        r_logchunk(micros);
        r_logchunk(msecs);
+       r_logchunk(secs);
        r_logchunk(tmsecs);
        r_logchunk(tmicros);
        r_logchunk(time);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/uwsgi-2.0.17/core/reader.c 
new/uwsgi-2.0.17.1/core/reader.c
--- old/uwsgi-2.0.17/core/reader.c      2018-02-26 19:34:40.000000000 +0100
+++ new/uwsgi-2.0.17.1/core/reader.c    2018-07-08 19:33:15.000000000 +0200
@@ -5,11 +5,17 @@
 int uwsgi_simple_wait_read_hook(int fd, int timeout) {
        struct pollfd upoll;
        timeout = timeout * 1000;
+       int ret;
 
         upoll.fd = fd;
         upoll.events = POLLIN;
         upoll.revents = 0;
-        int ret = poll(&upoll, 1, timeout);
+       for (;;) {
+               ret = poll(&upoll, 1, timeout);
+               if ((ret < 0) && (errno == EINTR))
+                       continue;
+               break;
+        }
 
         if (ret > 0) {
                 if (upoll.revents & POLLIN) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/uwsgi-2.0.17/core/ssl.c new/uwsgi-2.0.17.1/core/ssl.c
--- old/uwsgi-2.0.17/core/ssl.c 2018-02-26 19:34:40.000000000 +0100
+++ new/uwsgi-2.0.17.1/core/ssl.c       2018-07-08 19:33:15.000000000 +0200
@@ -231,6 +231,10 @@
                ssloptions |= SSL_OP_NO_SSLv3;
        }
 
+       if (!uwsgi.tlsv1) {
+               ssloptions |= SSL_OP_NO_TLSv1;
+       }
+
 // release/reuse buffers as soon as possibile
 #ifdef SSL_MODE_RELEASE_BUFFERS
         SSL_CTX_set_mode(ctx, SSL_MODE_RELEASE_BUFFERS);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/uwsgi-2.0.17/core/utils.c 
new/uwsgi-2.0.17.1/core/utils.c
--- old/uwsgi-2.0.17/core/utils.c       2018-02-26 19:34:40.000000000 +0100
+++ new/uwsgi-2.0.17.1/core/utils.c     2018-07-08 19:33:15.000000000 +0200
@@ -1903,6 +1903,14 @@
        return str;
 }
 
+char *uwsgi_float2str(float num) {
+
+       char *str = uwsgi_malloc(11);
+
+       snprintf(str, 11, "%f", num);
+       return str;
+}
+
 char *uwsgi_64bit2str(int64_t num) {
        char *str = uwsgi_malloc(sizeof(MAX64_STR) + 1);
        snprintf(str, sizeof(MAX64_STR) + 1, "%lld", (long long) num);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/uwsgi-2.0.17/core/uwsgi.c 
new/uwsgi-2.0.17.1/core/uwsgi.c
--- old/uwsgi-2.0.17/core/uwsgi.c       2018-02-26 19:34:40.000000000 +0100
+++ new/uwsgi-2.0.17.1/core/uwsgi.c     2018-07-08 19:33:15.000000000 +0200
@@ -670,6 +670,8 @@
        {"sni-dir", required_argument, 0, "check for cert/key/client_ca file in 
the specified directory and create a sni/ssl context on demand", 
uwsgi_opt_set_str, &uwsgi.sni_dir, 0},
        {"sni-dir-ciphers", required_argument, 0, "set ssl ciphers for sni-dir 
option", uwsgi_opt_set_str, &uwsgi.sni_dir_ciphers, 0},
        {"ssl-enable3", no_argument, 0, "enable SSLv3 (insecure)", 
uwsgi_opt_true, &uwsgi.sslv3, 0},
+       {"ssl-enable-sslv3", no_argument, 0, "enable SSLv3 (insecure)", 
uwsgi_opt_true, &uwsgi.sslv3, 0},
+       {"ssl-enable-tlsv1", no_argument, 0, "enable TLSv1 (insecure)", 
uwsgi_opt_true, &uwsgi.tlsv1, 0},
        {"ssl-option", no_argument, 0, "set a raw ssl option (numeric value)", 
uwsgi_opt_add_string_list, &uwsgi.ssl_options, 0},
 #ifdef UWSGI_PCRE
        {"sni-regexp", required_argument, 0, "add an SNI-governed SSL context 
(the key is a regexp)", uwsgi_opt_sni, NULL, 0},
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/uwsgi-2.0.17/core/websockets.c 
new/uwsgi-2.0.17.1/core/websockets.c
--- old/uwsgi-2.0.17/core/websockets.c  2018-02-26 19:34:40.000000000 +0100
+++ new/uwsgi-2.0.17.1/core/websockets.c        2018-07-08 19:33:15.000000000 
+0200
@@ -62,7 +62,7 @@
        }
        // pong not received ?
        if (wsgi_req->websocket_last_pong < wsgi_req->websocket_last_ping) {
-               if (wsgi_req->websocket_last_ping - 
wsgi_req->websocket_last_pong > uwsgi.websockets_pong_tolerance) {
+               if (now - wsgi_req->websocket_last_ping > 
uwsgi.websockets_pong_tolerance) {
                                 uwsgi_log("[uwsgi-websocket] \"%.*s %.*s\" 
(%.*s) no PONG received in %d seconds !!!\n", REQ_DATA, 
uwsgi.websockets_pong_tolerance);
                                return -1;
                }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/uwsgi-2.0.17/plugins/http/https.c 
new/uwsgi-2.0.17.1/plugins/http/https.c
--- old/uwsgi-2.0.17/plugins/http/https.c       2018-02-26 19:34:40.000000000 
+0100
+++ new/uwsgi-2.0.17.1/plugins/http/https.c     2018-07-08 19:33:15.000000000 
+0200
@@ -191,7 +191,9 @@
                         unsigned char *client_cert_der = NULL;
                         client_cert_len = i2d_X509(hr->ssl_client_cert, 
&client_cert_der);
                         if (client_cert_len < 0) return -1;
-                        if (uwsgi_buffer_append_keyval(out, 
"HTTPS_CLIENT_CERTIFICATE", 24, (char*)client_cert_der, client_cert_len)) 
return -1;
+                       int ret = uwsgi_buffer_append_keyval(out, 
"HTTPS_CLIENT_CERTIFICATE", 24, (char*)client_cert_der, client_cert_len);
+                       OPENSSL_free(client_cert_der);
+                       if (ret) return -1;
 
                         X509_NAME *name = 
X509_get_subject_name(hr->ssl_client_cert);
                         if (name) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/uwsgi-2.0.17/plugins/php/php_plugin.c 
new/uwsgi-2.0.17.1/plugins/php/php_plugin.c
--- old/uwsgi-2.0.17/plugins/php/php_plugin.c   2018-02-26 19:34:40.000000000 
+0100
+++ new/uwsgi-2.0.17.1/plugins/php/php_plugin.c 2018-07-08 19:33:15.000000000 
+0200
@@ -32,6 +32,7 @@
        struct uwsgi_string_list *exec_after;
 
        char *sapi_name;
+       HashTable user_config_cache;
 } uphp;
 
 void uwsgi_opt_php_ini(char *opt, char *value, void *foobar) {
@@ -547,6 +548,76 @@
         STANDARD_MODULE_PROPERTIES
 };
 
+typedef struct _user_config_cache_entry {
+       time_t expires;
+       HashTable *user_config;
+} user_config_cache_entry;
+
+#if (PHP_MAJOR_VERSION >= 7)
+static void user_config_cache_entry_dtor(zval *el) {
+       user_config_cache_entry *entry = (user_config_cache_entry *)Z_PTR_P(el);
+#else
+static void user_config_cache_entry_dtor(user_config_cache_entry *entry) {
+#endif
+       zend_hash_destroy(entry->user_config);
+       free(entry->user_config);
+       free(entry);
+}
+
+static void activate_user_config(const char *filename, const char *doc_root, 
size_t doc_root_len) {
+       char *ptr;
+       user_config_cache_entry *new_entry, *entry;
+
+       time_t request_time = (time_t)sapi_get_request_time();
+
+       // get dirname (path) from filename
+       size_t path_len = (strrchr(filename, DEFAULT_SLASH) - filename) + 1;
+       char path[path_len];
+       memcpy(path, filename, path_len);
+       path[path_len] = '\0';
+
+       // get or create entry from cache
+#if (PHP_MAJOR_VERSION >= 7)
+       if ((entry = zend_hash_str_find_ptr(&uphp.user_config_cache, path, 
path_len)) == NULL) {
+#else
+       if (zend_hash_find(&uphp.user_config_cache, path, path_len + 1, (void 
**) &entry) == FAILURE) {
+#endif
+               new_entry = pemalloc(sizeof(user_config_cache_entry), 1);
+               new_entry->expires = 0;
+               new_entry->user_config = (HashTable *) 
pemalloc(sizeof(HashTable), 1);
+
+               // make zend_hash to store all user.ini settings.
+               zend_hash_init(new_entry->user_config, 0, NULL, (dtor_func_t) 
config_zval_dtor, 1);
+#if (PHP_MAJOR_VERSION >= 7)
+               entry = zend_hash_str_update_ptr(&uphp.user_config_cache, path, 
path_len, new_entry);
+#else
+               zend_hash_update(&uphp.user_config_cache, path, path_len + 1, 
new_entry, sizeof(user_config_cache_entry), (void **) &entry);
+#endif
+       }
+
+       if (request_time > entry->expires) {
+
+               // clear the expired config
+               zend_hash_clean(entry->user_config);
+
+               // set pointer to end of docroot
+               ptr = path + (doc_root_len - 1);
+
+               // parse all user.ini files starting from docroot.
+               while ((ptr = strchr(ptr, DEFAULT_SLASH)) != NULL) {
+                       *ptr = 0;
+                       php_parse_user_ini_file(path, PG(user_ini_filename), 
entry->user_config);
+                       *ptr = '/';
+                       ptr++;
+               }
+
+               // set (new) expiry time
+               entry->expires = request_time + PG(user_ini_cache_ttl);
+       }
+
+       // activate all user.ini variables
+       php_ini_activate_config(entry->user_config, PHP_INI_PERDIR, 
PHP_INI_STAGE_HTACCESS);
+}
 
 static int php_uwsgi_startup(sapi_module_struct *sapi_module)
 {
@@ -624,6 +695,8 @@
                uwsgi_log("--- end of PHP custom config ---\n");
        }
 
+       zend_hash_init(&uphp.user_config_cache, 0, NULL, (dtor_func_t) 
user_config_cache_entry_dtor, 1);
+
        // fix docroot
         if (uphp.docroot) {
                char *orig_docroot = uphp.docroot;
@@ -793,6 +866,7 @@
 #endif
 
        filename = uwsgi_concat4n(wsgi_req->document_root, 
wsgi_req->document_root_len, "/", 1, wsgi_req->path_info, 
wsgi_req->path_info_len, "", 0);
+       activate_user_config(filename, wsgi_req->document_root, 
wsgi_req->document_root_len);
 
        if (uwsgi_php_walk(wsgi_req, filename, wsgi_req->document_root, 
wsgi_req->document_root_len, &path_info)) {
                free(filename);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/uwsgi-2.0.17/plugins/python/python_plugin.c 
new/uwsgi-2.0.17.1/plugins/python/python_plugin.c
--- old/uwsgi-2.0.17/plugins/python/python_plugin.c     2018-02-26 
19:34:40.000000000 +0100
+++ new/uwsgi-2.0.17.1/plugins/python/python_plugin.c   2018-07-08 
19:33:15.000000000 +0200
@@ -394,7 +394,11 @@
 
        // reset python signal flags so child processes can trap signals
        if (up.call_osafterfork) {
+#ifdef HAS_NOT_PyOS_AfterFork_Child
                PyOS_AfterFork();
+#else
+               PyOS_AfterFork_Child();
+#endif
        }
 
        uwsgi_python_reset_random_seed();
@@ -1958,7 +1962,11 @@
        UWSGI_GET_GIL;
        // ensure signals can be used again from python
        if (!up.call_osafterfork)
+#ifdef HAS_NOT_PyOS_AfterFork_Child
                PyOS_AfterFork();
+#else
+               PyOS_AfterFork_Child();
+#endif
        FILE *pyfile = fopen(up.worker_override, "r");
        if (!pyfile) {
                uwsgi_error_open(up.worker_override);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/uwsgi-2.0.17/plugins/python/uwsgi_python.h 
new/uwsgi-2.0.17.1/plugins/python/uwsgi_python.h
--- old/uwsgi-2.0.17/plugins/python/uwsgi_python.h      2018-02-26 
19:34:40.000000000 +0100
+++ new/uwsgi-2.0.17.1/plugins/python/uwsgi_python.h    2018-07-08 
19:33:15.000000000 +0200
@@ -30,6 +30,14 @@
 #define HAS_NO_ERRORS_IN_PyFile_FromFd
 #endif
 
+#if PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION < 7
+#define HAS_NOT_PyOS_AfterFork_Child
+#endif
+
+#if PY_MAJOR_VERSION < 3
+#define HAS_NOT_PyOS_AfterFork_Child
+#endif
+
 #if PY_MAJOR_VERSION > 2
 #define PYTHREE
 #endif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/uwsgi-2.0.17/plugins/router_basicauth/router_basicauth.c 
new/uwsgi-2.0.17.1/plugins/router_basicauth/router_basicauth.c
--- old/uwsgi-2.0.17/plugins/router_basicauth/router_basicauth.c        
2018-02-26 19:34:40.000000000 +0100
+++ new/uwsgi-2.0.17.1/plugins/router_basicauth/router_basicauth.c      
2018-07-08 19:33:15.000000000 +0200
@@ -2,6 +2,7 @@
 
 #ifdef UWSGI_ROUTING
 
+// TODO: Add more crypt_r supported platfroms here
 #if defined(__linux__) && defined(__GLIBC__)
 #include <crypt.h>
 #elif defined(__CYGWIN__)
@@ -68,9 +69,14 @@
 
 #if defined(__linux__) && defined(__GLIBC__)
                struct crypt_data cd;
-               cd.initialized = 0;
+               memset(&cd, 0, sizeof(struct crypt_data));
+    /* work around glibc-2.2.5 bug,
+     * has been fixed at some time in glibc-2.3.X */
+#if (__GLIBC__ == 2) && \
+    (defined(__GLIBC_MINOR__) && __GLIBC_MINOR__ >= 2 && __GLIBC_MINOR__ < 4)
                // we do as nginx here
                cd.current_salt[0] = ~cpwd[0];
+#endif
                crypted = crypt_r( colon+1, cpwd, &cd);
 #else
                if (uwsgi.threads > 1) 
pthread_mutex_lock(&ur_basicauth_crypt_mutex);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/uwsgi-2.0.17/setup.py new/uwsgi-2.0.17.1/setup.py
--- old/uwsgi-2.0.17/setup.py   2018-02-26 19:34:40.000000000 +0100
+++ new/uwsgi-2.0.17.1/setup.py 2018-07-08 19:33:15.000000000 +0200
@@ -120,13 +120,14 @@
     description='The uWSGI server',
     author='Unbit',
     author_email='[email protected]',
-    license='GPL2',
+    license='GPLv2+',
     descriptions='The uWSGI Platform',
     url='https://uwsgi-docs.readthedocs.io/en/latest/',
     py_modules=['uwsgidecorators'],
     distclass=uWSGIDistribution,
     classifiers=[
         'Development Status :: 5 - Production/Stable',
+        'License :: OSI Approved :: GNU General Public License v2 or later 
(GPLv2+)',
         'Programming Language :: Python',
         'Programming Language :: Python :: 2',
         'Programming Language :: Python :: 2.6',
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/uwsgi-2.0.17/uwsgi.gemspec 
new/uwsgi-2.0.17.1/uwsgi.gemspec
--- old/uwsgi-2.0.17/uwsgi.gemspec      2018-02-26 19:34:40.000000000 +0100
+++ new/uwsgi-2.0.17.1/uwsgi.gemspec    2018-07-08 19:33:15.000000000 +0200
@@ -2,7 +2,7 @@
   s.name        = 'uwsgi'
   s.license     = 'GPL-2'
   s.version     = `python -c "import uwsgiconfig as uc; print 
uc.uwsgi_version"`.sub(/-dev-.*/,'')
-  s.date        = '2018-02-26'
+  s.date        = '2018-07-08'
   s.summary     = "uWSGI"
   s.description = "The uWSGI server for Ruby/Rack"
   s.authors     = ["Unbit"]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/uwsgi-2.0.17/uwsgi.h new/uwsgi-2.0.17.1/uwsgi.h
--- old/uwsgi-2.0.17/uwsgi.h    2018-02-26 19:34:40.000000000 +0100
+++ new/uwsgi-2.0.17.1/uwsgi.h  2018-07-08 19:33:15.000000000 +0200
@@ -612,6 +612,8 @@
        int throttle;
 
        char *chdir;
+
+       int max_throttle;
 };
 
 struct uwsgi_logger {
@@ -2831,6 +2833,10 @@
 
        // uWSGI 2.0.17
        int shutdown_sockets;
+
+#ifdef UWSGI_SSL
+       int tlsv1;
+#endif
 };
 
 struct uwsgi_rpc {
@@ -3372,6 +3378,7 @@
 
 void emperor_loop(void);
 char *uwsgi_num2str(int);
+char *uwsgi_float2str(float);
 char *uwsgi_64bit2str(int64_t);
 
 char *magic_sub(char *, size_t, size_t *, char *[]);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/uwsgi-2.0.17/uwsgiconfig.py 
new/uwsgi-2.0.17.1/uwsgiconfig.py
--- old/uwsgi-2.0.17/uwsgiconfig.py     2018-02-26 19:34:40.000000000 +0100
+++ new/uwsgi-2.0.17.1/uwsgiconfig.py   2018-07-08 19:33:15.000000000 +0200
@@ -1,6 +1,6 @@
 # uWSGI build system
 
-uwsgi_version = '2.0.17'
+uwsgi_version = '2.0.17.1'
 
 import os
 import re
@@ -655,7 +655,10 @@
         ulp.write(filename)
         ulp.close()
 
-        self.config.readfp(open_profile(filename))
+        if hasattr(self.config, 'read_file'):
+            self.config.read_file(open_profile(filename))
+        else:
+            self.config.readfp(open_profile(filename))
         self.gcc_list = ['core/utils', 'core/protocol', 'core/socket', 
'core/logging', 'core/master', 'core/master_utils', 'core/emperor',
             'core/notify', 'core/mule', 'core/subscription', 'core/stats', 
'core/sendfile', 'core/async', 'core/master_checks', 'core/fifo',
             'core/offload', 'core/io', 'core/static', 'core/websockets', 
'core/spooler', 'core/snmp', 'core/exceptions', 'core/config',
@@ -774,7 +777,10 @@
             for option in self.config.options('uwsgi'):
                 interpolations[option] = self.get(option, default='')
             iconfig = ConfigParser.ConfigParser(interpolations)
-            iconfig.readfp(open_profile(inherit))
+            if hasattr(self.config, 'read_file'):
+                iconfig.read_file(open_profile(inherit))
+            else:
+                iconfig.readfp(open_profile(inherit))
 
             for opt in iconfig.options('uwsgi'):
                 if not self.config.has_option('uwsgi', opt):


Reply via email to