From 68a2a11a6c4f8dfdf6cdda9dbcca1b2a850361b6 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Sat, 26 Sep 2026 14:36:09 +0300 Subject: [PATCH] =?UTF-8?q?fix(web-publish):=20=D1=81=D0=BE=D1=85=D1=80?= =?UTF-8?q?=D0=B0=D0=BD=D1=8F=D1=82=D1=8C=20=D0=B2=D1=81=D0=B5=20=D0=B0?= =?UTF-8?q?=D0=B4=D1=80=D0=B5=D1=81=D0=B0=20Listen=20=D0=B3=D0=BB=D0=BE?= =?UTF-8?q?=D0=B1=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=B1=D0=BB?= =?UTF-8?q?=D0=BE=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Перезапись брала адрес только из первой строки Listen: при привязке к loopback по обоим стекам (127.0.0.1 + [::1]) повторная публикация молча выбрасывала IPv6-строку. Теперь сохраняются все адреса блока (повторы схлопываются), меняется только порт; URL — по первому. Refs #107 Co-Authored-By: Claude Opus 5.5 (1M context) --- .../web-publish/scripts/web-publish.ps1 | 22 +++++++++++-------- .../skills/web-publish/scripts/web-publish.py | 22 ++++++++++++------- docs/web-spec.md | 2 +- 3 files changed, 28 insertions(+), 18 deletions(-) diff --git a/.claude/skills/web-publish/scripts/web-publish.ps1 b/.claude/skills/web-publish/scripts/web-publish.ps1 index 26b11c7ab..12fa928d0 100644 --- a/.claude/skills/web-publish/scripts/web-publish.ps1 +++ b/.claude/skills/web-publish/scripts/web-publish.ps1 @@ -349,20 +349,24 @@ $vrdPathFwd = $vrdPath -replace '\\','/' # --- Global block (Listen + LoadModule) --- $globalMarkerStart = "# --- 1C: global ---" $globalMarkerEnd = "# --- End: global ---" -# Адрес привязки, вписанный в наш блок руками (Listen 127.0.0.1:port), при перезаписи сохраняем -$listenHost = "" +# Адреса привязки, вписанные в наш блок руками (Listen 127.0.0.1:port + Listen [::1]:port), +# при перезаписи сохраняем все — меняется только порт +$listenHosts = @() $globalPattern = [regex]::Escape($globalMarkerStart) + '([\s\S]*?)' + [regex]::Escape($globalMarkerEnd) -if ($confContent -match $globalPattern -and - $Matches[1] -match '(?m)^[ \t]*Listen[ \t]+(?:(\[[^\]]+\]|[^\s:\[\]]+):)?(\d+)\b') { - if ($Matches[1] -and @('0.0.0.0', '*', '[::]') -notcontains $Matches[1]) { - $listenHost = $Matches[1] +if ($confContent -match $globalPattern) { + foreach ($lm in [regex]::Matches($Matches[1], '(?mi)^[ \t]*Listen[ \t]+(?:(\[[^\]]+\]|[^\s:\[\]]+):)?(\d+)\b')) { + $h = $lm.Groups[1].Value + if ($listenHosts -cnotcontains $h) { $listenHosts += $h } } } -$listenArg = if ($listenHost) { "${listenHost}:$Port" } else { "$Port" } -$urlHost = if ($listenHost) { $listenHost } else { "localhost" } +if ($listenHosts.Count -eq 0) { $listenHosts = @("") } +$listenLines = ($listenHosts | ForEach-Object { if ($_) { "Listen ${_}:$Port" } else { "Listen $Port" } }) -join "`n" +# URL — по первому адресу; «все интерфейсы» → localhost +$firstHost = $listenHosts[0] +$urlHost = if ($firstHost -and @('0.0.0.0', '*', '[::]') -notcontains $firstHost) { $firstHost } else { "localhost" } $globalBlock = @" $globalMarkerStart -Listen $listenArg +$listenLines LoadModule _1cws_module "$wsapDllFwd" $globalMarkerEnd "@ diff --git a/.claude/skills/web-publish/scripts/web-publish.py b/.claude/skills/web-publish/scripts/web-publish.py index 95af432d5..70a885078 100644 --- a/.claude/skills/web-publish/scripts/web-publish.py +++ b/.claude/skills/web-publish/scripts/web-publish.py @@ -408,19 +408,25 @@ def main(): # --- Global block (Listen + LoadModule) --- global_marker_start = '# --- 1C: global ---' global_marker_end = '# --- End: global ---' - # Адрес привязки, вписанный в наш блок руками (Listen 127.0.0.1:port), при перезаписи сохраняем - listen_host = '' + # Адреса привязки, вписанные в наш блок руками (Listen 127.0.0.1:port + Listen [::1]:port), + # при перезаписи сохраняем все — меняется только порт + listen_hosts = [] global_pattern = re.escape(global_marker_start) + r'([\s\S]*?)' + re.escape(global_marker_end) m = re.search(global_pattern, conf_content) if m: - m = re.search(r'(?mi)^[ \t]*Listen[ \t]+(?:(\[[^\]]+\]|[^\s:\[\]]+):)?(\d+)\b', m.group(1)) - if m and m.group(1) and m.group(1) not in ('0.0.0.0', '*', '[::]'): - listen_host = m.group(1) - listen_arg = f'{listen_host}:{port}' if listen_host else f'{port}' - url_host = listen_host if listen_host else 'localhost' + for lm in re.finditer(r'(?mi)^[ \t]*Listen[ \t]+(?:(\[[^\]]+\]|[^\s:\[\]]+):)?(\d+)\b', m.group(1)): + h = lm.group(1) or '' + if h not in listen_hosts: + listen_hosts.append(h) + if not listen_hosts: + listen_hosts = [''] + listen_lines = '\n'.join(f'Listen {h}:{port}' if h else f'Listen {port}' for h in listen_hosts) + # URL — по первому адресу; «все интерфейсы» → localhost + first_host = listen_hosts[0] + url_host = first_host if first_host and first_host not in ('0.0.0.0', '*', '[::]') else 'localhost' global_block = ( f'{global_marker_start}\n' - f'Listen {listen_arg}\n' + f'{listen_lines}\n' f'LoadModule _1cws_module "{wsap_dll_fwd}"\n' f'{global_marker_end}' ) diff --git a/docs/web-spec.md b/docs/web-spec.md index 01a407ec8..51944d13a 100644 --- a/docs/web-spec.md +++ b/docs/web-spec.md @@ -103,7 +103,7 @@ Listen 8081 Порт для веб-клиента. По умолчанию `8081` (стандартный `80` может быть занят). -Адрес привязки, вписанный в глобальный блок вручную (`Listen 127.0.0.1:8081`, `Listen [::1]:8081`), при повторной публикации сохраняется — меняется только порт; URL в выводе `web-publish` и `web-info` строятся по этому адресу. `0.0.0.0`, `*`, `[::]` считаются «все интерфейсы» → `localhost`. +Адреса привязки, вписанные в глобальный блок вручную (`Listen 127.0.0.1:8081` и `Listen [::1]:8081`), при повторной публикации сохраняются все — меняется только порт; URL в выводе `web-publish` и `web-info` строятся по первому из них. `0.0.0.0`, `*`, `[::]` считаются «все интерфейсы» → `localhost`. ### Alias + Directory