in pkg/mock/handlers/handlers.go [46:115]
func CatchAllHandler(res http.ResponseWriter, req *http.Request) {
log.Println("Received request to CatchAllHandler: ", req.URL.Path)
// CatchAllHandler may be invoked before ListRoutesHandler
if len(trimmedRoutes) == 0 {
formatRoutes()
}
var routes, results []string
// Clean request path and determine which route list to search
trimmedRoute := req.URL.Path
if strings.HasPrefix(trimmedRoute, static.ServicePath) {
trimmedRoute = strings.TrimPrefix(trimmedRoute, static.ServicePath+"/")
log.Println("static prefix detected..trimming: ", trimmedRoute)
routes = trimmedRoutes
} else if strings.HasPrefix(trimmedRoute, dynamic.ServicePath) {
trimmedRoute = strings.TrimPrefix(trimmedRoute, dynamic.ServicePath+"/")
log.Println("dynamic prefix detected..trimming: ", trimmedRoute)
routes = trimmedRoutesDynamic
} else {
server.ReturnNotFoundResponse(res)
return
}
if paths, ok := routeLookupTable[trimmedRoute]; ok {
log.Printf("CatchAllHandler entry %s already in map: %v \n", trimmedRoute, routeLookupTable[trimmedRoute])
server.FormatAndReturnTextResponse(res, strings.Join(paths, "\n"))
return
}
/*
The request /latest/meta-data/iam will populate results as [info, security-credentials/]
Note: not every path for which iam is a prefix needs to be appended to results.
ex: iam/security-credentials/baskinc-role should not be added because security-credentials/ already exists
results are cached in routeLookupTable
*/
appendToResults := true
for _, route := range routes {
if strings.Contains(route, trimmedRoute) {
// ex: iam/security-credentials contains iam
route = strings.TrimPrefix(route, trimmedRoute+"/")
// route is now security-credentials
for i, existingRoute := range results {
if strings.Contains(route, existingRoute) {
// security-credentials/baskinc-role contains security-credentials
results[i] = existingRoute + "/"
// display as security-credentials/
appendToResults = false
// do not add security-credentials/baskinc-role to results
break
}
}
if appendToResults {
log.Printf("adding route: %s to results\n", route)
results = append(results, route)
}
appendToResults = true
}
}
if len(results) <= 0 {
server.ReturnNotFoundResponse(res)
return
}
routeLookupTable[trimmedRoute] = results
log.Printf("CatchAllHandler: adding %s and its routes: %v to the map\n", trimmedRoute, results)
server.FormatAndReturnTextResponse(res, strings.Join(results, "\n"))
return
}