summaryrefslogtreecommitdiffhomepage
path: root/src/http (follow)
AgeCommit message (Collapse)AuthorFilesLines
2017-06-27Range filter: allowed ranges on empty files (ticket #1031).Maxim Dounin1-0/+3
As per RFC 2616 / RFC 7233, any range request to an empty file is expected to result in 416 Range Not Satisfiable response, as there cannot be a "byte-range-spec whose first-byte-pos is less than the current length of the entity-body". On the other hand, this makes use of byte-range requests inconvenient in some cases, as reported for the slice module here: http://mailman.nginx.org/pipermail/nginx-devel/2017-June/010177.html This commit changes range filter to instead return 200 if the file is empty and the range requested starts at 0.
2017-06-22Upstream: introduced ngx_http_upstream_ssl_handshake_handler().Maxim Dounin1-14/+24
This change reworks 13a5f4765887 to only run posted requests once, with nothing on stack. Running posted requests with other request functions on stack may result in use-after-free in case of errors, similar to the one reported in #788. To only run posted request once, a separate function was introduced to be used as ssl handshake handler in c->ssl->handler, ngx_http_upstream_ssl_handshake_handler(). The ngx_http_run_posted_requests() is only called in this function, and not in ngx_http_upstream_ssl_handshake() which may be called directly on stack. Additionaly, ngx_http_upstream_ssl_handshake_handler() now does appropriate debug logging of the current subrequest, similar to what is done in other event handlers.
2017-06-14Upstream: fixed running posted requests (ticket #788).Roman Arutyunyan1-1/+6
Previously, the upstream resolve handler always called ngx_http_run_posted_requests() to run posted requests after processing the resolver response. However, if the handler was called directly from the ngx_resolve_name() function (for example, if the resolver response was cached), running posted requests from the handler could lead to the following errors: - If the request was scheduled for termination, it could actually be terminated in the resolve handler. Upper stack frames could reference the freed request object in this case. - If a significant number of requests were posted, and for each of them the resolve handler was called directly from the ngx_resolve_name() function, posted requests could be run recursively and lead to stack overflow. Now ngx_http_run_posted_requests() is only called from asynchronously invoked resolve handlers.
2017-03-24Headers filter: added "add_trailer" directive.Piotr Sikora1-22/+142
Trailers added using this directive are evaluated after response body is processed by output filters (but before it's written to the wire), so it's possible to use variables calculated from the response body as the trailer value. Signed-off-by: Piotr Sikora <piotrsikora@google.com>
2017-03-24HTTP/2: added support for trailers in HTTP responses.Piotr Sikora1-14/+152
Signed-off-by: Piotr Sikora <piotrsikora@google.com>
2017-03-24Added support for trailers in HTTP responses.Piotr Sikora5-27/+157
Example: ngx_table_elt_t *h; h = ngx_list_push(&r->headers_out.trailers); if (h == NULL) { return NGX_ERROR; } ngx_str_set(&h->key, "Fun"); ngx_str_set(&h->value, "with trailers"); h->hash = ngx_hash_key_lc(h->key.data, h->key.len); The code above adds "Fun: with trailers" trailer to the response. Modules that want to emit trailers must set r->expect_trailers = 1 in header filter, otherwise they might not be emitted for HTTP/1.1 responses that aren't already chunked. This change also adds $sent_trailer_* variables. Signed-off-by: Piotr Sikora <piotrsikora@google.com>
2017-06-14Gzip: fixed style in $gzip_ratio variable handler.Ruslan Ermilov1-4/+4
The current style in variable handlers returning NGX_OK is to either set v->not_found to 1, or to initialize the entire ngx_http_variable_value_t structure. In theory, always setting v->valid = 1 for NGX_OK would be useful, which would mean that the value was computed and is thus valid, including the special case of v->not_found = 1. But currently that's not the case and causes the (v->valid || v->not_found) check to access an uninitialized v->valid value, which is safe only because its value doesn't matter when v->not_found is set.
2017-06-13HTTP/2: reject HTTP/2 requests without ":scheme" pseudo-header.Piotr Sikora1-0/+1
Signed-off-by: Piotr Sikora <piotrsikora@google.com>
2017-06-07Userid: ngx_http_get_indexed_variable() error handling.Sergey Kandaurov1-0/+4
When evaluating a mapped $reset_uid variable in the userid filter, if get_handler set to ngx_http_map_variable() returned an error, this previously resulted in a NULL pointer dereference.
2017-06-07Fixed segfault in try_files with nested location.Sergey Kandaurov1-0/+1
If memory allocation of a new r->uri.data storage failed, reset its length as well. Request URI is used in ngx_http_finalize_request() for debug logging.
2017-06-07SSI: return NGX_ERROR when timefmt memory allocation failed.Sergey Kandaurov1-1/+1
Previously, when using NGX_HTTP_SSI_ERROR, error was ignored in ssi processing, thus timefmt could be accessed later in ngx_http_ssi_date_gmt_local_variable() as part of "set" handler, or NULL format pointer could be passed to strftime().
2017-06-02HTTP/2: don't send SETTINGS ACK before already queued DATA frames.Piotr Sikora2-1/+10
Previously, SETTINGS ACK was sent immediately upon receipt of SETTINGS frame, before already queued DATA frames created using old SETTINGS. This incorrect behavior was source of interoperability issues, because peers rely on the fact that new SETTINGS are in effect after receiving SETTINGS ACK. Reported by Feng Li. Signed-off-by: Piotr Sikora <piotrsikora@google.com>
2017-06-02HTTP/2: make SETTINGS ACK frame reusable.Piotr Sikora1-25/+31
Signed-off-by: Piotr Sikora <piotrsikora@google.com>
2017-06-02HTTP/2: send SETTINGS ACK after applying all SETTINGS params.Piotr Sikora1-2/+2
This avoids sending unnecessary SETTINGS ACK in case of PROTOCOL_ERROR. Signed-off-by: Piotr Sikora <piotrsikora@google.com>
2017-06-02HTTP/2: emit new frames only after applying all SETTINGS params.Piotr Sikora1-6/+11
Previously, new frames could be emitted in the middle of applying new (and already acknowledged) SETTINGS params, which is illegal. Signed-off-by: Piotr Sikora <piotrsikora@google.com>
2017-05-31Upstream: style.Piotr Sikora1-1/+1
Signed-off-by: Piotr Sikora <piotrsikora@google.com>
2017-05-31Headers filter: style.Piotr Sikora1-2/+2
Signed-off-by: Piotr Sikora <piotrsikora@google.com>
2017-05-30HTTP/2: add debug logging of pseudo-headers and cookies.Piotr Sikora1-20/+28
Signed-off-by: Piotr Sikora <piotrsikora@google.com>
2017-05-29Fixed background requests with asynchronous operations.Roman Arutyunyan1-5/+3
If the main request was finalized while a background request performed an asynchronous operation, the main request ended up in ngx_http_writer() and was not finalized until a network event or a timeout. For example, cache background update with aio enabled made nginx unable to process further client requests or close the connection, keeping it open until client closes it. Now regular finalization of the main request is not suspended because of an asynchronous operation in another request. If a background request was terminated while an asynchronous operation was in progress, background request's write event handler was changed to ngx_http_request_finalizer() and never called again. Now, whenever a request is terminated while an asynchronous operation is in progress, connection error flag is set to make further finalizations of any request with this connection lead to termination. These issues appeared in 1aeaae6e9446 (not yet released).
2017-05-29SSL: set TCP_NODELAY on SSL connections before handshake.Maxim Dounin1-8/+17
With OpenSSL 1.1.0+, the workaround for handshake buffer size as introduced in a720f0b0e083 (ticket #413) no longer works, as OpenSSL no longer exposes handshake buffers, see https://github.com/openssl/openssl/commit/2e7dc7cd688. Moreover, it is no longer possible to adjust handshake buffers at all now. To avoid additional RTT if handshake uses more than 4k we now set TCP_NODELAY on SSL connections before handshake. While this still results in sub-optimal network utilization due to incomplete packets being sent, it seems to be better than nothing.
2017-05-26Introduced ngx_tcp_nodelay().Ruslan Ermilov3-123/+19
2017-05-25Background subrequests for cache updates.Roman Arutyunyan4-24/+49
Previously, cache background update might not work as expected, making client wait for it to complete before receiving the final part of a stale response. This could happen if the response could not be sent to the client socket in one filter chain call. Now background cache update is done in a background subrequest. This type of subrequest does not block any other subrequests or the main request.
2017-05-23HTTP/2: fixed segfault when memory allocation failed.Valentin Bartenev1-2/+2
If allocation of cleanup handler in the HTTP/2 header filter failed, then a stream might be freed with a HEADERS frame left in the output queue. Now the HEADERS frame is accounted in the queue before trying to allocate the cleanup handler.
2017-05-18Cache: ignore long locked entries during forced expire.Dmitry Volyntsev1-11/+42
Abnormally exited workers may leave locked cache entries, this can result in the cache size on disk exceeding max_size and shared memory exhaustion. This change mitigates the issue by ignoring locked entries during forced expire. It also increases the visibility of the problem by logging such entries.
2017-05-18Upstream: fixed u->headers_in.headers allocation error handling.Sergey Kandaurov4-0/+6
Previously, an allocation error resulted in uninitialized memory access when evaluating $upstream_http_ variables. On a related note, see r->headers_out.headers cleanup work in 0cdee26605f3.
2017-05-15Realip: allow hostnames in set_real_ip_from (ticket #1180).Ruslan Ermilov1-15/+68
2017-05-15Access: simplified rule parser code.Ruslan Ermilov1-13/+7
2017-04-27Added missing "fall through" comments (ticket #1259).Maxim Dounin1-0/+3
Found by gcc7 (-Wimplicit-fallthrough).
2017-04-25Don't pretend we support HTTP major versions >1 as HTTP/1.1.Ruslan Ermilov5-8/+34
2017-04-24HTTP/2: reduced difference to HTTP/1.x in reading request body.Valentin Bartenev3-33/+18
Particularly, this eliminates difference in behavior for requests without body and deduplicates code. Prodded by Piotr Sikora.
2017-04-24HTTP/2: rejecting zero WINDOW_UPDATE with PROTOCOL_ERROR.Valentin Bartenev1-0/+38
It's required by RFC 7540. While there is no real harm from such frames, that should help to detect broken clients. Based on a patch by Piotr Sikora.
2017-04-20Gzip static: use an appropriate error on memory allocation failure.Sergey Kandaurov1-1/+1
2017-04-20Cleaned up r->headers_out.headers allocation error handling.Sergey Kandaurov8-15/+28
If initialization of a header failed for some reason after ngx_list_push(), leaving the header as is can result in uninitialized memory access by the header filter or the log module. The fix is to clear partially initialized headers in case of errors. For the Cache-Control header, the fix is to postpone pushing r->headers_out.cache_control until its value is completed.
2017-04-18Sub filter: restored ngx_http_set_ctx() at the proper place.Sergey Kandaurov1-2/+2
Previously, ngx_http_sub_header_filter() could fail with a partially initialized context, later accessed in ngx_http_sub_body_filter() if called from the perl content handler. The issue had appeared in 2c045e5b8291 (1.9.4). A better fix would be to handle ngx_http_send_header() errors in the perl module, though this doesn't seem to be easy enough.
2017-04-18SSL: added support for TLSv1.3 in ssl_protocols directive.Sergey Kandaurov3-0/+3
Support for the TLSv1.3 protocol will be introduced in OpenSSL 1.1.1.
2017-04-11Added support for the "308 Permanent Redirect" (ticket #877).Simon Leblanc6-4/+20
2017-04-12Use ngx_calloc_buf() where appropriate.Ruslan Ermilov9-12/+12
2017-03-24Upstream: allow recovery from "429 Too Many Requests" response.Piotr Sikora6-5/+16
This change adds "http_429" parameter to "proxy_next_upstream" for retrying rate-limited requests, and to "proxy_cache_use_stale" for serving stale cached responses after being rate-limited. Signed-off-by: Piotr Sikora <piotrsikora@google.com>
2017-03-24Added support for "429 Too Many Requests" response (RFC6585).Piotr Sikora3-8/+29
This change adds reason phrase in status line and pretty response body when "429" status code is used in "return", "limit_conn_status" and/or "limit_req_status" directives. Signed-off-by: Piotr Sikora <piotrsikora@google.com>
2017-04-03Fixed type.hucongcong1-2/+2
2017-03-31Slice filter: prevented slice redirection (ticket #1219).Roman Arutyunyan1-1/+11
When a slice subrequest was redirected to a new location, its context was lost. After its completion, a new slice subrequest for the same slice was created. This could lead to infinite loop. Now the slice module makes sure each slice subrequest starts output with the slice context available.
2017-03-28Slice filter: allowed at most one subrequest at a time.Roman Arutyunyan1-12/+16
Previously, if slice main request write handler was called while a slice subrequest was running, a new subrequest for the same slice was started.
2017-04-02Moved handling of wev->delayed to the connection event handler.Maxim Dounin4-78/+26
With post_action or subrequests, it is possible that the timer set for wev->delayed will expire while the active subrequest write event handler is not ready to handle this. This results in request hangs as observed with limit_rate / sendfile_max_chunk and post_action (ticket #776) or subrequests (ticket #1228). Moving the handling to the connection event handler fixes the hangs observed, and also slightly simplifies the code.
2017-04-02Perl: fixed delaying subrequests.Maxim Dounin2-6/+11
Much like in limit_req, use the wev->delayed flag to ensure proper handling and interoperability with limit_rate.
2017-04-02Limit req: fixed delaying subrequests.Maxim Dounin1-1/+4
Since limit_req uses connection's write event to delay request processing, it can conflict with timers in other subrequests. In particular, even if applied to an active subrequest, it can break things if wev->delayed is already set (due to limit_rate or sendfile_max_chunk), since after limit_req finishes the wev->delayed flag will be set and no timer will be active. Fix is to use the wev->delayed flag in limit_req as well. This ensures that wev->delayed won't be set after limit_req finishes, and also ensures that limit_req's timers will be properly handled by other subrequests if the one delayed by limit_req is not active.
2017-03-26HTTP/2: style and typos.Piotr Sikora2-7/+8
Signed-off-by: Piotr Sikora <piotrsikora@google.com>
2017-03-29HTTP/2: fixed connection finalization.Valentin Bartenev1-3/+8
All streams in connection must be finalized before the connection itself can be finalized and all related memory is freed. That's not always possible on the current event loop iteration. Thus when the last stream is finalized, it sets the special read event handler ngx_http_v2_handle_connection_handler() and posts the event. Previously, this handler didn't check the connection state and could call the regular event handler on a connection that was already in finalization stage. In the worst case that could lead to a segmentation fault, since some data structures aren't supposed to be used during connection finalization. Particularly, the waiting queue can contain already freed streams, so the WINDOW_UPDATE frame received by that moment could trigger accessing to these freed streams. Now, the connection error flag is explicitly checked in ngx_http_v2_handle_connection_handler().
2017-03-29HTTP/2: fixed stream finalization.Valentin Bartenev1-0/+3
In order to finalize stream the error flag is set on fake connection and either "write" or "read" event handler is called. The read events of fake connections are always ready, but it's not the case with the write events. When the ready flag isn't set, the error flag can be not checked in some cases and as a result stream isn't finalized. Now the ready flag is explicilty set on write events for proper finalization in all cases.
2017-03-26HTTP/2: emit PROTOCOL_ERROR on padding errors.Piotr Sikora1-2/+4
Signed-off-by: Piotr Sikora <piotrsikora@google.com>
2017-03-26HTTP/2: fix flow control with padded DATA frames.Piotr Sikora1-10/+12
Previously, flow control didn't account for padding in DATA frames, which meant that its view of the world could drift from peer's view by up to 256 bytes per received padded DATA frame, which could lead to a deadlock. Signed-off-by: Piotr Sikora <piotrsikora@google.com>