@@ -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
6077func 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 {
6784func 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