Skip to content

fix: proxy streams fail fast on oversized or stalled responses#97235

Merged
vincentkoc merged 2 commits into
openclaw:mainfrom
zhangguiping-xydt:fix/problem-proxy-bounded-sse-guards
Jun 28, 2026
Merged

fix: proxy streams fail fast on oversized or stalled responses#97235
vincentkoc merged 2 commits into
openclaw:mainfrom
zhangguiping-xydt:fix/problem-proxy-bounded-sse-guards

Conversation

@zhangguiping-xydt

@zhangguiping-xydt zhangguiping-xydt commented Jun 27, 2026

Copy link
Copy Markdown
Contributor

Summary

What problem does this PR solve?

  • Fixes an issue where proxied model streams could fail too early because the client-side proxy read guard always used a hard-coded 120 second idle window, even when the caller configured a longer model/request timeout.
  • Root cause: streamProxy introduced a proxy-local idle read guard, but the guard did not consume the existing stream timeoutMs option and the proxy request body did not forward timeoutMs to the proxy server.
  • Fix classification: root-cause compatibility fix for the proxy response read boundary.

Why does this matter now?

  • Why it matters / User impact: the original PR intentionally made oversized or silent proxy responses fail closed, but a fixed 120 second idle window could still break legitimate slow proxy deployments that explicitly configure a longer request timeout.
  • Honoring the configured timeout removes that compatibility risk without weakening the default fail-fast behavior.

What is the intended outcome?

  • Maintainer-ready confidence: high for this scoped follow-up; it changes only proxy option forwarding and timeout resolution, with focused regression coverage and local HTTP proxy-style proof.
  • Proxy streams with no explicit positive timeout still fail after the existing 120 second idle window.
  • Proxy streams with a longer positive timeoutMs use that configured window for SSE chunk reads and bounded non-2xx error-body reads.
  • The proxy request body now forwards timeoutMs to the proxy server together with the other serializable stream options.

What is intentionally out of scope?

  • What did NOT change: this does not change public config, schema, migration behavior, provider routing, auth behavior, SSE event schema, or the /api/stream endpoint contract.
  • Out of scope: tuning the existing 16 MiB byte caps, removing the fail-closed behavior, changing provider-specific streaming code, or adding new user configuration.

What does success look like?

A configured proxied stream can wait beyond 120 seconds when timeoutMs is set higher, while the default path still fails stalled proxy reads after 120 seconds and oversized response bodies remain bounded.

What should reviewers focus on?

  • Why this is root-cause fix: the invariant is that proxy-side read idleness should be derived from the same positive stream timeout already used for provider/request timing, not from a second hard-coded constant hidden inside streamProxy. The patch fixes that source boundary by forwarding timeoutMs, resolving it once with resolvePositiveTimerTimeoutMs, and passing the resolved value to both proxy error-body reads and SSE chunk reads.
  • Architecture / source-of-truth check: resolvePositiveTimerTimeoutMs remains the canonical positive timer normalization helper; streamProxy owns only proxy response read behavior and does not introduce a new config source, provider-routing rule, schema field, or endpoint contract.
  • Related open PR / same-contract scan: fix(runtime/proxy): bound streaming success-body SSE reads at 16 MiB #96768 and fix(proxy): bound SSE parser via complete-line cap at 1 MiB #97191 overlap the same streamProxy hardening area; this follow-up does not compete on their byte-cap policy and only repairs the configured idle-timeout compatibility boundary in fix: proxy streams fail fast on oversized or stalled responses #97235.
  • Patch quality notes: the timeout-related code is deliberate root-cause behavior, not a retry or sleep fallback; the catch paths preserve existing proxy error handling while allowing bounded body-read failures to surface; the unknown as ReadableStreamDefaultReader casts are confined to test fixtures that emulate browser reader objects for deterministic pending/cancel behavior.

Linked context

Which issue does this close?

Existing PR update for #97235; no separate linked GitHub issue is resolved by this follow-up.

Which issues, PRs, or discussions are related?

Was this requested by a maintainer or owner?

No maintainer directly requested this exact follow-up. It addresses the ClawSweeper compatibility finding that a legitimate proxied stream silent for more than 120 seconds would otherwise fail before later content arrives.

Real behavior proof

  • Behavior or issue addressed: streamProxy now honors a positive configured timeoutMs for proxy read idleness instead of forcing the 120 second default on every proxied SSE/error-body read.

  • Real environment tested: local OpenClaw PR worktree with the production streamProxy implementation and a real local HTTP /api/stream server that accepts the proxy request and intentionally leaves the SSE response open without bytes.

  • Exact steps or command run after this patch: daily-fix bounded live proof ran a TypeScript harness with corepack [email protected] exec tsx, plus focused proxy runtime tests and focused agents type checking.

  • Evidence after fix (screenshot, recording, terminal capture, console output, redacted runtime log, linked artifact, or copied live output):

    configured-proxy-sse-idle-timeout live proof:
    requestOptionsTimeoutMs: 250
    configuredTimeoutMs: 250
    stopReason: error
    errorMessage: Proxy SSE stream stalled: no data received for 250ms
    durationMs: 329
    
    Validation `proxy-runtime-test` (pass, exit_code=0, 14321ms):
    $ node scripts/test-projects.mjs -- src/agents/runtime/proxy.test.ts
    [test] starting test/vitest/vitest.agents.config.ts
    
     RUN  v4.1.8 [local path redacted]
    
     Test Files  1 passed (1)
          Tests  10 passed (10)
       Start at  15:14:56
       Duration  2.50s (transform 2.13s, setup 1.14s, import 172ms, tests 828ms, environment 0ms)
    
    [test] passed 1 Vitest shard in 13.13s
    
    Validation `agents-test-types` (pass, exit_code=0, 28741ms):
    Validation result: pass, exit_code=0, 28741ms
    
  • Observed result after fix: the proxy request carried the configured 250ms timeout, and the stalled real HTTP SSE response failed with Proxy SSE stream stalled: no data received for 250ms, proving the proxy idle guard no longer clamps the read to the old default.

  • What was not tested: no hosted proxy, external provider, Control UI, or full chat flow was used; the proof uses a local HTTP server because this change is at the client-side streamProxy response boundary and needs deterministic stalled-response control.

  • Proof limitations or environment constraints: this follow-up validates the affected proxy boundary directly; maintainer acceptance is still needed for the broader 16 MiB caps and default 120 second fail-closed policy.

Tests and validation

Which commands did you run?

  • Target test file: src/agents/runtime/proxy.test.ts.
corepack [email protected] test -- src/agents/runtime/proxy.test.ts
corepack [email protected] exec tsgo -p test/tsconfig/tsconfig.core.test.agents.json --noEmit --pretty false
daily_fix.sh bounded-live-proof -- corepack [email protected] exec tsx proxy-configured-timeout-live-proof.ts

What regression coverage was added or updated?

  • Scenario locked in: a streamProxy call with timeoutMs: 180000 remains unresolved after 120 seconds, does not cancel the reader early, and then fails at 180 seconds with Proxy SSE stream stalled: no data received for 180000ms.
  • Existing idle-timeout coverage still proves the default path fails after 120 seconds.
  • The local HTTP proof locks the real request/response boundary by showing the proxy request carries timeoutMs and the stalled SSE response fails on the configured value.

What failed before this fix, if known?

  • Why this is the smallest reliable guardrail: before this follow-up, the new regression test failed at 120 seconds with Proxy SSE stream stalled: no data received for 120000ms even though timeoutMs: 180000 was provided; fixing option forwarding and read-timeout resolution addresses the source of that wrong timer value without adding config or changing byte caps.

If no test was added, why not?

A focused regression test was added in src/agents/runtime/proxy.test.ts, and an additional local HTTP proxy-style proof was captured for the configured-timeout behavior.

Risk checklist

Did user-visible behavior change? (Yes/No)

Yes, but only for proxied streams that set a positive timeoutMs: those streams may now wait longer than the previous hard-coded 120 second proxy read idle window.

Did config, environment, or migration behavior change? (Yes/No)

No. This uses an existing stream option and does not add config, environment variables, migrations, or new user-facing settings.

Did security, auth, secrets, network, or tool execution behavior change? (Yes/No)

No auth, secrets, or tool execution behavior changed. The network read boundary still fails closed for oversized bodies and stalled reads; the idle duration now follows the existing positive timeout option when present.

What is the highest-risk area?

  • Risk labels considered: compatibility and message-delivery behavior in the proxied streaming path.
  • Risk explanation: the follow-up allows a configured proxy stream to stay open longer than 120 seconds, but only when the caller already supplied a positive timeoutMs; the default 120 second behavior and 16 MiB fail-closed caps remain unchanged.

How is that risk mitigated?

  • Why acceptable: positive timeout handling uses the existing resolvePositiveTimerTimeoutMs helper, so non-positive or invalid values still fall back to 120 seconds.
  • The timeout is resolved once per streamProxy call and passed to both non-2xx error-body reads and SSE chunk reads, keeping behavior consistent within the proxy response boundary.
  • Focused tests cover the default 120 second path and the longer configured timeout path, and local HTTP proof covers the real proxy request/response boundary.

Current review state

What is the next action?

Submit this follow-up through the daily-fix submit-pr flow and let the remote PR checks and labels settle.

What is still waiting on author, maintainer, CI, or external proof?

Which bot or reviewer comments were addressed?

@openclaw-barnacle openclaw-barnacle Bot added agents Agent runtime and tooling size: M labels Jun 27, 2026
@clawsweeper

clawsweeper Bot commented Jun 27, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs changes before merge. Reviewed June 28, 2026, 4:01 PM ET / 20:01 UTC.

Summary
The PR adds proxy response byte caps, SSE idle-read timeouts, request timeout handling, forwards timeoutMs, expands proxy runtime tests, and removes one duplicate LINE test regex.

PR surface: Source +149, Tests +318. Total +467 across 3 files.

Reproducibility: yes. from source and PR proof. Current main has fallback-preserving bounded non-OK proxy error coverage, while the PR head rethrows bounded body failures; the PR body also supplies live local HTTP output for configured timeout behavior.

Review metrics: 2 noteworthy metrics.

  • Proxy Runtime Thresholds: 3 added or changed. The 16 MiB error/SSE caps and 120 second default idle window are runtime behavior boundaries maintainers must accept before merge.
  • Overlapping Proxy Hardening: 2 open PRs, 1 merged subpath. The same streamProxy loop has open total-body and per-event guard PRs, and the non-OK error-body bound is already merged on main.

Merge readiness
Overall: 🦐 gold shrimp
Proof: 🦞 diamond lobster
Patch quality: 🦐 gold shrimp
Result: needs maintainer review before merge.

Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch.

Rank-up moves:

  • Preserve current-main fallback behavior for bounded non-OK proxy error-body failures.
  • Have maintainers accept or tune the 16 MiB caps and 120 second default idle window.
  • Coordinate the final merge order with the two open proxy-hardening PRs touching the same loop.

Risk before merge

  • [P2] The latest PR head still changes current-main oversized or stalled non-OK proxy error fallback behavior from the merged status/statusText fallback to a new Proxy error body... message.
  • [P1] The PR intentionally adds 16 MiB proxy error/SSE caps and a 120 second default idle window, so maintainers need to accept or tune those fail-closed runtime thresholds before merge.
  • [P1] Two open PRs touch the same streamProxy loop, so final total-body, line/tail, error-body, and idle-read policy can drift if merge order is not coordinated.

Maintainer options:

  1. Preserve Current Error Fallback (recommended)
    Keep current-main Proxy error: <status> <statusText> fallback when bounded non-OK body reads overflow or time out, while still cancelling the body and honoring timeoutMs.
  2. Accept Or Tune Proxy Limits
    Maintainers can explicitly accept the 16 MiB caps and 120 second default idle window, or tune them and refresh focused proxy proof before merge.
  3. Sequence The Overlapping Proxy PRs
    Choose whether this broader PR lands before, after, or instead of the narrower proxy hardening PRs so total-body, line/tail, error-body, and idle policies remain deliberate.
Copy recommended automerge instruction
@clawsweeper automerge

Special instructions:
Preserve the current non-OK proxy status/statusText fallback when bounded proxy error-body reads overflow or time out; keep timeout-aware bounded cancellation and update focused proxy tests accordingly.

Next step before merge

  • [P2] A narrow automated repair can preserve the merged non-OK proxy fallback; maintainers still need to accept the thresholds and sequence overlapping proxy PRs before merge.

Security
Cleared: No workflow, dependency, lockfile, secret, package, or downloaded-code surface changed; the security-sensitive effect is bounded network-read availability hardening.

Review findings

  • [P2] Preserve the merged proxy error fallback — src/agents/runtime/proxy.ts:333-334
Review details

Best possible solution:

Preserve the current non-OK proxy fallback while adding timeout-aware bounded reads, then land one coherent proxy hardening sequence after maintainers accept or tune the runtime limits.

Do we have a high-confidence way to reproduce the issue?

Yes from source and PR proof. Current main has fallback-preserving bounded non-OK proxy error coverage, while the PR head rethrows bounded body failures; the PR body also supplies live local HTTP output for configured timeout behavior.

Is this the best way to solve the issue?

No, not as written. The proxy response boundary is the right layer, but the non-OK body catch should preserve current fallback behavior while maintainers decide the fail-closed thresholds and overlapping PR sequence.

Full review comments:

  • [P2] Preserve the merged proxy error fallback — src/agents/runtime/proxy.ts:333-334
    Current main already bounds oversized non-OK proxy bodies and falls back to Proxy error: <status> <statusText> when parsing, overflow, or body read failures occur. Re-throwing Proxy error body... here replaces that merged behavior for oversized or stalled error bodies, so keep the fallback unless maintainers explicitly choose a new error contract.
    Confidence: 0.86

Overall correctness: patch is incorrect
Overall confidence: 0.86

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against f4201578e50c.

Label changes

Label justifications:

  • P2: The PR changes focused agent-runtime proxy stream reliability behavior with limited blast radius and no evidence of an active outage.
  • merge-risk: 🚨 compatibility: Fail-closed proxy byte and idle thresholds can change behavior for existing proxied deployments, and the PR currently changes a merged fallback message.
  • merge-risk: 🚨 message-delivery: Proxy stream idle handling can now error before later content if the configured or default idle window is exceeded.
  • rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🦞 diamond lobster and patch quality is 🦐 gold shrimp.
  • status: ⏳ waiting on author: ClawSweeper has contributor-facing work open and is waiting for author action. Sufficient (live_output): The PR body includes copied live local HTTP proxy output showing timeoutMs forwarding and a stalled stream failing on the configured timeout, plus focused test and typecheck output.
  • proof: sufficient: Contributor real behavior proof is sufficient. The PR body includes copied live local HTTP proxy output showing timeoutMs forwarding and a stalled stream failing on the configured timeout, plus focused test and typecheck output.
Evidence reviewed

PR surface:

Source +149, Tests +318. Total +467 across 3 files.

View PR surface stats
Area Files Added Removed Net
Source 1 159 10 +149
Tests 2 364 46 +318
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 3 523 56 +467

Acceptance criteria:

  • [P1] node scripts/run-vitest.mjs src/agents/runtime/proxy.test.ts.
  • [P1] corepack pnpm tsgo -p test/tsconfig/tsconfig.core.test.agents.json --noEmit --pretty false.

What I checked:

  • Root policy applied: Root policy treats fail-closed runtime behavior, fallback changes, and provider/runtime paths as compatibility-sensitive review input. (AGENTS.md:21, f4201578e50c)
  • Scoped agent policy applied: The scoped agent guide was read and supports focused behavior-oriented runtime tests for this agent-runtime path. (src/agents/AGENTS.md:1, f4201578e50c)
  • Current-main fallback behavior: Current main initializes Proxy error: <status> <statusText>, tries the bounded JSON reader, swallows parse/overflow failures, and then throws the fallback message. (src/agents/runtime/proxy.ts:182, f4201578e50c)
  • Current-main regression coverage: Current main has a regression test for oversized proxy error JSON responses that expects Proxy error: 502 Bad Gateway and verifies the body read stopped early. (src/agents/runtime/proxy.test.ts:198, f4201578e50c)
  • PR-head fallback regression: The PR head rethrows bounded non-OK proxy body errors when the message starts with Proxy error body, replacing the merged status/statusText fallback for oversized or stalled error bodies. (src/agents/runtime/proxy.ts:333, e8bbba90d8be)
  • PR-head test locks changed error contract: The replacement proxy error-body test now expects Proxy error body exceeded 16777216 bytes instead of the current-main fallback message. (src/agents/runtime/proxy.test.ts:218, e8bbba90d8be)

Likely related people:

  • zhangguiping-xydt: Authored merged proxy error-body fallback-preserving fix Bound proxy error response JSON parsing to avoid loading huge bodies #97351, which this PR must preserve, and authored the main proxy hardening commit in this PR. (role: recent adjacent contributor; confidence: high; commits: 27c1685f106d, 79c3183b0db2; files: src/agents/runtime/proxy.ts, src/agents/runtime/proxy.test.ts)
  • wangmiao0668000666: Authored the shared SSE byte guard work and open related proxy total-body/per-event hardening PRs that overlap this PR's streamProxy loop. (role: adjacent proxy hardening contributor; confidence: high; commits: 5880e0afc4dc, 87d72e2e20ee, caa27dc8b4ea; files: src/agents/streaming-byte-guard.ts, src/agents/runtime/proxy.ts, src/agents/runtime/proxy.test.ts)
  • vincentkoc: Recent history includes proxy reader cleanup in this file and the latest PR-head commit came from this account, making them a likely routing candidate for sequencing and fallback review. (role: recent area contributor and reviewer; confidence: medium; commits: 3c01716c828c, e8bbba90d8be; files: src/agents/runtime/proxy.ts, src/agents/runtime/proxy.test.ts, extensions/line/src/message-cards.test.ts)
  • steipete: The broad agent-runtime internalization commit carried this proxy runtime path into the current owner boundary, so it is useful context for maintainer routing. (role: major runtime refactor contributor; confidence: medium; commits: bb46b79d3c14; files: src/agents/runtime/proxy.ts, src/agents/runtime/proxy.test.ts)
What the crustacean ranks mean
  • 🦀 challenger crab: rare, exceptional readiness with strong proof, clean implementation, and convincing validation.
  • 🦞 diamond lobster: very strong readiness with only minor maintainer review expected.
  • 🐚 platinum hermit: good normal PR, likely mergeable with ordinary maintainer review.
  • 🦐 gold shrimp: useful signal, but proof or patch confidence is still limited.
  • 🦪 silver shellfish: thin signal; proof, validation, or implementation needs work.
  • 🧂 unranked krab: not merge-ready because proof is missing/unusable or there are serious correctness or safety concerns.
  • 🌊 off-meta tidepool: rating does not apply to this item.

Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

How this review workflow works
  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.

@clawsweeper clawsweeper Bot added rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. P2 Normal backlog priority with limited blast radius. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. merge-risk: 🚨 message-delivery 🚨 May drop, duplicate, misroute, suppress, or wrongly target messages. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. and removed rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels Jun 27, 2026
@zhangguiping-xydt zhangguiping-xydt changed the title src/agents/runtime/proxy.ts: bound non-2xx response.json reads and add SSE pending buffer cap plus idle timeout re-arm fix: proxy streams fail fast on oversized or stalled responses Jun 28, 2026
@vincentkoc
vincentkoc force-pushed the fix/problem-proxy-bounded-sse-guards branch from de98718 to c948133 Compare June 28, 2026 19:37
@clawsweeper clawsweeper Bot added rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. and removed rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. labels Jun 28, 2026
@vincentkoc
vincentkoc force-pushed the fix/problem-proxy-bounded-sse-guards branch from c948133 to 359722b Compare June 28, 2026 19:49
@vincentkoc
vincentkoc force-pushed the fix/problem-proxy-bounded-sse-guards branch from 359722b to e8bbba9 Compare June 28, 2026 19:54
@openclaw-barnacle openclaw-barnacle Bot added the channel: line Channel integration: line label Jun 28, 2026
@vincentkoc
vincentkoc merged commit cc75783 into openclaw:main Jun 28, 2026
102 of 104 checks passed
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request Jun 29, 2026
…law#97235)

* fix proxy response and SSE read bounds

* test(line): reuse surrogate regex in action tests

---------

Co-authored-by: Vincent Koc <[email protected]>
QiuYuang pushed a commit to QiuYuang/openclaw that referenced this pull request Jul 1, 2026
…law#97235)

* fix proxy response and SSE read bounds

* test(line): reuse surrogate regex in action tests

---------

Co-authored-by: Vincent Koc <[email protected]>
chenyangjun-xy pushed a commit to chenyangjun-xy/openclaw that referenced this pull request Jul 1, 2026
…law#97235)

* fix proxy response and SSE read bounds

* test(line): reuse surrogate regex in action tests

---------

Co-authored-by: Vincent Koc <[email protected]>
chenyangjun-xy pushed a commit to chenyangjun-xy/openclaw that referenced this pull request Jul 3, 2026
…law#97235)

* fix proxy response and SSE read bounds

* test(line): reuse surrogate regex in action tests

---------

Co-authored-by: Vincent Koc <[email protected]>
wheakerd pushed a commit to wheakerd/clawdbot that referenced this pull request Jul 15, 2026
…law#97235)

* fix proxy response and SSE read bounds

* test(line): reuse surrogate regex in action tests

---------

Co-authored-by: Vincent Koc <[email protected]>
(cherry picked from commit cc75783)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agents Agent runtime and tooling channel: line Channel integration: line merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. merge-risk: 🚨 message-delivery 🚨 May drop, duplicate, misroute, suppress, or wrongly target messages. P2 Normal backlog priority with limited blast radius. proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. size: L status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants