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):
