Go to file
Frédéric Brégier 93f021141d
Fix behavior of HttpPostMultipartRequestDecoder for Memory based Factory (#11145)
Motivation:
When Memory based Factory is used, if the first chunk starts with Line Break, the HttpData
is not filled with the current available buffer if the delimiter is not found yet, while it may
add some.

Fix JavaDoc to note potential wrong usage of content() or getByteBuf() if HttpDatais has
a huge content with the risk of Out Of Memory Exception.

Fix JavaDoc to explain how to release properly the Factory, whatever it is in Memory,
Disk or Mixed mode.

Fix issue #11143

Modifications:
First, when the delimiter is not found, instead of searching Line Break from readerIndex(), we should search
from readerIndex() + readableBytes() - delimiter size, since this is the only part where usefull
Line Break could be searched for, except if readableBytes is less than delimiter size (then we search from
readerIndex).

Second, when a Memory HttpData is created, it should be assigned an empty buffer to be
consistent with the other implementations (Disk or Mixed mode).
We cannot change the default behavior of the content() or getByteBuf() of the Memory based HttpData
since the ByteBuf is supposed to be null when released, but not empty.
When a new ByteBuf is added, one more check verifies if the current ByteBuf is empty, and if so, it
is released and replaced by the new one, without creating a new CompositeByteBuf.

Result:
In the tests testBIgFileUploadDelimiterInMiddleChunkDecoderMemoryFactory and related for other modes,
the buffers are starting with a CRLF.
When we offer only the prefix part of the multipart (no data at all), the current Partial HttpData has
an empty buffer.
The first time we offer the data starting with CRLF to the decoder, it now
has a correct current Partial HttpData with a buffer not empty.

The Benchmark was re-run against this new version.

Old Benchmark                                                                       Mode  Cnt  Score   Error   Units
HttpPostMultipartRequestDecoderBenchmark.multipartRequestDecoderBigAdvancedLevel   thrpt    6  4,037 ± 0,358  ops/ms
HttpPostMultipartRequestDecoderBenchmark.multipartRequestDecoderBigDisabledLevel   thrpt    6  4,226 ± 0,471  ops/ms
HttpPostMultipartRequestDecoderBenchmark.multipartRequestDecoderBigParanoidLevel   thrpt    6  0,875 ± 0,029  ops/ms
HttpPostMultipartRequestDecoderBenchmark.multipartRequestDecoderBigSimpleLevel     thrpt    6  4,346 ± 0,275  ops/ms
HttpPostMultipartRequestDecoderBenchmark.multipartRequestDecoderHighAdvancedLevel  thrpt    6  2,044 ± 0,020  ops/ms
HttpPostMultipartRequestDecoderBenchmark.multipartRequestDecoderHighDisabledLevel  thrpt    6  2,278 ± 0,159  ops/ms
HttpPostMultipartRequestDecoderBenchmark.multipartRequestDecoderHighParanoidLevel  thrpt    6  0,174 ± 0,004  ops/ms
HttpPostMultipartRequestDecoderBenchmark.multipartRequestDecoderHighSimpleLevel    thrpt    6  2,370 ± 0,065  ops/ms

New Benchmark                                                                       Mode  Cnt  Score   Error   Units
HttpPostMultipartRequestDecoderBenchmark.multipartRequestDecoderBigAdvancedLevel   thrpt    6  5,604 ± 0,415  ops/ms
HttpPostMultipartRequestDecoderBenchmark.multipartRequestDecoderBigDisabledLevel   thrpt    6  6,058 ± 0,111  ops/ms
HttpPostMultipartRequestDecoderBenchmark.multipartRequestDecoderBigParanoidLevel   thrpt    6  0,914 ± 0,031  ops/ms
HttpPostMultipartRequestDecoderBenchmark.multipartRequestDecoderBigSimpleLevel     thrpt    6  6,053 ± 0,051  ops/ms
HttpPostMultipartRequestDecoderBenchmark.multipartRequestDecoderHighAdvancedLevel  thrpt    6  2,636 ± 0,141  ops/ms
HttpPostMultipartRequestDecoderBenchmark.multipartRequestDecoderHighDisabledLevel  thrpt    6  3,033 ± 0,181  ops/ms
HttpPostMultipartRequestDecoderBenchmark.multipartRequestDecoderHighParanoidLevel  thrpt    6  0,178 ± 0,006  ops/ms
HttpPostMultipartRequestDecoderBenchmark.multipartRequestDecoderHighSimpleLevel    thrpt    6  2,859 ± 0,189  ops/ms

So +20 to +40% improvement due to not searching for CRLF/LF into the full buffer when no delimiter is found,
but only from the end and delimiter size + 2 (CRLF).
2021-04-16 11:01:15 +02:00
.github Github Actions dawidd6/action-download-artifact set workflow_conclusion (#11096) 2021-03-17 12:18:50 -07:00
.mvn Use latest maven release (#9820) 2019-11-27 14:45:28 +01:00
all [maven-release-plugin] prepare for next development iteration 2021-04-01 10:50:23 +00:00
bom [maven-release-plugin] prepare for next development iteration 2021-04-01 10:50:23 +00:00
buffer [maven-release-plugin] prepare for next development iteration 2021-04-01 10:50:23 +00:00
codec [maven-release-plugin] prepare for next development iteration 2021-04-01 10:50:23 +00:00
codec-dns [maven-release-plugin] prepare for next development iteration 2021-04-01 10:50:23 +00:00
codec-haproxy [maven-release-plugin] prepare for next development iteration 2021-04-01 10:50:23 +00:00
codec-http Fix behavior of HttpPostMultipartRequestDecoder for Memory based Factory (#11145) 2021-04-16 11:01:15 +02:00
codec-http2 [maven-release-plugin] prepare for next development iteration 2021-04-01 10:50:23 +00:00
codec-memcache [maven-release-plugin] prepare for next development iteration 2021-04-01 10:50:23 +00:00
codec-mqtt [maven-release-plugin] prepare for next development iteration 2021-04-01 10:50:23 +00:00
codec-redis [maven-release-plugin] prepare for next development iteration 2021-04-01 10:50:23 +00:00
codec-smtp [maven-release-plugin] prepare for next development iteration 2021-04-01 10:50:23 +00:00
codec-socks [maven-release-plugin] prepare for next development iteration 2021-04-01 10:50:23 +00:00
codec-stomp [maven-release-plugin] prepare for next development iteration 2021-04-01 10:50:23 +00:00
codec-xml [maven-release-plugin] prepare for next development iteration 2021-04-01 10:50:23 +00:00
common [maven-release-plugin] prepare for next development iteration 2021-04-01 10:50:23 +00:00
dev-tools [maven-release-plugin] prepare for next development iteration 2021-04-01 10:50:23 +00:00
docker Let's use gcc10 when cross-compiling for LSE support (#11112) 2021-03-25 09:32:57 +01:00
example [maven-release-plugin] prepare for next development iteration 2021-04-01 10:50:23 +00:00
handler SslHandler consolidate state to save memory (#11160) 2021-04-15 08:18:54 -07:00
handler-proxy [maven-release-plugin] prepare for next development iteration 2021-04-01 10:50:23 +00:00
license Enable nohttp check during the build (#10708) 2020-10-23 14:44:18 +02:00
microbench [maven-release-plugin] prepare for next development iteration 2021-04-01 10:50:23 +00:00
resolver [maven-release-plugin] prepare for next development iteration 2021-04-01 10:50:23 +00:00
resolver-dns [maven-release-plugin] prepare for next development iteration 2021-04-01 10:50:23 +00:00
resolver-dns-native-macos [maven-release-plugin] prepare for next development iteration 2021-04-01 10:50:23 +00:00
scripts Also build modules we depend on when finish the release 2021-03-30 12:03:14 +02:00
tarball [maven-release-plugin] prepare for next development iteration 2021-04-01 10:50:23 +00:00
testsuite [maven-release-plugin] prepare for next development iteration 2021-04-01 10:50:23 +00:00
testsuite-autobahn [maven-release-plugin] prepare for next development iteration 2021-04-01 10:50:23 +00:00
testsuite-http2 [maven-release-plugin] prepare for next development iteration 2021-04-01 10:50:23 +00:00
testsuite-native [maven-release-plugin] prepare for next development iteration 2021-04-01 10:50:23 +00:00
testsuite-native-image [maven-release-plugin] prepare for next development iteration 2021-04-01 10:50:23 +00:00
testsuite-native-image-client [maven-release-plugin] prepare for next development iteration 2021-04-01 10:50:23 +00:00
testsuite-native-image-client-runtime-init [maven-release-plugin] prepare for next development iteration 2021-04-01 10:50:23 +00:00
testsuite-osgi [maven-release-plugin] prepare for next development iteration 2021-04-01 10:50:23 +00:00
testsuite-shading [maven-release-plugin] prepare for next development iteration 2021-04-01 10:50:23 +00:00
transport [maven-release-plugin] prepare for next development iteration 2021-04-01 10:50:23 +00:00
transport-blockhound-tests [maven-release-plugin] prepare for next development iteration 2021-04-01 10:50:23 +00:00
transport-native-epoll Less blocking in ChunkedStream (#11150) 2021-04-12 13:40:14 +02:00
transport-native-kqueue [maven-release-plugin] prepare for next development iteration 2021-04-01 10:50:23 +00:00
transport-native-unix-common [maven-release-plugin] prepare for next development iteration 2021-04-01 10:50:23 +00:00
transport-native-unix-common-tests [maven-release-plugin] prepare for next development iteration 2021-04-01 10:50:23 +00:00
transport-rxtx [maven-release-plugin] prepare for next development iteration 2021-04-01 10:50:23 +00:00
transport-sctp [maven-release-plugin] prepare for next development iteration 2021-04-01 10:50:23 +00:00
transport-udt [maven-release-plugin] prepare for next development iteration 2021-04-01 10:50:23 +00:00
.fbprefs Updated Find Bugs configuration 2009-03-04 10:33:09 +00:00
.gitattributes Include mvn wrapper to make setup of development env easier 2018-01-26 08:13:17 +01:00
.gitignore Ignore .shelf/ folder generated by IntelliJ IDEA (#10445) 2020-08-03 07:51:53 +02:00
.lgtm.yml Enables lgtm.com to process this project and create a CodeQL database 2020-01-17 11:05:53 +01:00
CONTRIBUTING.md Change the netty.io homepage scheme(http -> https) (#9344) 2019-07-09 21:09:42 +02:00
LICENSE.txt Enable nohttp check during the build (#10708) 2020-10-23 14:44:18 +02:00
mvnw Enable nohttp check during the build (#10708) 2020-10-23 14:44:18 +02:00
mvnw.cmd Enable nohttp check during the build (#10708) 2020-10-23 14:44:18 +02:00
nohttp-checkstyle-suppressions.xml Ensure Checkstyle suppression for dependency-reduced-pom.xml on Windows (#10899) 2021-01-01 19:30:13 +01:00
nohttp-checkstyle.xml Enable nohttp check during the build (#10708) 2020-10-23 14:44:18 +02:00
NOTICE.txt Fix License type of dnsinfo (#10773) 2020-11-04 10:40:43 +01:00
pom.xml [maven-release-plugin] prepare for next development iteration 2021-04-01 10:50:23 +00:00
README.md Fix url in README.md (#10915) 2021-01-11 07:48:58 +01:00
run-example.sh Add DNS client examples for run-example.sh (#10283) 2020-05-14 12:10:32 +02:00
SECURITY.md Added a security policy (#10692) 2020-10-15 20:39:37 +02:00

Build project

Netty Project

Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients.

How to build

For the detailed information about building and developing Netty, please visit the developer guide. This page only gives very basic information.

You require the following to build Netty:

Note that this is build-time requirement. JDK 5 (for 3.x) or 6 (for 4.0+ / 4.1+) is enough to run your Netty-based application.

Branches to look

Development of all versions takes place in each branch whose name is identical to <majorVersion>.<minorVersion>. For example, the development of 3.9 and 4.1 resides in the branch '3.9' and the branch '4.1' respectively.

Usage with JDK 9+

Netty can be used in modular JDK9+ applications as a collection of automatic modules. The module names follow the reverse-DNS style, and are derived from subproject names rather than root packages due to historical reasons. They are listed below:

  • io.netty.all
  • io.netty.buffer
  • io.netty.codec
  • io.netty.codec.dns
  • io.netty.codec.haproxy
  • io.netty.codec.http
  • io.netty.codec.http2
  • io.netty.codec.memcache
  • io.netty.codec.mqtt
  • io.netty.codec.redis
  • io.netty.codec.smtp
  • io.netty.codec.socks
  • io.netty.codec.stomp
  • io.netty.codec.xml
  • io.netty.common
  • io.netty.handler
  • io.netty.handler.proxy
  • io.netty.resolver
  • io.netty.resolver.dns
  • io.netty.transport
  • io.netty.transport.epoll (native omitted - reserved keyword in Java)
  • io.netty.transport.kqueue (native omitted - reserved keyword in Java)
  • io.netty.transport.unix.common (native omitted - reserved keyword in Java)
  • io.netty.transport.rxtx
  • io.netty.transport.sctp
  • io.netty.transport.udt

Automatic modules do not provide any means to declare dependencies, so you need to list each used module separately in your module-info file.