Commit Graph

2282 Commits

Author SHA1 Message Date
Andrei Zeliankou 4f94df6a71 Tests: print_log_on_assert() decorator introduced. 2021-07-06 12:22:10 +01:00
Andrei Zeliankou bc84992075 Tests: address configuration tests reworked. 2021-07-03 19:15:04 +01:00
Oisin Canty 8c83652c2a Tests: Ruby hooks. 2021-07-02 13:00:57 +00:00
Oisin Canty 6c14d5d7b1 Tests: run Ruby applications inside temporary directory. 2021-07-02 13:00:04 +00:00
Oisin Canty 655e321075 Ruby: process and thread lifecycle hooks.
This feature allows one to specify blocks of code that are called when certain
lifecycle events occur.  A user configures a "hooks" property on the app
configuration that points to a script.  This script will be evaluated on boot
and should contain blocks of code that will be called on specific events.

An example of configuration:

{
    "type": "ruby",
    "processes": 2,
    "threads": 2,
    "user": "vagrant",
    "group": "vagrant",
    "script": "config.ru",
    "hooks": "hooks.rb",
    "working_directory": "/home/vagrant/unit/rbhooks",
    "environment": {
        "GEM_HOME": "/home/vagrant/.ruby"
    }
}

An example of a valid "hooks.rb" file follows:

File.write("./hooks.#{Process.pid}", "hooks evaluated")

on_worker_boot do
    File.write("./worker_boot.#{Process.pid}", "worker booted")
end

on_thread_boot do
    File.write("./thread_boot.#{Process.pid}.#{Thread.current.object_id}",
               "thread booted")
end

on_thread_shutdown do
    File.write("./thread_shutdown.#{Process.pid}.#{Thread.current.object_id}",
               "thread shutdown")
end

on_worker_shutdown do
    File.write("./worker_shutdown.#{Process.pid}", "worker shutdown")
end

This closes issue #535 on GitHub.
2021-07-02 12:57:55 +00:00
Oisin Canty 7d2bc04e39 Fixing crash during IPv6 text address generation.
When the textual representation of an IPv6 nxt_sockaddr_t was being
generated, a crash would occur if the address had a full IPv6 form:

f607:7403:1e4b:6c66:33b2:843f:2517:da27

This was caused by a variable that tracks the location of a
collapsed group ("::") that was not set to a sane default.  When
the address was generated, a group would be inserted when
it was not necessary, thus causing an overflow.

This closes #481 issue on GitHub.
2021-07-02 10:55:13 +00:00
Max Romanov 54bf3e1912 Deduplicating code for closing fds in nxt_port_send_msg_t. 2021-07-01 16:23:56 +03:00
Max Romanov 2ac9c627aa Fixing memory and descriptor leakage in case of port send failure.
In rare cases, when the destination process had finished running but no
notification of this was received yet, send could fail with an error, and the
send message structure with file descriptors could leak.

The leakage was periodically reproduced by respawn tests on FreeBSD 12.
2021-07-01 16:23:51 +03:00
Max Romanov 210c8bbd81 Tests: fixing racing condition in respawn tests.
A race may occur between the router process restart and the main process
sending a notification to the running controller.  For example, a test script
detects the new process and starts performing a smoke test, but the controller
has not yet received the 'remove PID' notification, so the connection to the
router is broken and any attempt to update the configuration will cause an
error.

The solution is to perform several attempts to reconfigure Unit with a short
delay between failures.
2021-07-01 16:22:08 +03:00
Oisin Canty 830729a6c5 Ruby: improved logging of exceptions without backtraces.
If an exception was raised with a backtrace of zero length, the
nxt_ruby_exception_log() routine would return without logging the
exception class and message.  This commit fixes the issue.
2021-07-01 11:16:43 +00:00
Max Romanov cfba69781a Fixing multiple TLS-enabled listeners initialization.
Because of the incorrect 'last' field assignment, multiple listeners with
a TLS certificate did not initialize properly, which caused a router crash
while establishing a connection.

Test with multiple TLS listeners added.

The issue was introduced in the c548e46fe516 commit.

This closes #561 issue on GitHub.
2021-07-01 13:56:40 +03:00
Zhidao HONG c16123e749 Router: split nxt_http_return_conf_t from nxt_http_action_t.
No functional changes.
2021-05-24 16:15:42 +08:00
Andrei Zeliankou b86891c4ef Tests: renamed share to static.
Also minor style changes.
2021-06-28 22:05:40 +01:00
Andrei Zeliankou 72420358be Tests: chroot test with permissions skipped under root. 2021-06-24 04:01:15 +01:00
Max Romanov 1e3f7808b1 Node.js: improving and test packaging.
The patch removes the "files" section from package.json to avoid future issues
with missing files.  For package testing purposes, 'npm pack' is used instead
of plain 'tar' to simulate packaging more accurately.
2021-06-15 10:35:15 +03:00
Max Romanov fd3558456e Node.js: packaging new loader.js and loader.mjs.
The files loader.js and loader.mjs (introduced in f85b85094541 and 3c551b9721df)
were added to the packaged files list.
2021-06-02 16:14:22 +03:00
Valentin Bartenev 38ac7de61e Version bump. 2021-05-28 18:16:23 +03:00
Valentin Bartenev d06e55dfa3 Unit 1.24.0 release. 2021-05-27 16:59:54 +03:00
Valentin Bartenev 25d8e102b0 Generated Dockerfiles for Unit 1.24.0. 2021-05-27 16:07:15 +03:00
Valentin Bartenev 340955a75f Added version 1.24.0 CHANGES. 2021-05-27 16:06:01 +03:00
Valentin Bartenev ff15f25839 Reordered changes for 1.24.0 by significance (subjective). 2021-05-27 16:05:42 +03:00
Artem Konev 3b0fa832a3 Grammar fixes and improvements in changes.xml. 2021-05-27 13:53:58 +01:00
Andrei Zeliankou f91fe4ce9e Tests: added tests for TLS "conf_commands" option. 2021-05-27 13:30:51 +01:00
Andrei Belov e00ad18d80 Packages: added Ubuntu 21.04 "hirsute" support. 2021-05-27 13:12:52 +03:00
Andrei Zeliankou 753ce145f7 Tests: added TLS test without close notify. 2021-05-26 21:47:12 +01:00
Andrey Suvorov 3f7ccf142f Enabling SSL_CTX configuration by using SSL_CONF_cmd().
To perform various configuration operations on SSL_CTX, OpenSSL provides
SSL_CONF_cmd().  Specifically, to configure ciphers for a listener,
"CipherString" and "Ciphersuites" file commands are used:
https://www.openssl.org/docs/man1.1.1/man3/SSL_CONF_cmd.html


This feature can be configured in the "tls/conf_commands" section.
2021-05-26 11:19:47 -07:00
Andrey Suvorov 3efffddd95 Fixing crash during TLS connection shutdown.
A crash was caused by an incorrect timer handler nxt_h1p_idle_timeout() if
SSL_shutdown() returned SSL_ERROR_WANT_READ/SSL_ERROR_WANT_WRITE.

The flag SSL_RECEIVED_SHUTDOWN is used to avoid getting SSL_ERROR_WANT_READ, so
the server won't wait for a close notification from a client.

For SSL_ERROR_WANT_WRITE, a correct timer handler is set up.
2021-05-26 11:11:58 -07:00
Oisin Canty d67a0c8711 Static: handled unknown MIME types when MIME-filtering active. 2021-05-26 16:48:11 +00:00
Oisin Canty 81e31872e3 MIME: added PHP. 2021-05-26 16:48:05 +00:00
Max Romanov 24905c1a00 Fixing racing condition on listen socket close in router (v2).
This patch fixes a possible race between the nxt_router_conf_wait() and
nxt_router_listen_socket_release() function calls and improves the 7f1b2eaa2d58
commit fix.
2021-05-25 18:01:00 +03:00
Max Romanov 155e22da05 Go: fixing tests for Go 1.16.
In Go 1.16, the module-aware mode is enabled by default; to fall back to
previous behavior, the GO111MODULE environment variable should be set to
'auto'.

Details: https://golang.org/doc/go1.16
2021-05-25 18:00:59 +03:00
Oisin Canty 2fe76afaa6 Configuration: generalized application "targets" validation. 2021-05-25 13:21:29 +00:00
Andrei Zeliankou 39c0fda24c Tests: added additional check in tests with timeouts. 2021-05-24 22:28:23 +01:00
Andrei Zeliankou 1154ede862 Tests: test_settings_send_timeout improved.
Data length adjusts depending on socket buffer size when it's possible.
2021-05-24 05:26:15 +01:00
Oisin Canty c160ea11e4 Node.js: renamed "require_shim" to "loader". 2021-05-24 09:01:42 +00:00
Andrei Zeliankou d643900237 Tests: minor fixes. 2021-05-24 04:33:42 +01:00
Valentin Bartenev 539551c89f PHP: adopted "file_handle" to Zend API changes in 8.1.0-dev.
This fixes building module with the development version of PHP after the change:
https://github.com/php/php-src/commit/c732ab400af92c54eee47c487a56009f1d79dd5d
2021-05-21 14:41:35 +03:00
Oisin Canty e50bb120e2 Tests: Python targets. 2021-05-20 13:03:12 +00:00
Oisin Canty f60389a782 Python: support for multiple targets. 2021-05-20 13:02:45 +00:00
Andrei Zeliankou 2f0cca2e2b Tests: added test to check port release. 2021-05-18 16:35:54 +01:00
Oisin Canty ead6ed999a Ruby: changing deprecated rb_cData to rb_cObject.
Ruby 3.0 deprecated rb_cData with the intention to remove it in release 3.1.
This commit changes references of rb_cData to rb_cObject.  This was done so we
can support distributions that package Ruby 3.0, such as Fedora 34.

We also need to call rb_undef_alloc_func because we're no longer deriving from
rb_cData.  This prevents unnecessary allocations.

See:
https://docs.ruby-lang.org/en/3.0.0/doc/extension_rdoc.html

"It is recommended that klass derives from a special class called Data
(rb_cData) but not from Object or other ordinal classes.  If it doesn't,
you have to call rb_undef_alloc_func(klass)."
2021-05-18 10:14:43 +00:00
Andrey Suvorov 19dfeba86b Fixing a crash after applying the wrong TLS configuration.
When an invalid TLS configuration is applied (such as the conf_commands
feature), nxt_cert_store_get() creates a buffer to send a certificate request
to the main process and adds its default completion handler to an asynchronous
queue to free the allocated buffer.  However, if configuration fails,
nxt_router_conf_error() removes the memory pool used to allocate the buffer,
causing a crash when the completion handler is dispatched.


Assertion "src/nxt_buf.c:208 assertion failed: data == b->parent" is triggered
when is NXT_DEBUG enabled in the configure script.


This patch uses a reference counter to retain the memory pool and redefines the
completion handler to free the buffer before releasing the memory pool.
2021-05-17 14:28:38 -07:00
Andrei Zeliankou 1198118b3b Tests: fixed incorrect "--restart" mode performing. 2021-05-17 15:39:15 +01:00
Max Romanov c216f26d30 Fixing racing condition on listen socket close in router.
Listen socket is actually closed in the instant timer handler.  This patch moves
the "configuration has been applied" notification to the timer handler to avoid
a situation when the user gets the response from the controller, but the listen
socket is still open in the router.
2021-05-17 17:34:15 +03:00
Andrei Zeliankou 25603eae9f Tests: added test for TLS with IP in SAN. 2021-05-12 14:37:25 +01:00
Oisin Canty a0c083af20 Node.js: a shim for overriding "http" and "websocket" modules.
Also added stubs for Server.address()
This was done to prevent crashes in some popular frameworks like express

Supports both CommonJS and the new ES Modules system syntax e.g:

app.js:
const http = require('http')

app.mjs:
import http from "http"

Usage on Node 14.16.x and higher:
{
    "type": "external",
    "processes": {"spare": 0},
    "working_directory": '/project',
    "executable": "/usr/bin/env",
    "arguments": [
        "node",
        "--loader",
        "unit-http/require_shim.mjs"
        "--require",
        "unit-http/require_shim",
        "app.js"
    ]
}

Usage on Node 14.15.x and lower:
{
    "type": "external",
    "processes": {"spare": 0},
    "working_directory": '/project',
    "executable": "/usr/bin/env",
    "arguments": [
        "node",
        "--require",
        "unit-http/require_shim",
        "app.js"
    ]
}
2021-05-12 09:26:55 +00:00
Andrei Zeliankou 07c6bf165d Tests: temporary dir removed after tests execution. 2021-05-11 15:30:12 +01:00
Andrei Zeliankou a17f7e03d4 Tests: added test for TLS with empty Subject field. 2021-05-07 17:42:48 +01:00
Andrei Zeliankou b9e8d8073c Tests: PHP test with getting variable before the script is loaded. 2021-05-07 16:55:42 +01:00
Valentin Bartenev b0e32bc015 PHP: forced initialization of $_SERVER in fastcgi_finish_request().
The "auto_globals_jit" PHP option postponed the initialization of the $_SERVER
global variable until the script using it had been loaded (e. g. via the
"include" expression).  As a result, nxt_php_register_variables() could be
called after fastcgi_finish_request() had finished the request and nulled
ctx->req, which thus caused a segmentation fault.
2021-05-07 07:46:25 +03:00