/
t3
/
s3-server
Обзор
Документация
Войти
/
t3
/
s3-server
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
master
internal/api/handler.go
64 строки
2 KB
Ivan
refactoring
16 июл 2026, 23:52
16 июл 2026, 23:52
05c94e8
Код
Авторство
О чём код?
package api import ( "encoding/xml" "fmt" "log/slog" "net/http" "strings" "github.com/google/uuid" "gitverse.ru/t3/s3-server/internal/config" "gitverse.ru/t3/s3-server/internal/storage" ) type Handler struct { meta storage.MetadataStorage data storage.DataStorage log *slog.Logger cfg *config.Config } func NewHandler(cfg *config.Config, meta storage.MetadataStorage, data storage.DataStorage, log *slog.Logger) *Handler { return &Handler{cfg: cfg, meta: meta, data: data, log: log} } // logInternalError логирует внутреннюю ошибку и отправляет XML-ответ. func logInternalError(h *Handler, w http.ResponseWriter, r *http.Request, action string, err error) { reqID := w.Header().Get("X-Request-Id") h.log.Error("internal error", "action", action, "error", err, "request_id", reqID) writeXMLError(w, r, http.StatusInternalServerError, "InternalError", "An internal server error occurred. Reference: "+reqID) } func validateBucket(bucket string) bool { if len(bucket) < 3 || len(bucket) > 63 { return false } if strings.Contains(bucket, "..") || strings.Contains(bucket, "/") { return false } return true } // fmtAtoi — вспомогательная функция (чтобы не тянуть strconv ради одного места). func fmtAtoi(s string) (int, error) { var n int _, err := fmt.Sscanf(s, "%d", &n) return n, err } func writeXMLError(w http.ResponseWriter, r *http.Request, statusCode int, code, message string) { w.Header().Set("Content-Type", "application/xml") w.WriteHeader(statusCode) // Генерируем безопасный RequestID reqID := uuid.NewString() errResp := S3Error{ Code: code, Message: message, // message должно быть безопасным (например, "NoSuchBucket") Resource: r.URL.Path, RequestID: reqID, } xml.NewEncoder(w).Encode(errResp) }