| 
				
			 | 
			
			 | 
			@@ -23,67 +23,101 @@ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			package rex | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			import ( | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				"flag" | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				"net/http" | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				"path/filepath" | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				"runtime" | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				"github.com/goanywhere/rex/internal" | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				"github.com/goanywhere/rex/modules" | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				"github.com/goanywhere/x/env" | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				"github.com/goanywhere/x/fs" | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			var DefaultMux = New() | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			var ( | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				mux = New() | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				options = struct { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					debug    bool | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					port     int | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					maxprocs int | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				}{ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					debug:    true, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					port:     5000, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					maxprocs: runtime.NumCPU(), | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			// Get is a shortcut for mux.HandleFunc(pattern, handler).Methods("GET"), | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			// it also fetch the full function name of the handler (with package) to name the route. | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			func Get(pattern string, handler interface{}) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				DefaultMux.register("GET", pattern, handler) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				mux.register("GET", pattern, handler) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			// Head is a shortcut for mux.HandleFunc(pattern, handler).Methods("HEAD") | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			// it also fetch the full function name of the handler (with package) to name the route. | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			func Head(pattern string, handler interface{}) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				DefaultMux.register("HEAD", pattern, handler) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				mux.register("HEAD", pattern, handler) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			// Options is a shortcut for mux.HandleFunc(pattern, handler).Methods("OPTIONS") | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			// it also fetch the full function name of the handler (with package) to name the route. | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			// NOTE method OPTIONS is **NOT** cachable, beware of what you are going to do. | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			func Options(pattern string, handler interface{}) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				DefaultMux.register("OPTIONS", pattern, handler) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				mux.register("OPTIONS", pattern, handler) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			// Post is a shortcut for mux.HandleFunc(pattern, handler).Methods("POST") | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			// it also fetch the full function name of the handler (with package) to name the route. | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			func Post(pattern string, handler interface{}) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				DefaultMux.register("POST", pattern, handler) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				mux.register("POST", pattern, handler) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			// Put is a shortcut for mux.HandleFunc(pattern, handler).Methods("PUT") | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			// it also fetch the full function name of the handler (with package) to name the route. | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			func Put(pattern string, handler interface{}) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				DefaultMux.register("PUT", pattern, handler) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				mux.register("PUT", pattern, handler) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			// Delete is a shortcut for mux.HandleFunc(pattern, handler).Methods("DELETE") | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			// it also fetch the full function name of the handler (with package) to name the route. | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			func Delete(pattern string, handler interface{}) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				DefaultMux.register("Delete", pattern, handler) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				mux.register("Delete", pattern, handler) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			// Group creates a new application group under the given path. | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			func Group(path string) *Router { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				return DefaultMux.Group(path) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				return mux.Group(path) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			// FileServer registers a handler to serve HTTP requests | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			// with the contents of the file system rooted at root. | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			func FileServer(prefix, dir string) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				DefaultMux.FileServer(prefix, dir) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				mux.FileServer(prefix, dir) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			// Use appends middleware module into the serving list, modules will be served in FIFO order. | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			func Use(module func(http.Handler) http.Handler) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				DefaultMux.Use(module) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				mux.Use(module) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			func Run() { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				DefaultMux.Use(modules.Logger) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				DefaultMux.Run() | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				mux.Use(modules.Logger) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				mux.Run() | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			func init() { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				// ---------------------------------------- | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				// Project Root | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				// ---------------------------------------- | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				var root = fs.Getcd(2) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				env.Set(internal.Root, root) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				env.Load(filepath.Join(root, ".env")) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				// cmd arguments | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				flag.BoolVar(&options.debug, "debug", options.debug, "flag to toggle debug mode") | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				flag.IntVar(&options.port, "port", options.port, "port to run the application server") | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				flag.IntVar(&options.maxprocs, "maxprocs", options.maxprocs, "maximum cpu processes to run the server") | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				flag.Parse() | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			} |