chore(deps): update dependency org.mock-server:mockserver-netty-no-dependencies to v7.1.0#2224
Merged
renovate[bot] merged 1 commit intoJun 16, 2026
Conversation
…pendencies to v7.1.0
zeitlinger
approved these changes
Jun 16, 2026
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.
This PR contains the following updates:
7.0.0→7.1.0Release Notes
mock-server/mockserver-monorepo (org.mock-server:mockserver-netty-no-dependencies)
v7.1.0Added
Verification
httpResponsematcher to a verification (PUT /mockserver/verifywith{httpRequest?, httpResponse, times}) and MockServer counts recorded request-response pairs (proxied/forwarded exchanges) whose response matches — by status code, reason phrase (regex), headers, and body (JSON, JSON schema, JSONPath, XML, XPath, regex, etc., reusing the existing request body matchers). WhenhttpRequestis also supplied, both must match.verifySequencegains an index-alignedhttpResponseslist so an ordered sequence can assert on responses too. Theverify/verifySequencecall shape andVerificationTimesare unchanged — the presence of a response matcher is what switches verification from "request received" to "response received". When no response matcher is supplied, behaviour is identical to before.Breakpoints & request replay
PUT /mockserver/breakpoint/matcherwith{httpRequest, phases:["REQUEST"|"RESPONSE"|"RESPONSE_STREAM"|"INBOUND_STREAM"], clientId:"..."}. A forwarded/proxied exchange whose request matches a registered breakpoint pauses at the selected phase(s). Manage matchers viaGET/PUT /mockserver/breakpoint/matchers,PUT /mockserver/breakpoint/matcher/remove({id}), andPUT /mockserver/breakpoint/matcher/clear; the registry is cleared on/mockserver/reset. ThebreakpointTimeoutMillis(30000) andbreakpointMaxHeld(50) safety rails are retained.clientIdrequired for breakpoint registration; callback WebSocket is the resolution transport —PUT /mockserver/breakpoint/matcherrequires aclientIdfield (the callback WebSocket client id); omitting it returns 400. Breakpoints are resolved interactively over the callback WebSocket only — all clients (including the dashboard) resolve breakpoints over that channel./_mockserver_callback_websocketchannelforwardObject/responseObjectclients use) for interactive resolution: the client replies with a modified request (forward), a response (abort/replace), or the original (continue). Shares thebreakpointTimeoutMillisauto-continue andbreakpointMaxHeldcap rails; a client disconnect removes its breakpoints and auto-continues anything it was holding.PausedStreamFrameDTO(correlationId,streamId,sequenceNumber,direction,phase, base64body, request method/path) and a client→serverStreamFrameDecisionDTO(correlationId,action∈ CONTINUE/MODIFY/DROP/INJECT/CLOSE, optional base64body). Event-loop safe (decisions marshalled onto the channel event loop, frame bytes copied tobyte[]), with ordering and backpressure preserved and the shared timeout/max-held rails + client-disconnect auto-continue. The per-server WebSocket registry is injected per-channel (no process-global state).MockServerClient.addBreakpoint(matcher, phases…, handlers…)registers a breakpoint matcher and resolves paused exchanges interactively over the callback WebSocket, with typed handlers per phase:BreakpointRequestHandler(return a request to forward/modify or a response to abort),BreakpointResponseHandler(return the response to write), andBreakpointStreamFrameHandler(return a CONTINUE/MODIFY/DROP/INJECT/CLOSE decision). PluslistBreakpointMatchers(),removeBreakpointMatcher(id),clearBreakpointMatchers(). The client lazily opens one callback-WS connection (reused across breakpoints) and tears it down on stop/reset. Per-matcher handler routing: each pushed paused item carries the matched breakpoint's id (a newX-MockServer-BreakpointIdheader for request/response and abreakpointIdfield on the stream-frame message), so each breakpoint routes to its own handler rather than a single shared per-phase handler. This is the reference API the other language clients mirror.addBreakpoint/add_breakpoint+ convenience overloads,list/remove/clearbreakpoint matchers), resolving paused request/response/stream-frame exchanges interactively over each client's existing callback WebSocket with per-matcher handler routing (by theX-MockServer-BreakpointIdheader /breakpointIdframe field). Idiomatic per language (typed objects in Node, dicts in Python, hashes in Ruby); handlers auto-continue on error or missing handler so a buggy handler can't hang the exchange.gorilla/websocket, .NET built-inClientWebSocket, Rusttungstenite) plus the matcher-driven breakpoint API (addBreakpoint/AddBreakpoint/add_breakpoint+ convenience overloads, list/remove/clear breakpoint matchers). Each connects to/_mockserver_callback_websocket, registers aclientId, and resolves paused request/response/stream-frame exchanges over the callback WebSocket with per-matcher handler routing, auto-continuing on handler error/panic. Concurrency-safe (serialised WS writes + lazy init; Go verified with-race) and reconnect-on-dead-connection. PHP is excluded (no WebSocket support). This completes breakpoint support across seven clients (Java, Node, Python, Ruby, Go, .NET, Rust).StreamFrameBreakpointRegistry, and resolved over the callback WebSocket. Fully non-blocking (event-loop safe), with backpressure, ordered frame resolution, stream-close eviction, timeout auto-continue, and the sharedbreakpointMaxHeldcap. Activated when a matchingRESPONSE_STREAMbreakpoint matcher is registered (zero overhead otherwise).INBOUND_STREAMbreakpoints to bidirectional gRPC streaming over HTTP/3, the QUIC analogue of the HTTP/2 gRPC-bidi inbound path (Http3GrpcBidiStreamHandler). Each inbound gRPC DATA frame is parked before decoding and resolved over the callback WebSocket (continue/modify/drop/inject/close); default-off (only when anINBOUND_STREAMmatcher matches the stream). Because the QUIC driver copies each frame tobyte[]and releases it before handing off, noByteBufis held and the QUIC flow-control window is never pinned; per-frame ordering is preserved by dispatching one frame at a time and buffering the rest (bounded bymaxRequestBodySize). This completes interactive breakpoints across HTTP/1.1, HTTP/2, and HTTP/3./_mockserver_callback_websocket(the server assigns it aclientId, since a browser WebSocket can't send the registration header) and resolves paused exchanges live over the callback WebSocket — no REST polling. The panel has three tabs: Matchers (register a breakpoint matcher with a method/path matcher + phase checkboxes; list/remove/clear), Live Exchanges (paused requests/responses arrive in real time — Continue / Modify the JSON / Abort), and Live Streams (paused stream frames — Continue / Modify / Drop / Inject / Close; direction badge distinguishes INBOUND from OUTBOUND frames). A connection-state indicator shows the callback-WS status.PUT /mockserver/replaycontrol-plane endpoint re-issues a previously recorded/proxied request to its original target and returns the upstream response (reuses the existingNettyHttpClient/forward client; 10 MB body-size cap; behind control-plane auth). The dashboard Traffic view gains a Replay button on every selected request that opens a dialog to re-issue the request with one click and inspect the live response. The Java client exposes a typedreplay(HttpRequest)method wrapping the endpoint.StreamFrameBreakpointRegistrywithdirection=INBOUND. Resolved over the callback WebSocket. Fully non-blocking with backpressure (autoRead paused for WebSocket/GraphQL; pull-based ctx.read() withholding for gRPC-bidi), channel-close eviction. Activated when a matchingINBOUND_STREAMbreakpoint matcher is registered (zero overhead otherwise).OpenAPI
typeas an array (e.g.type: [string, "null"]) now generates correct example values for the primary non-null type;$refsiblings (description alongside$ref) are resolved by the parser; and thewebhookstop-level key is parsed and its operations are included when generating expectations, matching requests, and validating responses. No specification changes or version downgrades are required.Chaos engineering
PUT /mockserver/chaosExperimentendpoint starts an ordered sequence of chaos stages, each applying service-scoped chaos profiles for a configurable duration before automatically advancing to the next stage. Supports looping, status polling viaGET /mockserver/chaosExperiment, graceful stop viaDELETE /mockserver/chaosExperiment, and integrates with the C1 auto-halt circuit-breaker (an experiment halts if the safety threshold is exceeded mid-stage). Max 50 stages, 24 h per stage, one active experiment at a time.chaosAutoHaltEnabled=true), MockServer automatically disables all active service-scoped chaos profiles if the number of chaos-injected errors within a sliding window exceeds a configurable threshold, preventing chaos experiments from causing cascading outages. Reflected in themock_server_chaos_auto_halt_totalPrometheus counter and a WARN log event.HttpChaosProfilefield: Retry-After header, body truncation fraction, malformed body toggle, slow (dribbled) response chunk size/delay, quota rate-limiting (name/limit/window/error status), degradation ramp, and outage time window — so users can configure the complete fault set without writing JSON.LLM observability & cost control
otelTracesEnabled, MockServer emits a GenAI OpenTelemetry span (provider, model, token usage, finish reason) for forwarded LLM responses, using a new provider sniffer that detects the upstream from the target host (with a path-gated fallback tollmProvider); all forward paths (matched-forward, unmatched proxy-pass, breakpoint-continuation) now also emit the generic request span consistently. The agent-run analysis tools (explain_agent_run,verify_tool_call) acceptprovider:"AUTO"for provider auto-detection from recorded request paths, and the dashboard Sessions view renders the call graph for proxy-only sessions, grouping unscoped traffic by upstream host. Off by default; fully fail-soft (telemetry never affects the forwarded response).llmMetricsEnabled=true(alongsidemetricsEnabled), three new Prometheus counters track cumulative LLM token usage and estimated cost across all served and forwarded completions:mock_server_llm_input_tokens,mock_server_llm_output_tokens,mock_server_llm_cost_usd, each labeled byproviderandmodel. The forward-path response parse is gated on metrics OR tracing OR budget, so token tracking works without requiring full OTLP tracing. Default off to avoid parsing forwarded response bodies unless asked.mockserver.llmCostBudgetUsdsets a cumulative USD ceiling across all LLM completions (mocked + forwarded). When the running cost total exceeds the budget, unmatched LLM proxy forwards are blocked with a 429 response including the cumulative and budget amounts (mocked LLM responses are never blocked). Deterministic and fail-open (a negative, unset, or malformed budget never blocks traffic). Resets onHttpState.reset(). Tracked by themock_server_llm_cost_budget_trippedPrometheus counter.LlmFailoverBuilderand themock_llm_failoverMCP tool generate an ordered set of expectations that simulate a provider returning failures (e.g. 503, 429) for the first N attempts, then succeeding with a provider-correcthttpLlmResponse. UsesTimes.exactly(n)on failure expectations so they are consumed in order before falling through to the unlimited success expectation. Consecutive same-status failures are coalesced for efficiency. Point LiteLLM, Envoy AI Gateway, or an SDK's retry config at MockServer and assert failover logic deterministically.LlmChaosProfilenow supports token-based quota enforcement viatokenQuotaLimitandtokenQuotaWindowMillis, modelling real provider TPM/TPD limits. Each response's token count (fromUsageor estimated from text length) is charged against an independent fixed-window counter inLlmQuotaRegistry; when the cumulative in-window total exceeds the limit, a 429 (token_quota_exceeded) is returned. Both request-count and token quotas can coexist on the same profile.errorStatusor stateful quota 429), it now emits the provider-correct rate-limit HTTP headers that real LLM providers send (OpenAIx-ratelimit-limit-requests/x-ratelimit-remaining-requests/x-ratelimit-reset-requests, Anthropicanthropic-ratelimit-requests-*with RFC 3339 timestamps, Gemini/Bedrockretry-after). Successful responses also carry the headers when a quota is configured, so client SDK retry/backoff logic can be exercised against a mock. Ollama returns no rate-limit headers (local inference). Implemented by the pure helperLlmRateLimitHeaders(org.mockserver.llm).Mock creation & matching feedback
httpRequestmatcher binds: from method+path+query+headers+body down to method+path only. Generic captures register viaPUT /mockserver/expectationwithhttpResponse; the existing LLM capture path is unchanged.attachMismatchDiagnosticToResponse(defaultfalse) attaches closest-match diagnostic info (headerx-mockserver-closest-match+ JSON body with per-field diffs) to 404 responses for unmatched requests, so test authors can see why their mock didn't match without checking the dashboard or logs.generateRealisticExampleValues(defaultfalse) makes OpenAPI example generation produce schema/format-aware values via Datafaker (email, UUID, date, date-time, URI, hostname, IPv4/IPv6, byte, password, integers/numbers respecting min/max) instead of static placeholders, with a fixed seed for deterministic output. Existing behaviour is unchanged when the flag is off.Response templates
httpResponseTemplateandhttpForwardTemplateaccept a newtemplateFilefield (a classpath-or-filesystem path) as an alternative to the inlinetemplate, keeping large templates out of the expectation JSON. When both are set the inlinetemplatetakes precedence. Works with all three engines (Velocity, Mustache, JavaScript).httpResponsewhose body is aFILEbody can set atemplateTypeofMUSTACHEorVELOCITY, in which case the file contents are rendered as a template against the request before being returned (the status code, headers and content type still come from the static response). This combines externally stored response bodies (issue #2163) with response templating, as requested in discussion #2350. JavaScript is not supported for body files (its templates return a full response object rather than text) — usehttpResponseTemplatefor that.templateFileand templated FILE bodies — the Node, Python, Go, .NET, Ruby and Rust clients gaintemplateFileon their template models andtemplateTypeon FILE response bodies, so the two features above can be driven from each client (the PHP client, which has no template model, gains afileBody()helper).Dashboard & UI
devMode,generateRealisticExampleValues,attachMismatchDiagnosticToResponse,validateProxyOpenAPISpec,validateProxyEnforce,chaosAutoHaltEnabled,chaosAutoHaltErrorThreshold, andchaosAutoHaltWindowMillis(booleans as switches, strings and numbers as text/number fields), driven by a declarative descriptor list inconfiguration.ts. ExistinglogLevel/detailedMatchFailures/metricsEnabledcontrols are unchanged; properties not in the descriptor list remain visible read-only.mockAnyResponse, PythonExpectation.from_dict, Go/Rust deserialize-and-Upsert, C#Deserialize<Expectation>, RubyExpectation.from_hash), so every action type is representable without reimplementing each language's builder API. The Composer also gains a "Load template from file" field on the template panels and a "Body source: from file" option (with an optional template engine) on the static-response panel, surfacing thetemplateFileand templated-FILE-body features.PUT /mockserver/diffendpoint and diff dialog), pre-populated with the two selected requests.streamingblock.outputSchemafield so a mocked completion can declare a JSON schema for structured/tool-style output.wasmbody-matcher option with a module-name dropdown sourced from the uploaded WASM modules, so a custom WASM rule can be wired into an expectation from the dashboard (it previously could only be uploaded, not referenced).CLI & self-contained binary
mockserverCLI (built on picocli) withrun(default),proxy,openapi,versionandhelpsubcommands, per-command--help, short flags (-p/--port,--proxy-to,--openapi,--init,--persist,-l/--log-level) and scheme-aware proxy targets (--proxy-to https://hostinfers the port). Theorg.mockserver.cli.Mainentry point, all existing flags (-serverPort,-proxyRemotePort,-proxyRemoteHost,-logLevel) and the configuration precedence (command line > system property > environment variable > properties file) remain fully supported. Documented indocs/code/cli.mdand the Running MockServer site page.--validate-openapi <spec>and--validate-enforceon therunandproxysubcommands let users launch a validating proxy in one command, wiring directly to the existingvalidateProxyOpenAPISpec/validateProxyEnforceconfiguration properties.--devmode — opt-in--devCLI flag (orMOCKSERVER_DEV_MODE=true/-Dmockserver.devMode=true) applies laptop-appropriate defaults:maxLogEntries=1000andmaxExpectations=1000, reducing memory usage for local development and test suites. Explicit configuration always overrides dev-mode defaults. Default behaviour (without--dev) is completely unchanged.uisubcommand —mockserver ui [-p <port>]starts MockServer (default port 1080) and opens the dashboard (/mockserver/dashboard) in the default browser, printing the URL and degrading gracefully to just the URL on a headless host (server/CI/SSH). To start without opening a browser, userun.-D<key>=<value>CLI property passthrough —run/ui/proxy/openapiaccept repeatable-Doptions (e.g.mockserver run -p 1080 -Dmockserver.metricsEnabled=true), applied as JVM system properties before startup, so the launcher and jar can set any configuration property without a JVM-Dbefore-jar.-p/--port,MOCKSERVER_SERVER_PORT,mockserver.serverPort, or properties file) now prints a concise picocli usage plus a one-line actionable error instead of the legacyjava -jar …block and an empty configuration dump. Usage text reflects how MockServer was launched (mockserver …from the binary bundle,java -jar …otherwise), and-help/-versionnow behave the same as--help/--version(top-level overview).mockserverlauncher) for Linux, macOS and Windows (x86_64 + aarch64) as assets on the GitHub Release, each with a SHA-256. Download, extract, and runbin/mockserver run -p 1080— no pre-installed JVM or Docker required. Built from one host viascripts/build-binary-bundle.sh/scripts/build-all-bundles.sh.mockserver-nodebinary launcher —npx -p mockserver-node mockserver run -p 1080downloads the JVM-less binary bundle for the current platform (no Java, no Docker), verifies its SHA-256, caches it per-user, and runs it. HonoursMOCKSERVER_BINARY_BASE_URL(mirror),MOCKSERVER_SKIP_BINARY_DOWNLOAD,MOCKSERVER_BINARY_CACHEandNODE_EXTRA_CA_CERTS. Reference implementation of the on-demand-binary pattern for the client libraries.Client libraries & integrations
mockserver-client-go, pkg.go.dev), .NET (MockServerClient, NuGet), Rust (mockserver-client, crates.io) and PHP (mock-server/mockserver-client, Packagist), covering create-expectation, verify/verifySequence, clear, reset and retrieve. Each ships unit tests plus a skippable integration test.MockServerContainerfor Node, Python, .NET, Go and Rust (undermockserver-testcontainers/) that starts themockserver/mockserverimage, waits on/mockserver/statusand exposes the mapped URL.mockserver-vscode: start/stop the Docker container, open the dashboard, expectation snippets) and an initial JetBrains/IntelliJ Platform plugin scaffold (mockserver-jetbrains).Packaging & distribution channels
ghcr.io/mock-server/mockserver(copied from Docker Hub by digest, cosign-signed). Error-isolated: a GHCR failure never affects the Docker Hub / ECR publish.server.jsontoregistry.modelcontextprotocol.iounder the DNS-verifiedcom.mock-server/mockservernamespace (non-interactive auth via aned25519key in Secrets Manager + an apex TXT record). Soft-fail — never blocks a release.mockserver-bom(Bill of Materials) — a new published artifact consumers can import into theirdependencyManagementto pin every MockServer module and every third-party dependency MockServer relies on to a single, mutually consistent version. This makes downstream builds reproducible and satisfies strict version-alignment checks such as the Maven EnforcerdependencyConvergencerule, which previously flagged the differing transitive versions MockServer resolves internally (via its parent POM'sdependencyManagement) but did not export to consumers. Usage: importorg.mock-server:mockserver-bomwith<type>pom</type>and<scope>import</scope>.Onboarding & guides
docker compose uprecipes underexamples/docker-compose/for the most common use cases (mock-from-openapi,record-replay-proxy,validation-proxy,chaos-proxy), each self-contained with a short README and a "Getting started in 60 seconds" path in the repository README./mock_server/self_hosting_mockserver.html) that brings together every way to run MockServer yourself with copy-paste commands: Docker and the one-command docker-compose recipes, themockserverCLI and the JVM-less binary bundle, Helm/Kubernetes, the executable JAR, Testcontainers, initializers/persistence, and bootstrapping from a browser HAR. Linked from the repository README./mock_server/mockserver_ui.html) now documents the Traffic view's "Compare" toggle for diffing two captured requests (PUT /mockserver/diff) and the Chaos tab's complete HTTP service-chaos fault set wired toPUT /mockserver/serviceChaos(error/connection faults, body corruption, slow-response chunking, quota/rate limit, count and time windows, gradual degradation, GraphQL error envelope, and TTL).Changed
mockserver-client-javaclasspath — the Java client no longer drags the server-only engines (Velocity/Mustache templating, GraalVM JavaScript, WASM/Chicory, DataFaker, protobuf/gRPC transcoding and the Swagger/OpenAPI parser) onto a consumer's classpath when it is the only MockServer artifact depended upon. Those all run inside the server, never in the client JVM, so they are excluded from the client'smockserver-coredependency.mockserver-core's object mapper now registers its Swagger-coupled serializers only when swagger-core is present (see Fixed), so the client serialises OpenAPI expectations as plain spec strings without the parser on its classpath. In-process-server usages (e.g.mockserver-junit-jupiter→mockserver-netty) are unaffected — the engines still arrive via the server module. Verified by the full 155-test client suite, 718 core serialization/OpenAPI tests, and a runtime check that round-trips expectations with swagger genuinely absent.Fixed
Content-Lengthheader was computed with the JVM's default charset. On a platform whose default charset is not UTF-8 (e.g. Windows, where the legacy default iswindows-1252), any asset containing multi-byte characters got aContent-Lengthshorter than the actual body, so the browser truncated the bundle and the dashboard showed a white page. A JAR built on macOS (UTF-8) therefore worked there but failed on Windows.Content-Lengthis now computed from the UTF-8 byte length, matching the bytes sent.explain_unmatched_requestsMCP tool re-ran the live request matchers purely to compute field-level diffs, but that match wrote oneEXPECTATION_NOT_MATCHEDevent per expectation into the event log as a side-effect. Those entries had no request correlationId, so the dashboard could not group them, and repeated calls filled the bounded dashboard log window and evicted matched/response/received entries — making the dashboard appear to show only unmatched traffic. Read-only diagnostics now suppress match-result logging (a request-scoped flag onMatchDifference), so they no longer mutate the log they inspect.GlobalStateMutationGuardTestthat scans all test classes for high-signal static-state mutation patterns (ConfigurationPropertiessetter calls,System.setProperty/clearProperty, singleton.getInstance().reset()/.clear(),Metrics.resetAdditionalMetricsForTesting,PrometheusRegistry.defaultRegistry) and fails the build if any matched class is not in the sequential phase. Moved 17 test classes that were running in the parallel phase despite mutating global state to sequential (with symmetric exclude/include, validated byParallelStaticStateGuardTest). This closes the gap whereParallelStaticStateGuardTestonly checked list symmetry but could not detect a new stateful test missing from both lists — the root cause of 4 separate CI flake incidents.LlmBackendResolverTest,LlmProviderSnifferTest, andForwardPathGenAiSpansTestmutate JVM-globalConfigurationProperties.llm*statics but were not in the sequential Surefire phase, causing intermittent cross-test contamination underparallel=classes. Moved all three to the sequential phase (symmetric exclude/include lists, validated byParallelStaticStateGuardTest).chaosAutoHaltEnabled=truebutchaosAutoHaltErrorThresholdwas 0 or negative,recordError()appended timestamps to the sliding window without ever evicting them (the early-return skipped eviction but ran after theaddLast). The threshold check now runs before recording, so a non-positive threshold is a no-op (no timestamps accumulated, no halt). Also removed deadSparkline.tsxcomponent (zero production imports) and corrected stale consumer docs that said gRPC-bidi inbound breakpoints were "not yet intercepted (future work)" — they shipped ina8f4bb0e2.npm run demo) now registers a multi-stage looping chaos experiment so the Chaos → Experiments section shows live data out of the box.2 / 50) when a filter or search is active; clearing server logs no longer blanks the local expectations/recorded lists without refetching them; panel search now matches field values rather than serialised JSON keys (so searchingvalue/id/typeno longer matches every row); the ⌘L "clear logs" shortcut now asks for confirmation like the menu action; copy-to-clipboard failures surface a "Copy failed" tooltip instead of failing silently; the dashboard honours a?secure=true|falsequery-param override so it can target an HTTPS MockServer when itself served over HTTP; the Traffic "Replay" dialog warns that it makes a real, side-effecting call to the original target (with an extra warning for non-GET methods); and the Drift, Breakpoints and Chaos panels degrade gracefully (an "unavailable on this server" notice) instead of showing a raw error when pointed at an older MockServer that lacks those endpoints. Editing an existing LLM conversation and changing the number of turns no longer leaves a duplicate orphaned scenario on the server — the old turns are now cleared before the replacement is registered, and the action is clearly labelled as a replacement. The dashboard service-chaos form now validateserrorStatus(100–599) anderrorProbability(0.0–1.0) inline and blocks submission of out-of-range values rather than failing with a server 400..*) could exhaust browser memory — the list is now capped (oldest dropped) and cleared when the callback WebSocket disconnects, since held items reference a clientId the server replaces on reconnect; (2) the SSE parser split only on\n, so real CRLF-terminated streams mishandled the[DONE]sentinel and leaked stray carriage returns into reassembled text — line endings are now normalised first; (3) the Prometheus metrics parser retained non-finite (+Inf/-Inf/NaN) sample values that poisoned chart auto-scaling and numeric formatting (toFixed→"Infinity") — non-finite values are now skipped (histogramle="+Inf"is unaffected, as it lives in the label, not the value); (4) the TCP and gRPC service-chaos TTL countdowns decremented against the HTTP poll's timestamp (a different poll loop that kept advancing while those sections were collapsed and their data frozen), making the countdowns drift — each dataset now tracks its own poll timestamp; (5) the Traffic detail pane is wrapped in an error boundary so a parser exception on a malformed captured body shows an inline error instead of unmounting the whole inspector.graphqlinstead ofquery(the actual wire field), so the query was wiped on every edit; and a WASM body matcher had no read-back branch at all, so it fell through to a raw JSON dump. Both now round-trip correctly (covered by a new reader↔writer round-trip test). In addition, the Register button now validates base64 inline for the binary body matcher, the Error action's response bytes, and the Binary response action — malformed base64 is blocked with a clear reason instead of failing as an opaque server 400 (or throwing in the generated JavaBase64.getDecoder().decode(...)).LogGroupwas not memoised and received a fresh per-row toggle closure — it's nowReact.memo-wrapped and the panel passes a single stable toggle callback, so unchanged groups skip the work; (2) all interval-polling views (Metrics, Drift, Chaos, Breakpoints, AsyncAPI) now pause while the browser tab is hidden and resume on return, instead of scraping/parsing in the background indefinitely (with an in-flight guard so returning to the tab can't fork a duplicate poll loop); (3) the Traffic inspector caches each captured request's parsed summary (SSE reassembly + base64 decode) keyed on the item reference, so it no longer re-parses every row on every snapshot and every search keystroke.aria-label(Expand/Collapse) andaria-expanded, so they are keyboard-operable and announce their state (previously they were unlabelled icons inside mouse-only rows); the AppBar clear/reset button gained anaria-label; the connection-error banner and notification toasts are nowrole="alert"live regions; and ten Tools-menu dialogs (Clock, Configuration, OIDC, CRUD, AsyncAPI, OpenAPI/WSDL import, Pact, Explain-unmatched, Generate-stub) now expose an accessible name viaaria-labelledby.request()landed at column 0 with its builder calls jammed far to the right) because the override block was indented once when built and again by the outer re-indent pass. It now emits cleanly nested, consistently-indented Java. Added a compile-time exhaustiveness guard to the action-to-Java generator so a future action type can't silently emitundefined.TruncatedTextcomponent. Sites fixed: the Breakpoints panel's stream-frame body (which was double-truncated — cut to 40 chars and CSS-clipped) plus its id / clientId / matcher / stream-id cells (full UUIDs now recoverable), the Sessions request chips / lane headers / token-cost chips, the Drift expected/actual value cells, the Traffic master-list host+path, the Conversation model/predicate chips, and the collapsed log-entry summary. Also addedminWidth:0flex fixes so a long host/FQDN in the service-chaos rows and the filter panel no longer forces controls to wrap.auto-fitequal columns) instead of fixed-width flex-wrap rows, so columns stay aligned and fields fill the available width at any size. The AppBar's 12-view toggle strip now scrolls horizontally as a unit on narrow windows instead of wrapping mid-group.rb/polynomial-redos, CWE-1333) — the trailing-slash strip inBinaryLauncher.asset_urlusedbase.sub(%r{/+\z}, ''), whose/+\zsub-expression can restart at every/and backtrack quadratically on a base URL with a long slash run that doesn't end in/(relevant on Ruby < 3.2, which lacks the regex match cache). The base URL is operator-supplied viaMOCKSERVER_BINARY_BASE_URL, so real-world exploitability is low. The trailing-slash strip is now done with a single linear non-regex scan (the regex is removed entirely), eliminating the ReDoS surface — an earlier attempt that merely anchored the regex with a negative look-behind (%r{(?<!/)/+\z}) kept the strip linear but did not clear the CodeQL alert. Behaviour is unchanged; added regression tests for interior-slash preservation and a 100k-slash pathological input.StreamFrameBreakpointRegistryTest,ChaosExperimentOrchestratorTest, andBreakpointRegistryTestinto the sequential Surefire phase (they mutate JVM-global singletons and flaked underparallel=classes); added adefaultcase to the stream-frame decision switch inNettyResponseWriterto prevent unrecognised actions from hanging the stream; movedstreamId/reqMethod/reqPathallocation inside thestreamBreakpointsActiveguard for zero overhead on the default-off path; addedlastTerminatedStatustoChaosExperimentOrchestratorsogetStatus()reportscompleted/stopped/halted_by_auto_haltafter an experiment ends; added stream breakpoint and chaos experiment endpoints to the OpenAPI spec; added consumer-facing docs for chaos experiments; fixed the BreakpointsPanel response "Path / Reason" column to show'-'instead of the request path whenreasonPhraseis absent.NoClassDefFoundError: Could not initialize class org.mockserver.configuration.ConfigurationProperties(caused by aNullPointerExceptionduring static initialisation) whenever amockserver.propertiesfile — or the Helm chart'sapp.config.properties— contained any entries. The startup property-dump redaction added in 7.0.0 read itsSENSITIVE_SUBSTRINGSset from thePROPERTIESstatic initialiser but declared it ~3000 lines later in the class, so it was stillnullwhen class initialisation ran (a static-init ordering bug). The redaction fields are now initialised before the property file is read, with a regression test that initialisesConfigurationPropertiesafresh against a populated property file.dependencyConvergencefailures — consuming MockServer (e.g.mockserver-client-javawithMockServerContainer) under the Maven EnforcerdependencyConvergencerule failed with multiple version-conflict errors, because MockServer's transitive version pins lived in the parent POM'sdependencyManagement, which Maven does not export to consumers. Three changes address this: a newmockserver-bomto import (above); the slimmer client classpath (above); and pruning the stalevelocity-engine-core 2.3thatvelocity-tools-genericdragged in alongside the2.4.1the build already uses (all 21 Velocity engine tests still pass). With the BOM imported, a client-only consumer's convergence errors drop from 17 to 0.${jetty.version}in the parent POM — three Jetty HTTP-clientdependencyManagemententries referenced ajetty.versionproperty that was only ever defined in theexamples/javamodule, so the managed versions were unresolved for any other consumer of the published parent POM. The dead entries were removed from the parent and theexamplesmodule now declares its Jetty client versions explicitly.ObjectMapperFactoryregistered its Swagger/OpenAPI-coupled serializers (the schema serializers and the OpenAPI-derivedHttpRequestsPropertiesMatcherserializer) unconditionally, so initialising the object mapper loadedio.swagger.v3.oas.models.*even on a client that never produces those objects. They are now isolated in aSwaggerSerializershelper and registered only when swagger-core is on the classpath, which is what letsmockserver-client-javaexclude the Swagger/OpenAPI parser (eliminating the bulk of a client-only consumer's remainingdependencyConvergenceconflicts). The singlecom.github.fge(json-tools) pretty-print call on the client-reachable path was replaced with a smallJsonPrettyPrinter, andjackson-datatype-jsr310— used directly by the object mapper but previously only arriving transitively via the Swagger parser — is now a directmockserver-coredependency. Server behaviour is unchanged (swagger-core is always present there).slf4j-api(older versions viajava-uuid-generator,json-pathandcom.networknt:json-schema-validator),jackson-annotations(2.21 via the validator's Jackson 3 transitive) andjakarta.xml.bind-api(2.3.3 viaxmlunit-core).mockserver-corenow excludes those stale transitive edges; in every case it already declares the winning version directly (slf4j-api2.0.18,jackson-annotations2.22,jakarta.xml.bind-api4.0.5), so its own resolved classpath is unchanged (255 XML/JSON-schema/JSON-path core tests still pass). A consumer depending only onmockserver-client-javanow passes the Maven EnforcerdependencyConvergencerule with zero errors even without importing the BOM.Documentation
PausedStreamFrameDTO/StreamFrameDecisionDTOprotocol and theX-MockServer-BreakpointIdrouting), the dashboard Breakpoints panel, the safety rails, and idiomatic examples for all seven supported clients (Java, Node, Python, Ruby, Go, .NET, Rust — PHP is not supported). The OpenAPI spec carriesclientIdon the matcher endpoints, anddocs/code/breakpoints.mdwas consolidated (TL;DR + flow diagram, WS-callback-only resolution)./mock_server/llm_response_mocking.html) showing how to mock OpenAI / Anthropic / Gemini / Bedrock / Azure OpenAI / Ollama responses via plain expectations — including conversations, streaming and cost budgets — without needing an AI agent or MCP; Interactive Breakpoints (/mock_server/interactive_breakpoints.html) walking through pausing, inspecting, modifying and resuming requests/responses; and Observability (/mock_server/observability.html) covering Prometheus metrics (including LLM token/cost counters) and OpenTelemetry trace export with W3C context propagation. Each is linked into the site navigation.TLSv1,TLSv1.1,TLSv1.2, not "TLS 1.2 and 1.3"), matching the configuration-properties page; clarified thatdisableLoggingdisables all logging (not just system-out) on the Performance page; fixed the Running MockServer meta description ("Grunt", not "Gradle"); noted that the KuberneteshttpGetliveness probe example requiresMOCKSERVER_LIVENESS_HTTP_GET_PATHto be set (the path is off by default); reordered Getting Started so the common-path "Next Steps" precede the upgrade notes; and simplified the configuration-property precedence wording. Also corrected the internaldocs/code/configuration-reference.mdprecedence order (properties file beats environment variable) to match the code.docs/code/chaos.md(chaos experiments: ChaosExperimentOrchestrator, ordered stages, looping, auto-halt integration, safety limits, endpoints); documentedPUT /mockserver/replay(request replay) andPUT/GET/DELETE /mockserver/chaosExperimentindocs/code/request-processing.md; updateddocs/code/dashboard-ui.mdto reflect twelve views (Breakpoints + Get-Started), the Breakpoints panel (request/response/stream phases), the Get-Started onboarding view, Traffic-view Replay and Compare buttons, and the Composer snippet palette; addedgenerateRealisticExampleValues/SampleDataGeneratorcoverage todocs/code/domain-model.md; addedchaos.mdandbreakpoints.mdrows todocs/README.md; added chaos.md and broadened breakpoints row inAGENTS.md.docs/code/breakpoints.md: removed stale "Future work" section (all four items shipped — HTTP/3-gRPC, gRPC-bidi inbound, and both dashboard UI features); addedGrpcBidiStreamHandler.handleDataand `GrpcBidiRouterHandConfiguration
📅 Schedule: (UTC)
🚦 Automerge: Enabled.
♻ Rebasing: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR was generated by Mend Renovate. View the repository job log.