Repository navigation
test(spigot): guard the post-spawn chat path that closed a 26.3 tunneled session - #172
Merged
minekube-ai-engineer[bot] merged 1 commit intoSep 27, 2026
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Source: Discord ask-support thread
Why
SpigotChatSessionPacketFiltersits in the injected local channel's pipeline(
SpigotDataAddon.onInjectputs it directly in front of the vanilla network manager) and it handlespost-spawn traffic. A 26.3 packet shape it cannot handle therefore never fails a login: it throws
with the player already in play, the network manager answers an escaping throwable with
lost connection: Internal Exception: <cause>, and that closes the injected channel - so with it theConnect tunnel, roughly a second after spawn.
0.15.14 resolved
ServerboundChatPacket's constructor by hard-coded parameter types while Minecrafthad moved the signature component to
Optional<MessageSignature>, so every plain post-spawn chatpacket from a 1.21.5+/26.x client threw there. #170 fixed the resolution (shipped in 0.15.15) and its
test covers the rewrite by calling the private method directly; nothing asserted the pipeline
consequence, which is the part that ends a session.
What this adds
SpigotChatSessionPacketFilterPipelineTest- test-only, no production change: the real filter in areal Netty pipeline, at its production position
(
connect_data_handler -> connect_chat_session_filter -> network manager), with the network-managernode modelled the way Paper behaves (record the throwable that escapes a handler, then close the
connection). Asserted:
drops the session-only packets, and delivers the chat to the network manager rewritten exactly once
unchanged), plus the signature-absent variant;
Two one-class stubs (
ServerboundChatAckPacket,ServerboundChatSessionUpdatePacket) join theexisting
net.minecraft...test stubs so the filter's class-name drop path is exercised too.RED before / GREEN after
Reverting only the filter file to its 0.15.14 content (tests unchanged) reds 5 of 8:
On the unfixed revision the throwable is recorded by the network-manager node, not by
CommonDataHandler.channelRead's catch (the captured test stderr contains noprintStackTrace) -which is why the player-visible line is Paper's
Internal Exceptionrather than a quiet close. Liveagainst Paper 26.3 the same hard-coded lookup is a
NoSuchMethodException(the raw 5-arg constructorno longer exists); the dual-shape test stub surfaces it one step later as
IllegalArgumentException: argument type mismatchfrom the same lookup.GREEN:
./gradlew build(what CI runs) isBUILD SUCCESSFUL- 444 test cases (core 375, spigot 33,velocity 32, bungee 4), 0 failures/errors; the new class passes 6/6.
Scope
This is the missing guard for #170's fix, not a new fix, and it is not a claim about the ~15 %
probabilistic 26.3 post-join teardown that the customer reported - that one is still unlocated.