diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..16426cb Binary files /dev/null and b/.DS_Store differ diff --git a/.gitignore b/.gitignore index 3362f51..9d39be1 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,4 @@ vendor/ # IDEs directories .idea .vscode +.DS_Store diff --git a/cmd/.DS_Store b/cmd/.DS_Store new file mode 100644 index 0000000..ec13469 Binary files /dev/null and b/cmd/.DS_Store differ diff --git a/cmd/shortener/main.go b/cmd/shortener/main.go index 38dd16d..f769d29 100644 --- a/cmd/shortener/main.go +++ b/cmd/shortener/main.go @@ -1,3 +1,85 @@ package main -func main() {} +import ( + "encoding/base64" + "fmt" + "io" + "log" + "net/http" +) + +// Словарь для хранения соответствий между сокращёнными и оригинальными URL +var urlMap map[string]string + +// Перенаправляем по полной ссылке +func redirectHandler(w http.ResponseWriter, r *http.Request) { + // Получаем идентификатор из URL-пути + id := r.URL.Path[1:] + + // Получаем оригинальный URL из словаря + // TODO Создать хранилище + + if originalURL, found := urlMap[id]; found { + // Устанавливаем заголовок Location и возвращаем ответ с кодом 307 + w.Header().Set("Location", originalURL) + w.WriteHeader(http.StatusTemporaryRedirect) + return + } + http.Error(w, "Ссылка не найдена", http.StatusBadRequest) + +} + +func shortenURLHandler(w http.ResponseWriter, r *http.Request) { + // Читаем тело запроса (URL) + urlBytes, err := io.ReadAll(r.Body) + if err != nil { + http.Error(w, "Ошибка чтения запроса", http.StatusBadRequest) + return + } + + // Преобразуем в строку + url := string(urlBytes) + + // Генерируем уникальный идентификатор сокращённого URL + id := generateID(url) + + // Добавляем соответствие в словарь + urlMap[id] = url + + // Отправляем ответ с сокращённым URL + shortenedURL := fmt.Sprintf("http://localhost:8080/%s", id) + w.Header().Set("Content-Type", "text/plain") + w.WriteHeader(http.StatusCreated) + if _, err := io.WriteString(w, shortenedURL); err != nil { + log.Fatal(err) + } +} + +// Простая функция для генерации уникального идентификатора +func generateID(fullURL string) string { + encodedStr := base64.URLEncoding.EncodeToString([]byte(fullURL)) + // Возвращаем первые 6 символов закодированной строки + if len(encodedStr) > 6 { + return encodedStr[:6] + } + return encodedStr +} + +func main() { + mux := http.NewServeMux() + urlMap = make(map[string]string) + mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + // GET OR POST + if r.Method != http.MethodPost { + redirectHandler(w, r) + return + } + shortenURLHandler(w, r) + + }) + + err := http.ListenAndServe(":8080", mux) + if err != nil { + panic(err) + } +} diff --git a/cmd/shortener/shortenertest b/cmd/shortener/shortenertest new file mode 100755 index 0000000..59faa75 Binary files /dev/null and b/cmd/shortener/shortenertest differ diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..77a6e46 --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module github.com/nabbat/url-shortener-server.git + +go 1.20 diff --git a/internal/.DS_Store b/internal/.DS_Store new file mode 100644 index 0000000..fadd49a Binary files /dev/null and b/internal/.DS_Store differ