Commit graph

1658 commits

Author SHA1 Message Date
Andrei Zeliankou
07789a23e9 Tests: options moved to the separate class.
This change is necessary to separate the logic
and prevent possible circular dependency.
2020-12-06 16:01:59 +00:00
Max Romanov
55296e6ff2 Node.js: removing unnecessary warnings.
Warnings changed for debug messages.
2020-11-30 23:30:20 +03:00
Valentin Bartenev
956fce6614 Libunit: improved error logging around initialization env variable. 2020-11-24 16:40:35 +03:00
Valentin Bartenev
35178dbb06 Version bump. 2020-11-24 16:40:28 +03:00
Valentin Bartenev
806a9b2515 Added tag 1.21.0 for changeset f804aaf7eee1 2020-11-19 21:13:19 +03:00
Valentin Bartenev
9e85732e9a Generated Dockerfiles for Unit 1.21.0. 2020-11-19 21:12:30 +03:00
Valentin Bartenev
fa1a3298ef Added version 1.21.0 CHANGES. 2020-11-19 19:59:18 +03:00
Axel Duch
e3af18834d Router: matching regular expressions support. 2020-11-17 15:03:30 +00:00
Max Romanov
2a381a82a6 Libunit: fixing read buffer leakage.
If shared queue is empty, allocated read buffer should be explicitly
released.

Found by Coverity (CID 363943).
The issue was introduced in f5ba5973a0a3.
2020-11-19 13:49:12 +03:00
Andrei Zeliankou
18ddb74772 Tests: added tests for a "discard_unsafe_fields" option. 2020-11-19 05:21:48 +00:00
Andrei Zeliankou
e154d7a3a2 Tests: style. 2020-11-19 05:21:22 +00:00
Max Romanov
25219a7ece Python: improving ASGI http send message processing. 2020-11-18 22:33:53 +03:00
Max Romanov
66bb41e8bb Libunit: fixing read buffer allocations on exit. 2020-11-18 22:33:53 +03:00
Max Romanov
6c3c83561a Libunit: closing active requests on quit. 2020-11-18 22:33:53 +03:00
Max Romanov
300347a5cf Libunit: making minor tweaks.
Removing unnecessary context operations from shared queue processing loop.
Initializing temporary queues only when required.
2020-11-18 22:33:53 +03:00
Max Romanov
8132e1f700 Go: removing C proxy functions and re-using goroutines. 2020-11-18 22:33:53 +03:00
Max Romanov
d26afcb481 Libunit: fixing racing condition in request struct recycling.
The issue occurred under highly concurrent request load in Go applications.
Such applications are multi-threaded but use a single libunit context; any
thread-safe code in the libunit context is only required for Go applications.

As a result of improper request state reset, the recycled request structure was
recovered in the released state, so further operations with this request
resulted in 'response already sent' warnings.  However, the actual response was
never delivered to the router and the client.
2020-11-18 22:33:53 +03:00
Max Romanov
0ec69aa46e Libunit: fixing racing condition for port add / state change.
The issue only occurred in Go applications because "port_send" is overloaded
only in Go.  To reproduce it, send multiple concurrent requests to the
application after it has initialised.  The warning message "[unit] [go] port
NNN:dd not found" is the first visible aspect of the issue; the second and more
valuable one is a closed connection, an error response, or a hanging response to
some requests.

When the application starts, it is unaware of the router's worker thread ports,
so it requests the ports from the router after receiving requests from the
corresponding router worker threads.  When multiple requests are processed
simultaneously, the router port may be required by several requests, so request
processing starts only after the application receives the required port
information.  The port should be added to the Go port repository after its
'ready' flag is updated.  Otherwise, Unit may start processing some requests and
use the port before it is in the repository.

The issue was introduced in changeset 78836321a126.
2020-11-18 22:33:53 +03:00
Max Romanov
8340ca0b9c Libunit: improving logging consistency.
Debug logging depends on macros defined in nxt_auto_config.h.
2020-11-18 22:33:53 +03:00
Valentin Bartenev
fb80502513 HTTP parser: allowed more characters in header field names.
Previously, all requests that contained in header field names characters other
than alphanumeric, or "-", or "_" were rejected with a 400 "Bad Request" error
response.

Now, the parser allows the same set of characters as specified in RFC 7230,
including: "!", "#", "$", "%", "&", "'", "*", "+", ".", "^", "`", "|", and "~".
Header field names that contain only these characters are considered valid.

Also, there's a new option introduced: "discard_unsafe_fields".  It accepts
boolean value and it is set to "true" by default.

When this option is "true", all header field names that contain characters
in valid range, but other than alphanumeric or "-" are skipped during parsing.
When the option is "false", these header fields aren't skipped.

Requests with non-valid characters in header field names according to
RFC 7230 are rejected regardless of "discard_unsafe_fields" setting.

This closes #422 issue on GitHub.
2020-11-17 16:50:06 +03:00
Tiago Natel de Moura
e7d66acda7 Isolation: added option to disable "procfs" mount.
Now users can disable the default procfs mount point
in the rootfs.

 {
     "isolation": {
         "automount": {
             "procfs": false
         }
     }
 }
2020-11-16 17:56:12 +00:00
Tiago Natel de Moura
bbc29df8fe Tests: tmpfs automount. 2020-11-16 17:22:10 +00:00
Max Romanov
567f0a7b30 Tests: fixing tests interrupt in terminal.
KeyboardInterrupt re-raised.
2020-11-16 20:37:01 +03:00
Max Romanov
6d2b60ff3e Tests: making available versions unique. 2020-11-16 20:36:54 +03:00
Tiago Natel de Moura
3837d28f9b Isolation: added option to disable tmpfs mount.
Now users can disable the default tmpfs mount point
in the rootfs.

  {
      "isolation": {
          "automount": {
              "tmpfs": false
          }
      }
  }
2020-11-13 10:48:32 +00:00
Tiago Natel de Moura
d6829cc93b Tests: removed test case that reuses rootfs path.
Different applications cannot reuse the same rootfs path
if not using namespaces because of globally visible
builtin mount points.
2020-11-12 12:04:51 +00:00
Andrei Zeliankou
3278253d51 Tests: added a test for "body_buffer_size" option. 2020-11-12 00:07:08 +00:00
Andrei Zeliankou
a0ee50826a Tests: added a test for fastcgi_finish_request() function. 2020-11-11 14:24:40 +00:00
Valentin Bartenev
e30db59168 PHP: implementation of the fastcgi_finish_request() function.
This closes #219 issue on GitHub.
2020-11-11 12:09:54 +03:00
Valentin Bartenev
cb28b41311 PHP: prevention of consuming unread request body on finalization.
The php_request_shutdown() function calls sapi_deactivate() that tries to read
request body into a dummy buffer.  In our case it's just waste of CPU cycles.

This change is also required for the following implementation of the
fastcgi_finish_request() function, where the request context can be
cleared by the time of finalization.
2020-11-11 12:09:49 +03:00
Max Romanov
896d8e8bfb Fixing multi-buffer body send to application.
Application shared queue only capable to pass one shared memory buffer.
The rest buffers in chain needs to be send directly to application in response
to REQ_HEADERS_AC message.

The issue can be reproduced for configurations where 'body_buffer_size' is
greater than memory segment size (10 Mb).  Requests with body size greater
than 10 Mb are just `stuck` e.g. not passed to application awaiting for more
data from router.

The bug was introduced in 1d84b9e4b459 (v1.19.0).
2020-11-10 22:27:08 +03:00
Max Romanov
5fd2933d2e Python: supporting ASGI legacy protocol.
Introducing manual protocol selection for 'universal' apps and frameworks.
2020-11-10 22:27:08 +03:00
Max Romanov
4ca9ba3408 Java: fixing isolation mounts for Alpine musl.
Thanks to @wujjpp.

This closes #490 PR on GitHub.
2020-11-10 22:27:08 +03:00
Max Romanov
a8a9d80f8d Tests: supporting instant app parameters in load(). 2020-11-10 22:27:08 +03:00
Andrei Belov
b2771702fb Packages: added Ubuntu 20.10 "groovy" support. 2020-11-09 16:12:59 +03:00
Max Romanov
702e7bcc89 Java: fixing ClassGraph deprecated API call.
The issue (deprecated API warning) introduced by ClassGraph upgrade
in ccd5c695b739 commit.
2020-11-06 20:41:56 +03:00
Max Romanov
78599f0d3f Tests: fixing racing condition in ASGI threads test.
ASGI threads read all the requests from the queue before start processing it.
This why test need to wait a little to let the ASGI thread start request
processing and block.  In virtual environment any thread or process may
be delayed and only method to avoid racing is a reasonable sleep increase.
2020-11-06 16:45:03 +03:00
Max Romanov
2220b8258f Ruby: error checking during thread creation.
Application terminates in case of thread creation failure.
2020-11-05 17:02:55 +03:00
Max Romanov
fc9a012ceb Tests: added Perl threading tests. 2020-11-05 16:11:01 +03:00
Max Romanov
d321d454f9 Perl: request processing in multiple threads.
This closes #486 issue on GitHub.
2020-11-05 16:10:59 +03:00
Max Romanov
e17e73edda Tests: added Ruby threading tests. 2020-11-05 12:45:26 +03:00
Max Romanov
b6475df79c Ruby: request processing in multiple threads.
This closes #482 issue on GitHub.
2020-11-05 12:45:10 +03:00
Max Romanov
9f8b746e77 Ruby: reusing static constant references to string objects.
This shall save a couple of CPU cycles in request processing.
2020-11-05 12:45:08 +03:00
Max Romanov
28f1eb55e7 Tests: added Java threading tests. 2020-11-05 00:06:13 +03:00
Max Romanov
29db46c52b Java: request processing in multiple threads.
This closes #458 issue on GitHub.
2020-11-05 00:06:10 +03:00
Max Romanov
f27953af61 Tests: added Python threading tests. 2020-11-05 00:05:02 +03:00
Max Romanov
8e37b1cbf5 Python: fixing some arguments reference counting. 2020-11-05 00:05:00 +03:00
Max Romanov
8dcb0b9987 Python: request processing in multiple threads.
This closes #459 issue on GitHub.
2020-11-05 00:04:59 +03:00
Max Romanov
4225361f0e Python: introducting macro to simplify minor version check. 2020-11-05 00:04:58 +03:00
Andrei Zeliankou
a29d970f10 Tests: disabled detailed output by default. 2020-11-03 01:32:40 +00:00