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>
38 lines
2.3 KiB
Markdown
38 lines
2.3 KiB
Markdown
# 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%.
|