summaryrefslogtreecommitdiffhomepage
path: root/src/http/modules (follow)
AgeCommit message (Collapse)AuthorFilesLines
2018-11-06gRPC: limited allocations due to ping and settings frames.Maxim Dounin1-0/+15
2018-11-06Mp4: fixed reading 64-bit atoms.Roman Arutyunyan1-0/+7
Previously there was no validation for the size of a 64-bit atom in an mp4 file. This could lead to a CPU hog when the size is 0, or various other problems due to integer underflow when calculating atom data size, including segmentation fault or worker process memory disclosure.
2018-10-03Upstream: proxy_socket_keepalive and friends.Vladimir Homutov6-0/+66
The directives enable the use of the SO_KEEPALIVE option on upstream connections. By default, the value is left unchanged.
2018-09-19Removed bgcolor attribute on body in error pages and autoindex.Nova DasSarma1-1/+1
The bgcolor attribute overrides compatibility settings in browsers and leads to undesirable behavior when the default font color is set to white in the browser, since font-color is not also overridden.
2018-09-21Rewrite: removed r->err_status special handling (ticket #1634).Maxim Dounin1-9/+1
Trying to look into r->err_status in the "return" directive makes it behave differently than real errors generated in other parts of the code, and is an endless source of various problems. This behaviour was introduced in 726:7b71936d5299 (0.4.4) with the comment "fix: "return" always overrode "error_page" response code". It is not clear if there were any real cases this was expected to fix, but there are several cases which are broken due to this change, some previously fixed (4147:7f64de1cc2c0). In ticket #1634, the problem is that when r->err_status is set to a non-special status code, it is not possible to return a response by simply returning r->err_status. If this is the case, the only option is to return script's e->status instead. An example configuration: location / { error_page 404 =200 /err502; return 404; } location = /err502 { return 502; } After the change, such a configuration will properly return standard 502 error, much like it happens when a 502 error is generated by proxy_pass. This also fixes the following configuration to properly close connection as clearly requested by "return 444": location / { error_page 404 /close; return 404; } location = /close { return 444; } Previously, this required "error_page 404 = /close;" to work as intended.
2018-09-03gRPC: disabled keepalive when sending control frames was blocked.Maxim Dounin1-0/+12
If sending request body was not completed (u->request_body_sent is not set), the upstream keepalive module won't save such a connection. However, it is theoretically possible (though highly unlikely) that sending of some control frames can be blocked after the request body was sent. The ctx->output_blocked flag introduced to disable keepalive in such cases.
2018-09-03gRPC: improved keepalive handling.Maxim Dounin1-33/+67
The code is now able to parse additional control frames after the response is received, and can send control frames as well. This fixes keepalive problems as observed with grpc-c, which can send window update and ping frames after the response, see http://mailman.nginx.org/pipermail/nginx/2018-August/056620.html.
2018-09-03Uwsgi: added a check on maximum uwsgi request size.Maxim Dounin1-0/+6
Requested by Chris Caputo.
2018-09-03Uwsgi: style.Maxim Dounin1-2/+2
2018-08-10Upstream keepalive: keepalive_requests directive.Maxim Dounin1-0/+14
The directive configures maximum number of requests allowed on a connection kept in the cache. Once a connection reaches the number of requests configured, it is no longer saved to the cache. The default is 100. Much like keepalive_requests for client connections, this is mostly a safeguard to make sure connections are closed periodically and the memory allocated from the connection pool is freed.
2018-08-10Upstream keepalive: keepalive_timeout directive.Maxim Dounin1-5/+20
The directive configures maximum time a connection can be kept in the cache. By configuring a time which is smaller than the corresponding timeout on the backend side one can avoid the race between closing a connection by the backend and nginx trying to use the same connection to send a request at the same time.
2018-08-10Upstream keepalive: comment added.Maxim Dounin1-0/+2
2018-08-07SSL: support for TLSv1.3 early data with BoringSSL.Maxim Dounin2-0/+19
Early data AKA 0-RTT mode is enabled as long as "ssl_early_data on" is specified in the configuration (default is off). The $ssl_early_data variable evaluates to "1" if the SSL handshake isn't yet completed, and can be used to set the Early-Data header as per draft-ietf-httpbis-replay-04.
2018-08-02Dav: removed dead store after 8e7a5de61664.Sergey Kandaurov1-2/+0
Found by Clang Static Analyzer.
2018-08-01Dav: changed COPY of a file to preserve access mask.Maxim Dounin1-1/+1
The behaviour is now in line with COPY of a directory with contents, which preserves access masks on individual files, as well as the "cp" command. Requested by Roman Arutyunyan.
2018-07-17Fixed invalid access to location defined as an empty string.Ruslan Ermilov6-6/+6
2018-07-17SSL: save sessions for upstream peers using a callback function.Sergey Kandaurov3-0/+21
In TLSv1.3, NewSessionTicket messages arrive after the handshake and can come at any time. Therefore we use a callback to save the session when we know about it. This approach works for < TLSv1.3 as well. The callback function is set once per location on merge phase. Since SSL_get_session() in BoringSSL returns an unresumable session for TLSv1.3, peer save_session() methods have been updated as well to use a session supplied within the callback. To preserve API, the session is cached in c->ssl->session. It is preferably accessed in save_session() methods by ngx_ssl_get_session() and ngx_ssl_get0_session() wrappers.
2018-07-02gRPC: clearing buffers in ngx_http_grpc_get_buf().Maxim Dounin1-11/+16
We copy input buffers to our buffers, so various flags might be unexpectedly set in buffers returned by ngx_chain_get_free_buf(). In particular, the b->in_file flag might be set when the body was written to a file in a different context. With sendfile enabled this in turn might result in protocol corruption if such a buffer was reused for a control frame. Make sure to clear buffers and set only fields we really need to be set.
2018-06-15Upstream: ngx_http_upstream_random module.Vladimir Homutov1-0/+502
The module implements random load-balancing algorithm with optional second choice. In the latter case, the best of two servers is chosen, accounting number of connections and server weight. Example: upstream u { random [two [least_conn]]; server 127.0.0.1:8080; server 127.0.0.1:8081; server 127.0.0.1:8082; server 127.0.0.1:8083; }
2018-06-14Upstream: improved peer selection concurrency for hash and ip_hash.Ruslan Ermilov2-2/+14
2018-05-30Limit req: improved handling of negative times.Maxim Dounin1-4/+25
Negative times can appear since workers only update time on an event loop iteration start. If a worker was blocked for a long time during an event loop iteration, it is possible that another worker already updated the time stored in the node. As such, time since last update of the node (ms) will be negative. Previous code used ngx_abs(ms) in the calculations. That is, negative times were effectively treated as positive ones. As a result, it was not possible to maintain high request rates, where the same node can be updated multiple times from during an event loop iteration. In particular, this affected setups with many SSL handshakes, see http://mailman.nginx.org/pipermail/nginx/2018-May/056291.html. Fix is to only update the last update time stored in the node if the new time is larger than previously stored one. If a future time is stored in the node, we preserve this time as is. To prevent breaking things on platforms without monotonic time available if system time is updated backwards, a safety limit of 60 seconds is used. If the time stored in the node is more than 60 seconds in the future, we assume that the time was changed backwards and update lr->last to the current time.
2018-05-07Silenced -Wcast-function-type warnings (closes #1546).Sergey Kandaurov5-8/+16
Cast to intermediate "void *" to lose compiler knowledge about the original type and pass the warning. This is not a real fix but rather a workaround. Found by gcc8.
2018-04-25SSL: deprecated the "ssl" directive.Ruslan Ermilov1-1/+6
2018-04-24SSL: detect "listen ... ssl" without certificates (ticket #178).Maxim Dounin1-2/+31
In mail and stream modules, no certificate provided is a fatal condition, much like with the "ssl" and "starttls" directives. In http, "listen ... ssl" can be used in a non-default server without certificates as long as there is a certificate in the default one, so missing certificate is only fatal for default servers.
2018-03-22gRPC: fixed possible sign extension of error and setting_value.Maxim Dounin1-3/+3
All cases are harmless and should not happen on valid values, though can result in bad values being shown incorrectly in logs. Found by Coverity (CID 1430311, 1430312, 1430313).
2018-03-20gRPC: fixed missing state save in frame header parsing.Sergey Kandaurov1-0/+1
Previously, frame state wasn't saved if HEADERS frame payload that begins with header fragment was not received at once.
2018-03-19gRPC: fixed parsing response headers split on CONTINUATION frames.Sergey Kandaurov1-2/+2
2018-03-19Upstream: fixed comments after 13f8dec720b5.Ruslan Ermilov3-6/+2
The fields "uri", "location", and "url" from ngx_http_upstream_conf_t moved to ngx_http_proxy_loc_conf_t and ngx_http_proxy_vars_t, reflect this change in create_loc_conf comments.
2018-03-17gRPC: special handling of "trailer only" responses.Maxim Dounin1-7/+10
The gRPC protocol makes a distinction between HEADERS frame with the END_STREAM flag set, and a HEADERS frame followed by an empty DATA frame with the END_STREAM flag. The latter is not permitted, and results in errors not being propagated through nginx. Instead, gRPC clients complain that "server closed the stream without sending trailers" (seen in grpc-go) or "13: Received RST_STREAM with error code 2" (seen in grpc-c). To fix this, nginx now returns HEADERS with the END_STREAM flag if the response length is known to be 0, and we are not expecting any trailer headers to be added. And the response length is explicitly set to 0 in the gRPC proxy if we see initial HEADERS frame with the END_STREAM flag set.
2018-03-17gRPC: special handling of the TE request header.Maxim Dounin1-2/+67
According to the gRPC protocol specification, the "TE" header is used to detect incompatible proxies, and at least grpc-c server rejects requests without "TE: trailers". To preserve the logic, we have to pass "TE: trailers" to the backend if and only if the original request contains "trailers" in the "TE" header. Note that no other TE values are allowed in HTTP/2, so we have to remove anything else.
2018-03-17The gRPC proxy module.Maxim Dounin1-0/+4571
The module allows passing requests to upstream gRPC servers. The module is built by default as long as HTTP/2 support is compiled in. Example configuration: grpc_pass 127.0.0.1:9000; Alternatively, the "grpc://" scheme can be used: grpc_pass grpc://127.0.0.1:9000; Keepalive support is available via the upstream keepalive module. Note that keepalive connections won't currently work with grpc-go as it fails to handle SETTINGS_HEADER_TABLE_SIZE. To use with SSL: grpc_pass grpcs://127.0.0.1:9000; SSL connections use ALPN "h2" when available. At least grpc-go works fine without ALPN, so if ALPN is not available we just establish a connection without it. Tested with grpc-c++ and grpc-go.
2018-03-01Access log: support for disabling escaping (ticket #1450).Vladimir Homutov1-8/+60
Based on patches by Johannes Baiter <johannes.baiter@bsb-muenchen.de> and Calin Don.
2018-02-28Generic subrequests in memory.Roman Arutyunyan3-63/+5
Previously, only the upstream response body could be accessed with the NGX_HTTP_SUBREQUEST_IN_MEMORY feature. Now any response body from a subrequest can be saved in a memory buffer. It is available as a single buffer in r->out and the buffer size is configured by the subrequest_output_buffer_size directive. Upstream, proxy and fastcgi code used to handle the old-style feature is removed.
2018-02-26Auth basic: prevent null character in error log (ticket #1494).Vadim Filimonov1-2/+2
2018-02-21Geo: optimized configuration parser.Ruslan Ermilov1-1/+5
If the geo block parser has failed, doing more things is pointless.
2018-02-21Geo: fixed memory allocation error handling (closes #1482).Ruslan Ermilov1-11/+16
If during configuration parsing of the geo directive the memory allocation has failed, pool used to parse configuration inside the block, and sometimes the temporary pool were not destroyed.
2018-02-08Basic support of the Link response header.Ruslan Ermilov1-19/+23
2018-02-07Dav: added error logging.Roman Arutyunyan1-1/+10
Previously, when request body was not available or was previously read in memory rather than a file, client received HTTP 500 error, but no explanation was logged in error log. This could happen, for example, if request body was read or discarded prior to error_page redirect, or if mirroring was enabled along with dav.
2017-11-20Proxy: escape explicit space in URI in default cache key.Roman Arutyunyan1-1/+1
If the flag space_in_uri is set, the URI in HTTP upstream request is escaped to convert space to %20. However this flag is not checked while creating the default cache key. This leads to different cache keys for requests '/foo bar' and '/foo%20bar', while the upstream requests are identical. Additionally, the change fixes background cache updates when the client URI contains unescaped space. Default cache key in a subrequest is always based on escaped URI, while the main request may not escape it. As a result, background cache update subrequest may update a different cache entry.
2017-11-20Proxy: simplified conditions of using unparsed uri.Roman Arutyunyan1-4/+2
Previously, the unparsed uri was explicitly allowed to be used only by the main request. However the valid_unparsed_uri flag is nonzero only in the main request, which makes the main request check pointless.
2017-11-28Upstream keepalive: clean read delayed flag in stored connections.Roman Arutyunyan1-0/+1
If a connection with the read delayed flag set was stored in the keepalive cache, and after picking it from the cache a read timer was set on that connection, this timer was considered a delay timer rather than a socket read event timer as expected. The latter timeout is usually much longer than the former, which caused a significant delay in request processing. The issue manifested itself with proxy_limit_rate and upstream keepalive enabled and exists since 973ee2276300 (1.7.7) when proxy_limit_rate was introduced.
2017-12-04Autoindex: discard request body (ticket #1439).Maxim Dounin1-0/+6
2017-11-18Gzip: support for a zlib variant from Intel.Maxim Dounin1-5/+33
A zlib variant from Intel as available from https://github.com/jtkukunas/zlib uses 64K hash instead of scaling it from the specified memory level, and also uses 16-byte padding in one of the window-sized memory buffers, and can force window bits to 13 if compression level is set to 1 and appropriate compile options are used. As a result, nginx complained with "gzip filter failed to use preallocated memory" alerts. This change improves deflate_state allocation detection by testing that items is 1 (deflate_state is the only allocation where items is 1). Additionally, on first failure to use preallocated memory we now assume that we are working with the Intel's modified zlib, and switch to using appropriate preallocations. If this does not help, we complain with the usual alerts. Previous version of this patch was published at http://mailman.nginx.org/pipermail/nginx/2014-July/044568.html. The zlib variant in question is used by default in ClearLinux from Intel, see http://mailman.nginx.org/pipermail/nginx-ru/2017-October/060421.html, http://mailman.nginx.org/pipermail/nginx-ru/2017-November/060544.html.
2017-11-16Xslt: fixed parameters parsing (ticket #1416).Ruslan Ermilov1-2/+13
If parameters were specified in xslt_stylesheet without variables, any request except the first would cause an internal server error.
2017-10-27SSI: fixed type.hucongcong1-8/+7
2017-11-09FastCGI: adjust buffer position when parsing incomplete records.Maxim Dounin1-0/+1
Previously, nginx failed to move buffer position when parsing an incomplete record header, and due to this wasn't be able to continue parsing once remaining bytes of the record header were received. This can affect response header parsing, potentially generating spurious errors like "upstream sent unexpected FastCGI request id high byte: 1 while reading response header from upstream". While this is very unlikely, since usually record headers are written in a single buffer, this still can happen in real life, for example, if a record header will be split across two TCP packets and the second packet will be delayed. This does not affect non-buffered response body proxying, due to "buf->pos = buf->last;" at the start of the ngx_http_fastcgi_non_buffered_filter() function. Also this does not affect buffered response body proxying, as each input buffer is only passed to the filter once.
2017-10-05Upstream hash: reordered peer checks.Maxim Dounin1-7/+7
This slightly reduces cost of selecting a peer if all or almost all peers failed, see ticket #1030. There should be no measureable difference with other workloads.
2017-10-05Upstream hash: limited number of tries in consistent case.Maxim Dounin1-3/+7
While this may result in non-ideal distribution of requests if nginx won't be able to select a server in a reasonable number of attempts, this still looks better than severe performance degradation observed if there is no limit and there are many points configured (ticket #1030). This is also in line with what we do for other hash balancing methods.
2017-09-22Do not use the obsolete NGX_SOCKADDRLEN macro.Ruslan Ermilov1-1/+1
The change in ac120e797d28 re-used the macro which was made obsolete in adf25b8d0431.
2017-09-18Removed more remnants of the old pthread implementation.Ruslan Ermilov1-55/+15
After e284f3ff6831, ngx_crypt() can no longer return NGX_AGAIN.