4d6ab1d30d
Motivation: When HttpClientUpgradeHandler upgrades from HTTP/1 to another protocol, it performs a two-step opertion: 1. Remove the SourceCodec (HttpClientCodec) 2. Add the UpgradeCodec When HttpClientCodec is removed from the pipeline, the decoder being removed triggers channelRead() event with the data left in its cumulation buffer. However, this is not received by the UpgradeCodec becuase it's not added yet. e.g. HTTP/2 SETTINGS frame sent by the server can be missed out. To fix the problem, we need to reverse the steps: 1. Add the UpgradeCodec 2. Remove the SourceCodec However, this does not work as expected either, because UpgradeCodec can send a greeting message such as HTTP/2 Preface. Such a greeting message will be handled by the SourceCodec and will trigger an 'unsupported message type' exception. To fix the problem really, we need to make the upgrade process 3-step: 1. Remove/disable the encoder of SourceCodec 2. Add the UpgradeCodec 3. Remove the SourceCodec Modifications: - Add SourceCodec.prepareUpgradeFrom() so that SourceCodec can remove or disable its encoder - Implement HttpClientCodec.prepareUpgradeFrom() properly - Miscellaneous: - Log the related channel as well When logging the failure to send a GOAWAY Result: Cleartext HTTP/1-to-HTTP/2 upgrade works again. |
||
---|---|---|
all | ||
buffer | ||
codec | ||
codec-dns | ||
codec-haproxy | ||
codec-http | ||
codec-http2 | ||
codec-memcache | ||
codec-mqtt | ||
codec-socks | ||
codec-stomp | ||
codec-xml | ||
common | ||
example | ||
handler | ||
handler-proxy | ||
license | ||
microbench | ||
resolver | ||
resolver-dns | ||
tarball | ||
testsuite | ||
testsuite-osgi | ||
transport | ||
transport-native-epoll | ||
transport-rxtx | ||
transport-sctp | ||
transport-udt | ||
.fbprefs | ||
.gitignore | ||
.travis.yml | ||
CONTRIBUTING.md | ||
LICENSE.txt | ||
NOTICE.txt | ||
pom.xml | ||
README.md | ||
run-example.sh |
Netty Project
Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients.
Links
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:
- Latest stable Oracle JDK 7
- Latest stable Apache Maven
- If you are on Linux, you need additional development packages installed on your system, because you'll build the native transport.
Note that this is build-time requirement. JDK 5 (for 3.x) or 6 (for 4.0+) is enough to run your Netty-based application.
Branches to look
The 'master' branch is where the development of the latest major version lives on. The development of all other versions takes place in each branch whose name is identical to <majorVersion>.<minorVersion>
. For example, the development of 3.9 and 4.0 resides in the branch '3.9' and the branch '4.0' respectively.