Skip to content

Commit

Permalink
iter3 completed
Browse files Browse the repository at this point in the history
  • Loading branch information
ByteDSM committed Oct 9, 2023
1 parent bc38f9a commit a0a1a06
Show file tree
Hide file tree
Showing 4 changed files with 89 additions and 92 deletions.
90 changes: 89 additions & 1 deletion cmd/shortener/main.go
Original file line number Diff line number Diff line change
@@ -1,3 +1,91 @@
package main

func main() {}
import (
"encoding/base64"
"fmt"
"github.com/gorilla/mux"
"io"
"log"
"net/http"
)

// Словарь для хранения соответствий между сокращёнными и оригинальными URL
// TODO Создать хранилище
var urlMap = map[string]string{}

// Перенаправляем по полной ссылке
func redirectHandler(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodGet {
http.Error(w, "invalid request type", http.StatusBadRequest)
return
}
// Добавляем тестовое соответствие в словарь
urlMap["aHR0cH"] = "https://practicum.yandex.ru/"
// Получаем идентификатор из URL-пути
id := r.URL.Path[1:]

// Получаем оригинальный URL из словаря

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
}
/*
contentType := r.Header.Get("Content-Type")
if contentType != "text/plain" || contentType != "text/plain; charset=utf-8" {
http.Error(w, "invalid request type", 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() {
r := mux.NewRouter()
r.HandleFunc("/{idShortenURL}", redirectHandler).Methods("GET")
r.HandleFunc("/", shortenURLHandler).Methods("POST")

err := http.ListenAndServe(":8080", r)
if err != nil {
panic(err)
}
}
File renamed without changes.
91 changes: 0 additions & 91 deletions main.go

This file was deleted.

Binary file removed shortener
Binary file not shown.

0 comments on commit a0a1a06

Please sign in to comment.