Skip to content

Commit 1a0bea0

Browse files
committed
Generate random path
1 parent 35c3c56 commit 1a0bea0

File tree

1 file changed

+40
-2
lines changed

1 file changed

+40
-2
lines changed

main.go

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,23 @@ func generateRandomString(length int) (string, error) {
5656
return string(result), nil
5757
}
5858

59+
// generateRandomPath generates a random path string of specified length using [a-z0-9] characters
60+
func generateRandomPath(length int) (string, error) {
61+
const charset = "abcdefghijklmnopqrstuvwxyz0123456789"
62+
result := make([]byte, length)
63+
64+
for i := range result {
65+
randomByte := make([]byte, 1)
66+
_, err := rand.Read(randomByte)
67+
if err != nil {
68+
return "", err
69+
}
70+
result[i] = charset[randomByte[0]%byte(len(charset))]
71+
}
72+
73+
return string(result), nil
74+
}
75+
5976
// renderIndexWithData renders the index.html template with the provided data
6077
func renderIndexWithData(c echo.Context, data TemplateData) error {
6178
tmpl := template.Must(template.ParseFiles("./templates/index.html"))
@@ -67,7 +84,8 @@ func renderIndexWithData(c echo.Context, data TemplateData) error {
6784
func generateNewChallenge() (string, error) {
6885
var challenge string
6986
var err error
70-
for {
87+
maxTries := 1000
88+
for i := 0; i < maxTries; i++ {
7189
challenge, err = generateRandomString(200)
7290
if err != nil {
7391
return "", err
@@ -206,7 +224,27 @@ func handleShorten(c echo.Context) error {
206224

207225
// If the challenge is verified, proceed with URL shortening
208226
if path == "" {
209-
return renderError("path is required")
227+
// Generate a random 5-character path with [a-z0-9]
228+
var err error
229+
maxTries := 1000
230+
for i := 0; i < maxTries; i++ {
231+
path, err = generateRandomPath(5)
232+
if err != nil {
233+
log.Printf("Failed to generate random path: %v", err)
234+
return c.String(http.StatusInternalServerError, "error generating random path")
235+
}
236+
237+
// Check if the generated path already exists
238+
_, exists, err := challengeStore.GetURL(path)
239+
if err != nil {
240+
log.Printf("Failed to check if path exists: %v", err)
241+
return c.String(http.StatusInternalServerError, "error checking path availability")
242+
}
243+
if !exists {
244+
break // Path is available, use it
245+
}
246+
// If path exists, generate a new one
247+
}
210248
}
211249

212250
// check if the path is [a-zA-Z0-9_-] and not too long

0 commit comments

Comments
 (0)