aboutsummaryrefslogtreecommitdiff
path: root/src
Commit message (Collapse)AuthorAge
...
* Version bump.Maxim Dounin2021-04-05
|
* Fixed handling of already closed connections.Maxim Dounin2021-03-28
| | | | | | | | | | | | In limit_req, auth_delay, and upstream code to check for broken connections, tests for possible connection close by the client did not work if the connection was already closed when relevant event handler was set. This happened because there were no additional events in case of edge-triggered event methods, and read events were disabled in case of level-triggered ones. Fix is to explicitly post a read event if the c->read->ready flag is set.
* Upstream: fixed broken connection check with eventport.Maxim Dounin2021-03-28
| | | | | For connection close to be reported with eventport on Solaris, ngx_handle_read_event() needs to be called.
* Upstream: fixed non-buffered proxying with eventport.Maxim Dounin2021-03-28
| | | | | | | | | | For new data to be reported with eventport on Solaris, ngx_handle_read_event() needs to be called after reading response headers. To do so, ngx_http_upstream_process_non_buffered_upstream() now called unconditionally if there are no prepread data. This won't cause any read() syscalls as long as upstream connection is not ready for reading (c->read->ready is not set), but will result in proper handling of all events.
* Resolver: added missing event handling after reading.Maxim Dounin2021-03-28
| | | | | | | | | | | If we need to be notified about further events, ngx_handle_read_event() needs to be called after a read event is processed. Without this, an event can be removed from the kernel and won't be reported again, notably when using oneshot event methods, such as eventport on Solaris. While here, error handling is also added, similar to one present in ngx_resolver_tcp_read(). This is not expected to make a difference and mostly added for consistency.
* Events: fixed "port_dissociate() failed" alerts with eventport.Maxim Dounin2021-03-28
| | | | | | | | | | | | | If an attempt is made to delete an event which was already reported, port_dissociate() returns an error. Fix is avoid doing anything if ev->active is not set. Possible alternative approach would be to avoid calling ngx_del_event() at all if ev->active is not set. This approach, however, will require something else to re-add the other event of the connection, since both read and write events are dissociated if an event is reported on a file descriptor. Currently ngx_eventport_del_event() re-associates write event if called to delete read event, and vice versa.
* Events: fixed expiration of timers in the past.Maxim Dounin2021-03-26
| | | | | | | | | | | | | | | | | | | | If, at the start of an event loop iteration, there are any timers in the past (including timers expiring now), the ngx_process_events() function is called with zero timeout, and returns immediately even if there are no events. But the following code only calls ngx_event_expire_timers() if time actually changed, so this results in nginx spinning in the event loop till current time changes. While such timers are not expected to appear under normal conditions, as all such timers should be removed on previous event loop iterations, they still can appear due to bugs, zero timeouts set in the configuration (if this is not explicitly handled by the code), or due to external time changes on systems without clock_gettime(CLOCK_MONOTONIC). Fix is to call ngx_event_expire_timers() unconditionally. Calling it on each event loop iteration is not expected to be significant from performance point of view, especially compared to a syscall in ngx_process_events().
* HTTP/2: improved handling of "keepalive_timeout 0".Maxim Dounin2021-03-26
| | | | | | | | Without explicit handling, a zero timer was actually added, leading to multiple unneeded syscalls. Further, sending GOAWAY frame early might be beneficial for clients. Reported by Sergey Kandaurov.
* Cancel keepalive and lingering close on EOF better (ticket #2145).Sergey Kandaurov2021-03-24
| | | | | | | | | | | Unlike in 75e908236701, which added the logic to ngx_http_finalize_request(), this change moves it to a more generic routine ngx_http_finalize_connection() to cover cases when a request is finalized with NGX_DONE. In particular, this fixes unwanted connection transition into the keepalive state after receiving EOF while discarding request body. With edge-triggered event methods that means the connection will last for extra seconds as set in the keepalive_timeout directive.
* gRPC: fixed handling of padding on DATA frames.Maxim Dounin2021-03-23
| | | | | | | | | | | | | | The response size check introduced in 39501ce97e29 did not take into account possible padding on DATA frames, resulting in incorrect "upstream sent response body larger than indicated content length" errors if upstream server used padding in responses with known length. Fix is to check the actual size of response buffers produced by the code, similarly to how it is done in other protocols, instead of checking the size of DATA frames. Reported at: http://mailman.nginx.org/pipermail/nginx-devel/2021-March/013907.html
* Removed "ch" argument from ngx_pass_open_channel().Ruslan Ermilov2021-03-11
|
* Mail: fixed build without SSL.Maxim Dounin2021-03-11
| | | | | | Broken by d84f13618277 and 12ea1de7d87c (1.19.8). Reported by Sergey Osokin.
* Version bump.Maxim Dounin2021-03-11
|
* Mail: sending of the PROXY protocol to backends.Maxim Dounin2021-03-05
| | | | | | Activated with the "proxy_protocol" directive. Can be combined with "listen ... proxy_protocol;" and "set_real_ip_from ...;" to pass client address provided to nginx in the PROXY protocol header.
* Mail: realip module.Maxim Dounin2021-03-05
| | | | | When configured with the "set_real_ip_from", it can set client's IP address as visible in logs to the one obtained via the PROXY protocol.
* Mail: parsing of the PROXY protocol from clients.Maxim Dounin2021-03-05
| | | | | | | Activated with the "proxy_protocol" parameter of the "listen" directive. Obtained information is passed to the auth_http script in Proxy-Protocol-Addr, Proxy-Protocol-Port, Proxy-Protocol-Server-Addr, and Proxy-Protocol-Server-Port headers.
* Mail: made auth http creating request easier to extend.Maxim Dounin2021-03-05
|
* Mail: fixed log action after SSL handshake.Maxim Dounin2021-03-05
|
* Mail: postponed session initialization under accept mutex.Maxim Dounin2021-03-05
| | | | | | Similarly to 40e8ce405859 in the stream module, this reduces the time accept mutex is held. This also simplifies following changes to introduce PROXY protocol support.
* Mail: added missing event handling after reading data.Maxim Dounin2021-03-05
| | | | | | | | | | | | | If we need to be notified about further events, ngx_handle_read_event() needs to be called after a read event is processed. Without this, an event can be removed from the kernel and won't be reported again, notably when using oneshot event methods, such as eventport on Solaris. For consistency, existing ngx_handle_read_event() call removed from ngx_mail_read_command(), as this call only covers one of the code paths where ngx_mail_read_command() returns NGX_AGAIN. Instead, appropriate processing added to the callers, covering all code paths where NGX_AGAIN is returned.
* Mail: added missing event handling after blocking events.Maxim Dounin2021-03-05
| | | | | | | As long as a read event is blocked (ignored), ngx_handle_read_event() needs to be called to make sure no further notifications will be triggered when using level-triggered event methods, such as select() or poll().
* Events: fixed eventport handling in ngx_handle_read_event().Maxim Dounin2021-03-05
| | | | | | | | | | The "!rev->ready" test seems to be a typo, introduced in the original commit (719:f30b1a75fd3b). The ngx_handle_write_event() code properly tests for "rev->ready" instead. Due to this typo, read events might be unexpectedly removed during proxying after an event on the other part of the proxied connection. Catched by mail proxying tests.
* SSL: fixed build by Sun C with old OpenSSL versions.Maxim Dounin2021-03-05
| | | | | Sun C complains about "statement not reached" if a "return" is followed by additional statements.
* Proxy: variables support in "proxy_cookie_flags" flags.Ruslan Ermilov2021-03-02
|
* Introduced strerrordesc_np() support.Maxim Dounin2021-03-01
| | | | | | The strerrordesc_np() function, introduced in glibc 2.32, provides an async-signal-safe way to obtain error messages. This makes it possible to avoid copying error messages.
* Improved maximum errno detection.Maxim Dounin2021-03-01
| | | | | | | | | | | | | | | | Previously, systems without sys_nerr (or _sys_nerr) were handled with an assumption that errors start at 0 and continuous. This is, however, not something POSIX requires, and not true on some platforms. Notably, on Linux, where sys_nerr is no longer available for newly linked binaries starting with glibc 2.32, there are gaps in error list, which used to stop us from properly detecting maximum errno. Further, on GNU/Hurd errors start at 0x40000001. With this change, maximum errno detection is moved to the runtime code, now able to ignore gaps, and also detects the first error if needed. This fixes observed "Unknown error" messages as seen on Linux with glibc 2.32 and on GNU/Hurd.
* HTTP/2: client_header_timeout before first request (ticket #2142).Maxim Dounin2021-03-01
| | | | | | | | | | With this change, behaviour of HTTP/2 becomes even closer to HTTP/1.x, and client_header_timeout instead of keepalive_timeout is used before the first request is received. This fixes HTTP/2 connections being closed even before the first request if "keepalive_timeout 0;" was used in the configuration; the problem appeared in f790816a0e87 (1.19.7).
* SSL: added check for debugging.Maxim Dounin2021-02-20
| | | | | If debugging is not enabled, there is no need to do extra work in ngx_ssl_verify_callback() and ngx_ssl_handshake_log().
* SSL: added missed error reporting during variables evaluation.Maxim Dounin2021-02-20
|
* SSL: X509_NAME_oneline() error handling.Maxim Dounin2021-02-20
|
* Version bump.Ruslan Ermilov2021-02-20
|
* HTTP/2: removed http2_max_field_size and http2_max_header_size.Maxim Dounin2021-02-11
| | | | | Instead, size of one large_client_header_buffers buffer and all large client header buffers are used.
* HTTP/2: keepalive_timeout now armed once between requests.Maxim Dounin2021-02-11
| | | | | | | | | | | | | Previously, PINGs and other frames extended possible keepalive time, making it possible to keep an open HTTP/2 connection for a long time. Now the connection is always closed as long as keepalive_timeout expires, similarly to how it happens in HTTP/1.x. Note that as a part of this change, incomplete frames are no longer trigger a separate timeout, so http2_recv_timeout (replaced by client_header_timeout in previous patches) is essentially cancelled. The client_header_timeout is, however, used for SSL handshake and while reading HEADERS frames.
* HTTP/2: removed http2_idle_timeout and http2_max_requests.Maxim Dounin2021-02-11
| | | | | | | | | | | | | | | Instead, keepalive_timeout and keepalive_requests are now used. This is expected to simplify HTTP/2 code and usage. This also matches directives used by upstream module for all protocols. In case of default settings, this effectively changes maximum number of requests per connection from 1000 to 100. This looks acceptable, especially given that HTTP/2 code now properly supports lingering close. Further, this changes default keepalive timeout in HTTP/2 from 300 seconds to 75 seconds. This also looks acceptable, and larger than PING interval used by Firefox (network.http.spdy.ping-threshold defaults to 58s), the only browser to use PINGs.
* HTTP/2: removed http2_recv_timeout.Maxim Dounin2021-02-11
| | | | | | | Instead, the client_header_timeout is now used for HTTP/2 reading. Further, the timeout is changed to be set once till no further data left to read, similarly to how client_header_timeout is used in other places.
* HTTP/2: removed SPDY directives handling.Maxim Dounin2021-02-11
| | | | | The spdy_* directives are not available since introduction of HTTP/2 module in nginx 1.9.5 more than five years ago.
* HTTP/2: fixed reusing connections with active requests.Maxim Dounin2021-02-11
| | | | | | | | | | | | | | | New connections are marked reusable by ngx_http_init_connection() if there are no data available for reading. As a result, if SSL is not used, ngx_http_v2_init() might be called when the connection is marked reusable. If a HEADERS frame is immediately available for reading, this resulted in connection being preserved in reusable state with an active request, and possibly closed later as if during worker shutdown (that is, after all active requests were finalized). Fix is to explicitly mark connections non-reusable in ngx_http_v2_init() instead of (incorrectly) assuming they are already non-reusable. Found by Sergey Kandaurov.
* HTTP/2: reuse of connections with incomplete frames.Maxim Dounin2021-02-11
| | | | Prodded by Taewoo Kim.
* Additional connections reuse.Maxim Dounin2021-02-11
| | | | | | | | | If ngx_drain_connections() fails to immediately reuse any connections and there are no free connections, it now additionally tries to reuse a connection again. This helps to provide at least one free connection in case of HTTP/2 with lingering close, where merely trying to reuse a connection once does not free it, but makes it reusable again, waiting for lingering close.
* Reuse of connections in lingering close.Maxim Dounin2021-02-11
| | | | | | | | | | | | This is particularly important in HTTP/2, where keepalive connections are closed with lingering. Before the patch, reusing a keepalive HTTP/2 connection resulted in the connection waiting for lingering close to remain in the reusable connections queue, preventing ngx_drain_connections() from closing additional connections. The patch fixes it by marking the connection reusable again, and so moving it in the reusable connections queue. Further, it makes actually possible to reuse such connections if needed.
* HTTP/2: lingering close changed to handle NGX_AGAIN.Ruslan Ermilov2021-02-01
| | | | | | | This part somehow slipped away from c5840ca2063d. While it is not expected to be needed in case of lingering close, it is good to keep it for correctness (see 2b5528023f6b).
* Clean up trailers in ngx_http_clean_header() as well.Sergey Kandaurov2021-01-26
| | | | | The function has not been updated with introduction of trailers support in 7034:1b068a4e82d8 (1.13.2).
* Core: removed post_accept_timeout.Maxim Dounin2021-01-19
| | | | | | | | | | Keeping post_accept_timeout in ngx_listening_t is no longer needed since we've switched to 1 second timeout for deferred accept in 5541:fdb67cfc957d. Further, using it in HTTP code can result in client_header_timeout being used from an incorrect server block, notably if address-specific virtual servers are used along with a wildcard listening socket, or if we've switched to a different server block based on SNI in SSL handshake.
* Removed incorrect optimization of HEAD requests.Maxim Dounin2021-01-19
| | | | | | | | | | | | | | | | | | The stub status module and ngx_http_send_response() (used by the empty gif module and the "return" directive) incorrectly assumed that responding to HEAD requests always results in r->header_only being set. This is not true, and results in incorrect behaviour, for example, in the following configuration: location / { image_filter size; return 200 test; } Fix is to remove this incorrect micro-optimization from both stub status module and ngx_http_send_response(). Reported by Chris Newton.
* Upstream: fixed zero size buf alerts on extra data (ticket #2117).Maxim Dounin2021-01-12
| | | | | | | | | | | | | | | | | | After 7675:9afa45068b8f and 7678:bffcc5af1d72 (1.19.1), during non-buffered simple proxying, responses with extra data might result in zero size buffers being generated and "zero size buf" alerts in writer. This bug is similar to the one with FastCGI proxying fixed in 7689:da8d758aabeb. In non-buffered mode, normally the filter function is not called if u->length is already 0, since u->length is checked after each call of the filter function. There is a case when this can happen though: if the response length is 0, and there are pre-read response body data left after reading response headers. As such, a check for u->length is needed at the start of non-buffered filter functions, similar to the one for p->length present in buffered filter functions. Appropriate checks added to the existing non-buffered copy filters in the upstream (used by scgi and uwsgi proxying) and proxy modules.
* Version bump.Maxim Dounin2021-01-11
|
* Fixed double close of non-regular files in flv and mp4.Maxim Dounin2020-12-11
| | | | | | | | | | | | | | With introduction of open_file_cache in 1454:f497ed7682a7, opening a file with ngx_open_cached_file() automatically adds a cleanup handler to close the file. As such, calling ngx_close_file() directly for non-regular files is no longer needed and will result in duplicate close() call. In 1454:f497ed7682a7 ngx_close_file() call for non-regular files was removed in the static module, but wasn't in the flv module. And the resulting incorrect code was later copied to the mp4 module. Fix is to remove the ngx_close_file() call from both modules. Reported by Chris Newton.
* Removed extra allocation for r->uri.Maxim Dounin2020-12-10
| | | | | | | The ngx_http_parse_complex_uri() function cannot make URI longer and does not null-terminate URI, so there is no need to allocate an extra byte. This allocation appears to be a leftover from changes in 461:a88a3e4e158f (0.1.5), where null-termination of r->uri and many other strings was removed.
* Fixed parsing of absolute URIs with empty path (ticket #2079).Maxim Dounin2020-12-10
| | | | | | | | | | | | | | | When the request line contains request-target in the absolute-URI form, it can contain path-empty instead of a single slash (see RFC 7230, RFC 3986). Previously, the ngx_http_parse_request_line() function only accepted empty path when there was no query string. With this change, non-empty query is also correctly handled. That is, request line "GET http://example.com?foo HTTP/1.1" is accepted and results in $uri "/" and $args "foo". Note that $request_uri remains "?foo", similarly to how spaces in URIs are handled. Providing "/?foo", similarly to how "/" is provided for "GET http://example.com HTTP/1.1", requires allocation.
* SSL: fixed SSL shutdown on lingering close.Ruslan Ermilov2020-12-08
| | | | | | | Ensure c->recv is properly reset to ngx_recv if SSL_shutdown() blocks on writing. The bug had appeared in 554c6ae25ffc.