fix(web-publish): сохранять все адреса Listen глобального блока

Перезапись брала адрес только из первой строки Listen: при привязке
к loopback по обоим стекам (127.0.0.1 + [::1]) повторная публикация
молча выбрасывала IPv6-строку. Теперь сохраняются все адреса блока
(повторы схлопываются), меняется только порт; URL — по первому.

Refs #107

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-09-26 14:36:09 +03:00
co-authored by Claude Opus 5.5
parent 933414f2e6
commit 68a2a11a6c
3 changed files with 28 additions and 18 deletions
@@ -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
"@
@@ -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}'
)
+1 -1
View File
@@ -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