e2720c09f7
После добавления NO_PROXY в bash-окружение (proxy.golang.org, goproxy.cn, *.golang.org, github.com и пр.) штатные модули Go стали доступны напрямую — zetit-прокси теперь обходится только для внутренних/публичных хостов, которым нужен внутренний прокси, и пропускает только нужное. Заменено: - internal/nsdxml/codec.go: 90+ строк собственной CP1251-таблицы → тонкая обёртка над golang.org/x/text/encoding/charmap.Windows1251 - go.mod: добавлен require golang.org/x/text v0.22.0 - internal/nsdxml/README.md: пометка о причине истории и текущей реализации Покрытие nsdxml сохранилось, make ci зелёный. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2.3 KiB
2.3 KiB
internal/nsdxml — сериализация и парсинг XML по правилам НРД
Что реализовано
Marshal(v) ([]byte, error)/Unmarshal(data, v) error— сериализация и разбор XML с прологом<?xml version="1.0" encoding="windows-1251"?>.Unmarshalпонимает как windows-1251, так и UTF-8 на входе черезCharsetReader.- Кодек windows-1251 (собственный, без внешних зависимостей):
EncodeWindows1251,DecodeWindows1251. Таблица соответствия CP1251 ↔ Unicode для байтов 0x80..0xFF. Руны, не выразимые в CP1251, приводят к ошибкеErrUnmappable. CharsetReader(charset, input)— пригодно к использованию вxml.Decoder.CharsetReader. Поддерживаетwindows-1251,cp1251,utf-8, отсутствие charset; на другие — ошибка.NSDDateTime— отметка времени НРД форматаYYYY-MM-DDThh:mm:ss(МСК[+-N]), regex из XSD:[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]\(МСК([+-][0-9]{1,2})?\). РеализованыMarshalXML,UnmarshalXML,MarshalText,UnmarshalText,String,Now. Сохраняет различие между «(МСК)» без сдвига и «(МСК+0)» черезOffsetSpecified.
Кодек windows-1251
Реализован через штатный golang.org/x/text/encoding/charmap.Windows1251.
Изначально (PR-1) была собственная таблица CP1251 — обход блокировки
zetit-прокси на proxy.golang.org; после открытия доступа (через
NO_PROXY=*.golang.org и пр.) заменено на штатную реализацию.
Тесты
- Round-trip на ASCII и кириллице, включая cp1251-пунктуацию
(
№,©,«»,„"). - Негативный кейс — недостижимая руна (эмодзи) даёт
ErrUnmappable. NSDDateTimeна всех вариантах смещения:(МСК),(МСК+2),(МСК-1),(МСК+12).- Покрытие — 92.5%.