aboutsummaryrefslogtreecommitdiffstats
path: root/test
AgeCommit message (Collapse)Author
2025-02-10Correct a ct_helper:ignore callLoïc Hoguin
2025-02-10Run http_SUITE:graceful_shutdown_listener separatelyLoïc Hoguin
To avoid intermittent errors that are more likely as more tests are calling cowboy:stop_listener.
2025-02-10Provide better control over which HTTP protocols are enabledLoïc Hoguin
Over cleartext TCP the `protocols` option lists the enabled protocols. The default is to allow both HTTP/1.1 and HTTP/2. Over TLS the default protocol to use when ALPN is not used can now be configured via the `alpn_default_protocol` option. Performing an HTTP/1.1 upgrade to HTTP/2 over TLS is now rejected with an error as connecting to HTTP/2 over TLS requires the use of ALPN (or that HTTP/2 be the default when connecting over TLS).
2025-02-09Detect invalid content_types_provided return values earlierLoïc Hoguin
Before this change invalid return values would be detected via unhelpful error messages such as [1] and the closing of the connection. [1] Bad value on output port 'tcp_inet'
2025-02-08Properly handle external exits of request processesLoïc Hoguin
Because the exit reason doesn't include the stacktrace they were ignored. Now they are properly handled. The error message was changed slightly to accomodate.
2025-02-07Add hibernate option to cowboy_http and cowboy_http2Loïc Hoguin
When enabled the connection process will automatically hibernate. Because hibernation triggers GC, this can be used as a way to keep memory usage lower, at the cost of performance.
2025-02-06Add an http_perf test uploading a 10GB bodyLoïc Hoguin
2025-02-06Fix cowboy_req:filter_cookies missing valid cookiesMirjam Friesen
When 3 or more cookies were sent the extra cookies were not found because the binary:split on ";" stopped at the first occurrence.
2025-02-06Fix request_timeout triggering when a request was in the bufferLoïc Hoguin
The problem was that when a request immediately following another request with a large enough body, the data for the new request (including headers) would be buffered waiting for more data, instead of being processed immediately. If no more data came in on the socket the request_timeout would eventually trigger. Now the buffer is processed immediately.
2025-02-05Implement dynamic socket buffer sizesLoïc Hoguin
Cowboy will set the socket's buffer size dynamically to better fit the current workload. When the incoming data is small, a low buffer size reduces the memory footprint and improves responsiveness and therefore performance. When the incoming data is large, such as large HTTP request bodies, a larger buffer size helps us avoid doing too many binary appends and related allocations. Setting a large buffer size for all use cases is sub-optimal because allocating more than needed necessarily results in a performance hit (not just increased memory usage). By default Cowboy starts with a buffer size of 8192 bytes. It then doubles or halves the buffer size depending on the size of the data it receives from the socket. It stops decreasing at 8192 and increasing at 131072 by default. To keep track of the size of the incoming data Cowboy maintains a moving average. It allows Cowboy to avoid changing the buffer too often but still react quickly when necessary. Cowboy will increase the buffer size when the moving average is above 90% of the current buffer size, and decrease when the moving average is below 40% of the current buffer size. The current buffer size and moving average are propagated when switching protocols. The dynamic buffer is implemented in HTTP/1, HTTP/2 and HTTP/1 Websocket. HTTP/2 Websocket has it disabled because it doesn't interact directly with the socket; in that case it is HTTP/2 that has a dynamic buffer. The dynamic buffer provides a very large performance improvement in many scenarios, at minimal cost for others. Because it largely depend on the underlying protocol the improvements are no all equal. TLS and compression also impact the results. The improvement when reading a large request body, with the requests repeated in a fast loop are: * HTTP: 6x to 20x faster * HTTPS: 2x to 6x faster * H2: 4x to 5x faster * H2C: 20x to 40x faster I am not sure why H2C's performance was so bad, especially compared to H2, when using default buffer sizes. Dynamic buffers make H2C a lot more viable with default settings. The performance impact on "hello world" type requests is minimal, it goes from -5% to +5% roughly. Websocket improvements vary again depending on the protocol, but also depending on whether compression is enabled: * HTTP echo: roughly 2x faster * HTTP send: roughly 4x faster * H2C echo: roughly 2x faster * H2C send: 3x to 4x faster In the echo test we reply back, and Gun doesn't have the dynamic buffer optimisation, so that probably explains the x2 difference. With compression however there isn't much improvement. The results are roughly within -10% to +10% of each other. Zlib compression seems to be a bottleneck, or at least to modify the performance profile to such an extent that the size of the buffer does not matter. This happens to randomly generated binary data as well so it is probably not caused by the test data.
2025-01-24Add initial http_perf_SUITELoïc Hoguin
2025-01-23Correcting TransOpts in send_timeout_close testsBjörn Svensson
2025-01-23Add WS compression test where only server sets client_max_window_bitsJose M Perez
When the server has a non-default value configured and the client doesn't send one the extension negotiation should fail.
2025-01-22Websocket: Also apply max_frame_size limit to decompressed dataLoïc Hoguin
Before this commit frames could "cheat" by compressing data below the limit which would get expanded above the limit. Now Cowboy will stop decompressing data when the limit is reached.
2025-01-22Add compressed Websocket to ws_perf_SUITELoïc Hoguin
2025-01-16Websocket: Allow setting the max_frame_size option dynamicallyLoïc Hoguin
This can be used to limit the maximum frame size before some authentication or other validation is completed.
2025-01-15Switch to running autobahntestsuite via DockerLoïc Hoguin
2025-01-15Avoid resetting HTTP/2 idle_timeout timer too oftenLoïc Hoguin
Following the same strategy as Websocket described in commit cbed21c383e4cebb7df5a0a8b81f18c1738bef3e Gains are comparable as far as Websocket over HTTP/2 is concerned.
2025-01-15Avoid resetting Websocket idle_timeout timer too oftenLoïc Hoguin
`perf` has shown that Cowboy spends a lot of time cancelling and starting this timer. Instead of resetting for every data received, we now only reset a field in the state. Before it was working like this: - start idle timeout timer - on trigger, close the connection - on data, cancel and start again Now it's working like this: - start idle timeout timer for a tenth of its duration, with tick number = 0 - on trigger, if tick number != 10 - start the timer again, again for a tenth of its duration - increment tick number - on trigger, if tick number = 10 - close the connection - on data, set tick number to 0
2025-01-15Add ws_perf_SUITE to measure Websocket performanceLoïc Hoguin
It benchmarks binary, ascii, mixed and japanese data using Websocket and Websocket over HTTP/2. HTTP/2 options get set to ensure that performance is better than the default HTTP/2 options. It switches to Gun and Ranch branches that include fixes that are required for tests to complete successfully.
2024-04-05Add VU#421644 to the HTTP/2 CONTINUATION Flood testLoïc Hoguin
2024-03-26Initial HTTP/3 implementationhttp3Loïc Hoguin
This includes Websocket over HTTP/3. Since quicer, which provides the QUIC implementation, is a NIF, Cowboy cannot depend directly on it. In order to enable QUIC and HTTP/3, users have to set the COWBOY_QUICER environment variable: export COWBOY_QUICER=1 In order to run the test suites, the same must be done for Gun: export GUN_QUICER=1 HTTP/3 support is currently not available on Windows due to compilation issues of quicer which have yet to be looked at or resolved. HTTP/3 support is also unavailable on the upcoming OTP-27 due to compilation errors in quicer dependencies. Once resolved HTTP/3 should work on OTP-27. Because of how QUIC currently works, it's possible that streams that get reset after sending a response do not receive that response. The test suite was modified to accomodate for that. A future extension to QUIC will allow us to gracefully reset streams. This also updates Erlang.mk.
2024-03-14Add max_fragmented_header_block_size HTTP/2 optionLoïc Hoguin
2024-01-25Refresh copyright linesLoïc Hoguin
2024-01-23Fix match_qs with constraints when key is not presentgeeksilva97
Original fix by Ali Farhadi <[email protected]>.
2024-01-18Reduce sleep in chunked_one_byte_at_a_timeLoïc Hoguin
To avoid having the connection get closed due to us taking too long on unreliable environments like GitHub Actions.
2024-01-18Retry the read_urlencoded_body_too_large if timeout triggersLoïc Hoguin
This is caused by the timeout being 1s after the period. When the CI environment is overloaded, sometimes the timeout will trigger. We retry, knowing that the timetrap will catch us if we retry too much.
2024-01-17Improve reliability of a few testsLoïc Hoguin
GitHub Actions runners are not as good as self-hosted BuildKite so some adjustments need to be made to timeouts and such.
2024-01-16REST: Allow generate_etag to return undefinedLoïc Hoguin
This allows conditionally generating an etag.
2024-01-16Confirm Websocket pong frames are received by handlersLoïc Hoguin
2024-01-16Fix an intermittent test failureLoïc Hoguin
2024-01-15Reject responses with explicit set-cookie headergeeksilva97
LH: The tests received a lot of fixes and tweaking. I also reworded the error message to be more concise.
2024-01-15Fix wrong HTTP/1 timeout being used in some casesLoïc Hoguin
Added many tests to ensure the right timeout is picked in the appropriate situation. Should there be any issues remaining we can add more tests.
2024-01-09Better error message when trying to reply twiceLoïc Hoguin
Also crash if trying to push after a reply was sent.
2024-01-09Improve the error when trying to send a 204/304 with a bodyLoïc Hoguin
2024-01-08Document body reading in auto modeLoïc Hoguin
It is now tested both via cowboy_req:read_body and via cowboy_req:cast. Removes a bad example from the guide of body reading with period of infinity, which does not work.
2024-01-08Ensure HTTP/1.1 Websocket resets the trap_exit flagLoïc Hoguin
While we are identified as a supervisor in the tree, we no longer manage children processes at that point, so do not need to trap exit signals. Users can still enable trap_exit if they prefer to.
2024-01-08Always add vary: accept-encoding in cowboy_compress_hLoïc Hoguin
We must add it even if we don't end up compressing because it indicates that we might. This indication doesn't mean that the user agent's accept-encoding values will ever result in content encoding being applied.
2024-01-05Reject HTTP/1 requests with both content-length and transfer-encodingLoïc Hoguin
The previous behavior was to accept them and drop the content-length header as per the RFC recommendation. But since this behavior is not normal it is safer to just reject such requests than risk security issues.
2024-01-05Don't automatically compress when response has etagLoïc Hoguin
In the cowboy_compress_h stream handler. Otherwise this could cause issues with caching, with the etag being the same for compressed/uncompressed content. Users that wish to send etags AND compress will have to do it manually for the time being.
2024-01-05Add cowboy:get_env/2,3Loïc Hoguin
2024-01-04Rework and improve the decompress stream handlerLoïc Hoguin
The read buffer was changed into an iovec to avoid doing too many binary concatenations and allocations. Decompression happens transparently: when decoding gzip, the content-encoding header is removed (we only decode when "gzip" is the only encoding so nothing remains). We always add a content_decoded key to the Req object. This key contains a list of codings that were decoded, in the reverse order in which they were. Currently it can only be empty or contain <<"gzip">> but future improvements or user handlers may see it contain more values. The option to disable decompression was renamed to decompress_enabled and defaults to true. It is no longer possible to enable/disable decompression in the middle of reading the body: this ensures that the data we pass forward is always valid. Various smaller improvements were made to the code, tests and manual pages.
2023-12-21Add cowboy_decompress_h stream handlerjdamanalo
2023-12-21Exit gracefully on {error,closed} when reading the PROXY headerNelson Vides
LH: Simplified the test a little.
2023-12-21Optionally reset the idle timeout when sending dataRobert J. Macomber
A new option reset_idle_timeout_on_send has been added. When set to 'true', the idle timeout is reset not only when data is received, but also when data is sent. This allows sending large responses without having to worry about timeouts triggering. The default is currently unchanged but might change in a future release. LH: Greatly reworked the implementation so that the timeout gets reset on almost all socket writes. This essentially completely supersets the original work. Tests are mostly the same although I refactored a bit to avoid test code duplication. This commit also changes HTTP/2 behavior a little when data is received: Cowboy will not attempt to update the window before running stream handler commands to avoid sending WINDOW_UPDATE frames twice. Now it has some small heuristic to ensure they can only be sent once at most.
2023-12-19Shave off a few more seconds from rfc7540_SUITELoïc Hoguin
2023-12-18Explicitly close the socket in some tests for speed upsLoïc Hoguin
The socket staying open meant that the graceful shut down of the Cowboy listeners were waiting for the connections to be closed gracefully (or a timeout). Closing explicitly where it makes sense ensures we don't unnecessarily wait. This commit removes a full minute in the run time of all Cowboy test suites (minus examples).
2023-12-18Fix shutdown for HTTP/1.1 pipelineDmitri Vereshchagin
Sending extra response prevented by terminating all streams except the one currently executing. LH: Reworded some variables to make what happens more obvious.
2023-12-15Reject invalid Connection headerBoris Pozdnyakov
LH: Small tweaks and added an HTTP/1.0 test.
2023-12-15Increase loop_handler_timeout timeoutsLoïc Hoguin
It seems that macOS GH runners don't do timeouts well.