mirror of
				https://github.com/datarhei/core.git
				synced 2025-10-27 01:41:00 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			109 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			109 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package router
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"path/filepath"
 | |
| 	"strings"
 | |
| )
 | |
| 
 | |
| type Router interface {
 | |
| 	// FileRoutes
 | |
| 	FileRoutes() map[string]string
 | |
| 
 | |
| 	// DirRoutes
 | |
| 	DirRoutes() map[string]string
 | |
| 
 | |
| 	// StaticRoute
 | |
| 	StaticRoute() (string, string)
 | |
| }
 | |
| 
 | |
| type router struct {
 | |
| 	prefixes    []string
 | |
| 	fileRoutes  map[string]string
 | |
| 	dirRoutes   map[string]string
 | |
| 	staticRoute string
 | |
| }
 | |
| 
 | |
| func New(blockedPrefixes []string, routes map[string]string, static string) (Router, error) {
 | |
| 	r := &router{}
 | |
| 
 | |
| 	r.prefixes = append(r.prefixes, blockedPrefixes...)
 | |
| 	r.staticRoute = static
 | |
| 
 | |
| 	if len(r.staticRoute) != 0 {
 | |
| 		if path, err := filepath.Abs(r.staticRoute); err == nil {
 | |
| 			r.staticRoute = path
 | |
| 		} else {
 | |
| 			return nil, fmt.Errorf("invalid static route: %w", err)
 | |
| 		}
 | |
| 
 | |
| 		r.prefixes = append(r.prefixes, "/ui")
 | |
| 	}
 | |
| 
 | |
| 	r.fileRoutes = make(map[string]string)
 | |
| 	r.dirRoutes = make(map[string]string)
 | |
| 
 | |
| 	if routes == nil {
 | |
| 		return r, nil
 | |
| 	}
 | |
| 
 | |
| 	for route, target := range routes {
 | |
| 		for _, prefix := range r.prefixes {
 | |
| 			if strings.HasPrefix(route, prefix) {
 | |
| 				return nil, fmt.Errorf("the prefix of the route %s is blocked", route)
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		if strings.HasSuffix(route, "/*") {
 | |
| 			route = strings.TrimSuffix(route, "/*")
 | |
| 			path, err := filepath.Abs(target)
 | |
| 			if err != nil {
 | |
| 				return nil, fmt.Errorf("invalid route %s: %w", target, err)
 | |
| 			}
 | |
| 
 | |
| 			r.dirRoutes[route] = path
 | |
| 		} else {
 | |
| 			target = filepath.Clean(target)
 | |
| 			if !strings.HasPrefix(target, "/") {
 | |
| 				continue
 | |
| 			}
 | |
| 
 | |
| 			r.fileRoutes[route] = target
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	return r, nil
 | |
| }
 | |
| 
 | |
| func (r *router) FileRoutes() map[string]string {
 | |
| 	routes := map[string]string{}
 | |
| 
 | |
| 	for k, v := range r.fileRoutes {
 | |
| 		routes[k] = v
 | |
| 	}
 | |
| 
 | |
| 	return routes
 | |
| }
 | |
| 
 | |
| func (r *router) DirRoutes() map[string]string {
 | |
| 	routes := map[string]string{}
 | |
| 
 | |
| 	for k, v := range r.dirRoutes {
 | |
| 		routes[k] = v
 | |
| 	}
 | |
| 
 | |
| 	return routes
 | |
| }
 | |
| 
 | |
| func (r *router) StaticRoute() (string, string) {
 | |
| 	return "/ui", r.staticRoute
 | |
| }
 | |
| 
 | |
| func NewDummyRouter() Router {
 | |
| 	router, _ := New(nil, nil, "")
 | |
| 
 | |
| 	return router
 | |
| }
 | |
| 
 | |
| var DefaultRouter Router = NewDummyRouter()
 | 
