fix(admin): кнопка «Проверить документацию» возвращает на /admin/news + браузерный UA для nsd.ru
Три бага в Doc-watcher / Новостях, всплывшие при первом ручном прогоне:
1. setupFlash после POST в /admin/news/check-docs редиректил на
/admin/setup, а не на /admin/news, и оператор «выпадал» с ленты.
Теперь setupFlash смотрит Referer и возвращает на любой из
/admin/wizard, /admin/news, /admin/setup — на ту страницу с которой
пришёл POST.
2. http.DefaultClient в news.go и cacerts.go подхватывал HTTPS_PROXY
из окружения и шёл через корпоративный zetit, который блокирует
nsd.ru (CONNECT 403). Заменил на noProxyClient с явно отключённой
проксификацией (Transport.Proxy = nil) — doc-watcher всегда идёт
напрямую, независимо от ENV.
3. nsd.ru отдаёт 403 на запросы с UA «bj-server/1.0» (антибот). Заменил
на стандартный Chrome User-Agent + браузерные Accept/Accept-Language.
После этого moex-most-dlya-m2m.pdf найден и скачан, новость
«Обновлена документация» опубликована.
Кроме того, по запросу — убрана форма «Добавить вручную» с /admin/news.
В UI остался только мониторинг: автоматическая лента событий +
ручная кнопка «🔄 Проверить обновления документации сейчас».
Handler /admin/news/add сохранён в коде на случай ручного ввода
инцидентов в будущем.
This commit is contained in:
+15
-10
@@ -778,20 +778,25 @@ func tryHTTPHealth(u string) error {
|
||||
}
|
||||
|
||||
// setupFlash шлёт 303 с flash-сообщением в query. Если запрос пришёл
|
||||
// со страницы мастера (/admin/wizard), возвращаем туда же с сохранением
|
||||
// номера шага — пользователь не должен «выпадать» из визарда после POST.
|
||||
// с какой-то «принимающей flash» страницы (/admin/wizard, /admin/news,
|
||||
// /admin/setup) — возвращаем туда же. Иначе дефолт — /admin/setup.
|
||||
// Это нужно чтобы пользователь не «выпадал» из текущего контекста после
|
||||
// POST-действия (нажал кнопку «Проверить обновления» в Новостях — должен
|
||||
// остаться в Новостях со флешем).
|
||||
func setupFlash(w http.ResponseWriter, r *http.Request, msg string) {
|
||||
target := "/admin/setup"
|
||||
if ref := r.Header.Get("Referer"); ref != "" {
|
||||
if u, err := url.Parse(ref); err == nil && strings.HasPrefix(u.Path, "/admin/wizard") {
|
||||
q := u.Query()
|
||||
q.Set("flash", msg)
|
||||
target = u.Path + "?" + q.Encode()
|
||||
http.Redirect(w, r, target, http.StatusSeeOther)
|
||||
return
|
||||
if u, err := url.Parse(ref); err == nil {
|
||||
for _, prefix := range []string{"/admin/wizard", "/admin/news", "/admin/setup"} {
|
||||
if strings.HasPrefix(u.Path, prefix) {
|
||||
q := u.Query()
|
||||
q.Set("flash", msg)
|
||||
http.Redirect(w, r, u.Path+"?"+q.Encode(), http.StatusSeeOther)
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
http.Redirect(w, r, target+"?flash="+url.QueryEscape(msg), http.StatusSeeOther)
|
||||
http.Redirect(w, r, "/admin/setup?flash="+url.QueryEscape(msg), http.StatusSeeOther)
|
||||
}
|
||||
|
||||
// _q извлекает Request из ResponseWriter trick — здесь не нужно
|
||||
|
||||
Reference in New Issue
Block a user