/
seypher
/
benchmark
Обзор
Документация
Войти
/
seypher
/
benchmark
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
spec-kit/internal/handler/redirect.go
53 строки
1 KB
dorshanskiy
first_commit
19 май 2026, 18:09
19 май 2026, 18:09
5d12ee6
Код
Авторство
О чём код?
package handler import ( "context" "errors" "log/slog" "net/http" "regexp" "urlshortener/internal/store" ) var validCode = regexp.MustCompile(`^[0-9A-Za-z]{1,10}$`) // ResolveService is the subset of service.Shortener used by the redirect handler. type ResolveService interface { Resolve(ctx context.Context, code string) (string, error) } // RedirectHandler handles GET /{code}. type RedirectHandler struct { svc ResolveService } func NewRedirectHandler(svc ResolveService) *RedirectHandler { return &RedirectHandler{svc: svc} } func (h *RedirectHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodGet && r.Method != http.MethodHead { writeError(w, http.StatusMethodNotAllowed, "method not allowed") return } code := r.PathValue("code") if !validCode.MatchString(code) { writeError(w, http.StatusBadRequest, "invalid short code format") return } originalURL, err := h.svc.Resolve(r.Context(), code) if err != nil { if errors.Is(err, store.ErrNotFound) { writeError(w, http.StatusNotFound, "short code not found") return } slog.Error("redirect: unexpected error", "error", err, "code", code) writeError(w, http.StatusInternalServerError, "internal server error") return } http.Redirect(w, r, originalURL, http.StatusFound) }