From 42e452aafc0af36c2087be923f99da09795935e6 Mon Sep 17 00:00:00 2001 From: JOY Date: Thu, 21 May 2026 20:15:23 +0700 Subject: [PATCH] Fix HTTP transport reload cleanup --- CHANGELOG.md | 4 ++++ Editor/MCP/Server/HttpMCPTransport.cs | 15 +++++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f9fe11e..9f6cef0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## Unreleased +### Fixed +- Made HTTP transport stop cleanup idempotent during Unity domain reloads, avoiding disposed `HttpListener` errors when reload cleanup runs after the listener has already been closed. +- Recognize Windows `HttpListenerException` address-in-use error codes and messages during restart retry detection. + ## [0.3.4] - 2026-05-20 ### Added diff --git a/Editor/MCP/Server/HttpMCPTransport.cs b/Editor/MCP/Server/HttpMCPTransport.cs index 9827105..6548c14 100644 --- a/Editor/MCP/Server/HttpMCPTransport.cs +++ b/Editor/MCP/Server/HttpMCPTransport.cs @@ -94,19 +94,27 @@ public Task StopAsync() public void Stop() { - if (!_isRunning) return; + if (!_isRunning && _listener == null) return; try { _cts?.Cancel(); _listener?.Stop(); _listener?.Close(); - _isRunning = false; PluginDebugLogger.Log("[Funplay MCP Server] HTTP transport stopped"); } + catch (ObjectDisposedException) + { + PluginDebugLogger.Log("[Funplay MCP Server] HTTP transport was already disposed"); + } catch (Exception ex) { Debug.LogError($"[Funplay MCP Server] Error stopping HTTP transport: {ex.Message}"); } + finally + { + _isRunning = false; + _listener = null; + } } private void CleanupFailedStart() @@ -130,6 +138,9 @@ private static bool IsAddressInUse(Exception ex) return ex is HttpListenerException listenerException && (listenerException.ErrorCode == 48 || listenerException.ErrorCode == 98 || + listenerException.ErrorCode == 183 || + listenerException.ErrorCode == 10048 || + listenerException.Message.IndexOf("Only one usage", StringComparison.OrdinalIgnoreCase) >= 0 || listenerException.Message.IndexOf("Address already in use", StringComparison.OrdinalIgnoreCase) >= 0); }