summaryrefslogtreecommitdiffhomepage
path: root/src/http (follow)
AgeCommit message (Collapse)AuthorFilesLines
2021-01-12Upstream: fixed zero size buf alerts on extra data (ticket #2117).Maxim Dounin2-0/+14
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.
2020-12-21HTTP/3: removed HTTP/3-specific code.Roman Arutyunyan1-7/+5
The ngx_http_set_lingering_close() function is not called for HTTP/3. The change reduces diff to the default branch.
2021-01-18HTTP/3: client header validation.Roman Arutyunyan1-0/+70
A header with the name containing null, CR, LF, colon or uppercase characters, is now considered an error. A header with the value containing null, CR or LF, is also considered an error. Also, header is considered invalid unless its name only contains lowercase characters, digits, minus and optionally underscore. Such header can be optionally ignored.
2021-01-12HTTP/3: added comment.Roman Arutyunyan1-0/+1
2021-01-22HTTP/3: client pseudo-headers restrictions.Roman Arutyunyan1-0/+92
- :method, :path and :scheme are expected exactly once and not empty - :method and :scheme character validation is added - :authority cannot appear more than once
2021-01-22HTTP/3: refactored request parser.Roman Arutyunyan9-388/+457
The change reduces diff to the default branch for src/http/ngx_http_request.c and src/http/ngx_http_parse.c.
2020-12-22QUIC: fixed building ALPN callback without debug and http2.Sergey Kandaurov1-1/+1
2020-12-16HTTP/3: staticize internal parsing functions.Sergey Kandaurov2-45/+45
2020-12-16HTTP/3: staticize ngx_http_v3_methods.Sergey Kandaurov1-1/+1
2020-12-15Merged with the default branch.Sergey Kandaurov8-22/+45
2020-12-11Fixed double close of non-regular files in flv and mp4.Maxim Dounin2-12/+0
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.
2020-12-10Removed extra allocation for r->uri.Maxim Dounin1-1/+1
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.
2020-12-10Fixed parsing of absolute URIs with empty path (ticket #2079).Maxim Dounin3-2/+26
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.
2020-12-08SSL: fixed SSL shutdown on lingering close.Ruslan Ermilov2-4/+0
Ensure c->recv is properly reset to ngx_recv if SSL_shutdown() blocks on writing. The bug had appeared in 554c6ae25ffc.
2020-11-27HTTP/3: introduced ngx_http_v3_filter.Roman Arutyunyan5-1204/+1369
The filter is responsible for creating HTTP/3 response header and body. The change removes differences to the default branch for ngx_http_chunked_filter_module and ngx_http_header_filter_module.
2020-11-27Upstream: excluded down servers from the next_upstream tries.Ruslan Ermilov2-3/+18
Previously, the number of next_upstream tries included servers marked as "down", resulting in "no live upstreams" with the code 502 instead of the code derived from an attempt to connect to the last tried "up" server (ticket #2096).
2020-11-25HTTP/3: eliminated r->method_start.Roman Arutyunyan4-17/+14
The field was introduced to ease parsing HTTP/3 requests. The change reduces diff to the default branch.
2020-11-18gRPC: RST_STREAM(NO_ERROR) handling after "trailer only" responses.Pavel Pautov1-0/+1
Similarly to the problem fixed in 2096b21fcd10 (ticket #1792), when a "trailer only" gRPC response (that is, a response with the END_STREAM flag in the HEADERS frame) was immediately followed by RST_STREAM(NO_ERROR) in the data preread along with the response header, RST_STREAM wasn't properly skipped and caused "upstream rejected request with error 0" errors. Observed with "unknown service" gRPC errors returned by grpc-go. Fix is to set ctx->done if we are going to parse additional data, so the RST_STREAM(NO_ERROR) is properly skipped. Additionally, now ngx_http_grpc_filter() will complain about frames sent for closed stream if there are any.
2020-11-17HTTP/3: null-terminate empty header value.Roman Arutyunyan1-0/+1
Header value returned from the HTTP parser is expected to be null-terminated or have a spare byte after the value bytes. When an empty header value was passed by client in a literal header representation, neither was true. This could result in segfault. The fix is to assign a literal empty null-terminated string in this case. Thanks to Andrey Kolyshkin.
2020-11-17HTTP/3: finalize chunked response body chain with NULL.Roman Arutyunyan1-0/+3
Unfinalized chain could result in segfault. The problem was introduced in ef83990f0e25. Patch by Andrey Kolyshkin.
2020-11-24Merged with the default branch.Sergey Kandaurov4-54/+82
2020-11-10Fixed generating chunked response after 46e3542d51b3.Roman Arutyunyan1-19/+26
If trailers were missing and a chain carrying the last_buf flag had no data in it, then last HTTP/1 chunk was broken. The problem was introduced while implementing HTTP/3 response body generation. The change fixes the issue and reduces diff to the mainline nginx.
2020-11-11QUIC: generate default stateless reset token key.Roman Arutyunyan1-0/+13
Previously, if quic_stateless_reset_token_key was empty or unspecified, initial stateless reset token was not generated. However subsequent tokens were generated with empty key, which resulted in error with certain SSL libraries, for example OpenSSL. Now a random 32-byte stateless reset token key is generated if none is specified in the configuration. As a result, stateless reset tokens are now generated for all server ids.
2020-11-10QUIC: renamed c->qs to c->quic.Roman Arutyunyan9-32/+32
2020-11-11QUIC: connection multiplexing per port.Roman Arutyunyan1-5/+5
Also, connection migration within a single worker is implemented.
2020-11-09Request body: removed error assumption (ticket #2058).Maxim Dounin1-2/+3
Before introduction of request body filter in 42d9beeb22db, the only possible return code from the ngx_http_request_body_filter() call without actual buffers was NGX_HTTP_INTERNAL_SERVER_ERROR, and the code in ngx_http_read_client_request_body() hardcoded the only possible error to simplify the code of initial call to set rb->rest. This is no longer true after introduction of request body filters though, as a request body filter might need to return other errors, such as 403. Fix is to preserve the error code actually returned by the call instead of assuming 500.
2020-11-09Request body: improved logging.Maxim Dounin1-0/+3
Added logging before returning NGX_HTTP_INTERNAL_SERVER_ERROR if there are busy buffers after a request body flush. This should never happen with current code, though bugs can be introduced by 3rd party modules. Make sure debugging will be easy enough.
2020-11-10QUIC: multiple versions support in ALPN.Sergey Kandaurov3-14/+31
Previously, a version based on NGX_QUIC_DRAFT_VERSION was always set. Now it is taken from the negotiated QUIC version that may differ.
2020-11-06SSL: fixed non-working SSL shutdown on lingering close.Ruslan Ermilov3-17/+65
When doing lingering close, the socket was first shut down for writing, so SSL shutdown initiated after lingering close was not able to send the close_notify alerts (ticket #2056). The fix is to call ngx_ssl_shutdown() before shutting down the socket.
2020-11-06Removed dead code from ngx_http_set_keepalive().Ruslan Ermilov1-7/+0
The code removed became dead after 98f03cd8d6cc (0.8.14), circa when the request reference counting was introduced.
2020-10-29Merged with the default branch.Sergey Kandaurov7-61/+267
2020-10-28Core: added format specifiers to output binary data as hex.Vladimir Homutov1-28/+10
Now "s", "V", and "v" format specifiers may be prefixed with "x" (lowercase) or "X" (uppercase) to output corresponding data in hexadecimal format. In collaboration with Maxim Dounin.
2020-10-22SSL: ssl_reject_handshake directive (ticket #195).Maxim Dounin3-40/+93
In some cases it might be needed to reject SSL handshake based on SNI server name provided, for example, to make sure an invalid certificate is not returned to clients trying to contact a name-based virtual server without SSL configured. Previously, a "ssl_ciphers aNULL;" was used for this. This workaround, however, is not compatible with TLSv1.3, in particular, when using BoringSSL, where it is not possible to configure TLSv1.3 ciphers at all. With this change, the ssl_reject_handshake directive is introduced, which instructs nginx to reject SSL handshakes with an "unrecognized_name" alert in a particular server block. For example, to reject handshake with names other than example.com, one can use the following configuration: server { listen 443 ssl; ssl_reject_handshake on; } server { listen 443 ssl; server_name example.com; ssl_certificate example.com.crt; ssl_certificate_key example.com.key; } The following configuration can be used to reject all SSL handshakes without SNI server name provided: server { listen 443 ssl; ssl_reject_handshake on; } server { listen 443 ssl; server_name ~^; ssl_certificate example.crt; ssl_certificate_key example.key; } Additionally, the ssl_reject_handshake directive makes configuring certificates for the default server block optional. If no certificates are configured in the default server for a given listening socket, certificates must be defined in all non-default server blocks with the listening socket in question.
2020-10-22Upstream: proxy_ssl_conf_command and friends.Maxim Dounin3-0/+104
Similarly to ssl_conf_command, proxy_ssl_conf_command (grpc_ssl_conf_command, uwsgi_ssl_conf_command) can be used to set arbitrary OpenSSL configuration parameters as long as nginx is compiled with OpenSSL 1.0.2 or later, when connecting to upstream servers with SSL. Full list of available configuration commands can be found in the SSL_CONF_cmd manual page (https://www.openssl.org/docs/man1.1.1/man3/SSL_CONF_cmd.html).
2020-10-22SSL: ssl_conf_command directive.Maxim Dounin2-0/+33
With the ssl_conf_command directive it is now possible to set arbitrary OpenSSL configuration parameters as long as nginx is compiled with OpenSSL 1.0.2 or later. Full list of available configuration commands can be found in the SSL_CONF_cmd manual page (https://www.openssl.org/docs/man1.1.1/man3/SSL_CONF_cmd.html). In particular, this allows configuring PrioritizeChaCha option (ticket #1445): ssl_conf_command Options PrioritizeChaCha; It can be also used to configure TLSv1.3 ciphers in OpenSSL, which fails to configure them via the SSL_CTX_set_cipher_list() interface (ticket #1529): ssl_conf_command Ciphersuites TLS_CHACHA20_POLY1305_SHA256; Configuration commands are applied after nginx own configuration for SSL, so they can be used to override anything set by nginx. Note though that configuring OpenSSL directly with ssl_conf_command might result in a behaviour nginx does not expect, and should be done with care.
2020-10-22Core: ngx_conf_set_keyval_slot() now accepts NGX_CONF_UNSET_PTR.Maxim Dounin2-6/+10
With this change, it is now possible to use ngx_conf_merge_ptr_value() to merge keyval arrays. This change actually follows much earlier changes in ngx_conf_merge_ptr_value() and ngx_conf_set_str_array_slot() in 1452:cd586e963db0 (0.6.10) and 1701:40d004d95d88 (0.6.22). To preserve compatibility with existing 3rd party modules, both NULL and NGX_CONF_UNSET_PTR are accepted for now.
2020-10-19QUIC: reverted previous 3 commits.Vladimir Homutov2-23/+0
Changes were intended for the test repository.
2020-10-08Limit req: unlocking of nodes on complex value errors.Maxim Dounin1-15/+27
Previously, if there were multiple limits configured, errors in ngx_http_complex_value() during processing of a non-first limit resulted in reference count leak in shared memory nodes of already processed limits. Fix is to explicity unlock relevant nodes, much like we do when rejecting requests.
2020-09-29Proxy: error checking for array init, missed in 7716:d6a5e14aa3e4.Maxim Dounin1-1/+3
Found by Coverity (CID 1467637).
2020-09-29Userid: userid_flags fixup.Maxim Dounin1-7/+9
In 7717:e3e8b8234f05, the 1st bit was incorrectly used. It shouldn't be used for bitmask values, as it is used by NGX_CONF_BITMASK_SET. Additionally, special value "off" added to make it possible to clear inherited userid_flags value.
2020-09-28Userid: userid_flags directive to set cookie flags.Maxim Dounin1-0/+72
2020-09-27Proxy: added the "proxy_cookie_flags" directive.Ruslan Ermilov1-30/+552
2020-09-27Proxy: changed interface of some internal functions.Ruslan Ermilov1-32/+30
This is in preparation for the next change. Also, moved optimization from ngx_http_proxy_rewrite_regex_handler() to ngx_http_proxy_rewrite().
2020-09-27Proxy: strengthen syntax checking for some directives.Ruslan Ermilov1-12/+20
The "false" parameter of the proxy_redirect directive is deprecated. Warning has been emitted since c2230102df6f (0.7.54). The "off" parameter of the proxy_redirect, proxy_cookie_domain, and proxy_cookie_path directives tells nginx not to inherit the configuration from the previous configuration level. Previously, after specifying the directive with the "off" parameter, any other directives were ignored, and syntax checking was disabled. The syntax was enforced to allow either one directive with the "off" parameter, or several directives with other parameters. Also, specifying "proxy_redirect default foo" no longer works like "proxy_redirect default".
2020-09-15SSL: added the "ssl_keys_file" directive.Vladimir Homutov2-0/+23
2020-10-12QUIC: fixed ngx_http_upstream_init() much like HTTP/2 connections.Sergey Kandaurov1-0/+7
2020-10-01Merged with the default branch.Sergey Kandaurov7-80/+731
2020-10-01QUIC: moved ssl configuration pointer to quic configuration.Vladimir Homutov2-5/+6
The ssl configuration is obtained at config time and saved for future use.
2020-09-30QUIC: added stateless reset support.Vladimir Homutov1-1/+12
The new "quic_stateless_reset_token_key" directive is added. It sets the endpoint key used to generate stateless reset tokens and enables feature. If the endpoint receives short-header packet that can't be matched to existing connection, a stateless reset packet is generated with a proper token. If a valid stateless reset token is found in the incoming packet, the connection is closed. Example configuration: http { quic_stateless_reset_token_key "foo"; ... }
2020-09-29QUIC: switch stream context to a server selected by SNI.Roman Arutyunyan1-2/+15
Previously the default server configuration context was used until the :authority or host header was parsed. This led to using the configuration parameters like client_header_buffer_size or request_pool_size from the default server rather than from the server selected by SNI. Also, the switch to the right server log is implemented. This issue manifested itself as QUIC stream being logged to the default server log until :authority or host is parsed.