Compare commits
	
		
			No commits in common. "master" and "v0.1.1" have entirely different histories.
		
	
	
		
	
		
					 2 changed files with 9 additions and 74 deletions
				
			
		
							
								
								
									
										22
									
								
								context.go
									
										
									
									
									
								
							
							
						
						
									
										22
									
								
								context.go
									
										
									
									
									
								
							|  | @ -4,9 +4,7 @@ import ( | ||||||
| 	"bytes" | 	"bytes" | ||||||
| 	"encoding/json" | 	"encoding/json" | ||||||
| 	"io" | 	"io" | ||||||
| 	"net" |  | ||||||
| 	"net/http" | 	"net/http" | ||||||
| 	"strings" |  | ||||||
| 
 | 
 | ||||||
| 	"github.com/julienschmidt/httprouter" | 	"github.com/julienschmidt/httprouter" | ||||||
| ) | ) | ||||||
|  | @ -20,8 +18,7 @@ type Context struct { | ||||||
| 	store    map[string]interface{} | 	store    map[string]interface{} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // NewContext creates a new context, this function is only exported for use in tests | func newContext(router *Router, res http.ResponseWriter, req *http.Request, param httprouter.Params) *Context { | ||||||
| func NewContext(router *Router, res http.ResponseWriter, req *http.Request, param httprouter.Params) *Context { |  | ||||||
| 	return &Context{router, req, res, param.ByName, make(map[string]interface{})} | 	return &Context{router, req, res, param.ByName, make(map[string]interface{})} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -102,20 +99,3 @@ func (c *Context) Set(key string, value interface{}) { | ||||||
| func (c *Context) Get(key string) interface{} { | func (c *Context) Get(key string) interface{} { | ||||||
| 	return c.store[key] | 	return c.store[key] | ||||||
| } | } | ||||||
| 
 |  | ||||||
| // RealIP uses proxy headers for the real ip, if none exist the IP of the current connection is returned |  | ||||||
| func (c *Context) RealIP() string { |  | ||||||
| 	reqIP := c.Request.RemoteAddr |  | ||||||
| 
 |  | ||||||
| 	if ip := c.Request.Header.Get(`X-Forwarded-For`); ip != `` { |  | ||||||
| 		reqIP = strings.Split(ip, `, `)[0] |  | ||||||
| 	} else if ip := c.Request.Header.Get(`X-Real-IP`); ip != `` { |  | ||||||
| 		reqIP = ip |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	ra, _, _ := net.SplitHostPort(reqIP) |  | ||||||
| 	if ra != `` { |  | ||||||
| 		reqIP = ra |  | ||||||
| 	} |  | ||||||
| 	return reqIP |  | ||||||
| } |  | ||||||
|  |  | ||||||
							
								
								
									
										61
									
								
								router.go
									
										
									
									
									
								
							
							
						
						
									
										61
									
								
								router.go
									
										
									
									
									
								
							|  | @ -1,11 +1,8 @@ | ||||||
| package router | package router | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"context" |  | ||||||
| 	"crypto/tls" |  | ||||||
| 	"net/http" | 	"net/http" | ||||||
| 	"reflect" | 	"reflect" | ||||||
| 	"time" |  | ||||||
| 
 | 
 | ||||||
| 	"github.com/julienschmidt/httprouter" | 	"github.com/julienschmidt/httprouter" | ||||||
| ) | ) | ||||||
|  | @ -38,8 +35,6 @@ type Router struct { | ||||||
| 	NotFoundHandler         Handle | 	NotFoundHandler         Handle | ||||||
| 	MethodNotAllowedHandler Handle | 	MethodNotAllowedHandler Handle | ||||||
| 	ErrorHandler            ErrorHandle | 	ErrorHandler            ErrorHandle | ||||||
| 	TrimTrailingSlashes     bool |  | ||||||
| 	server                  *http.Server |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // New returns a new Router | // New returns a new Router | ||||||
|  | @ -99,36 +94,10 @@ func (r *Router) OPTIONS(path string, handle Handle, middleware ...Middleware) { | ||||||
| func (r *Router) Start(addr string) error { | func (r *Router) Start(addr string) error { | ||||||
| 	httpr := r.getHttpr() | 	httpr := r.getHttpr() | ||||||
| 
 | 
 | ||||||
| 	r.server = &http.Server{Addr: addr, Handler: httpr} | 	return http.ListenAndServe(addr, httpr) | ||||||
| 	return r.server.ListenAndServe() |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // StartTLS starts a TLS web server using the given key, cert and config and binds to the given address | func (r *Router) getHttpr() *httprouter.Router { | ||||||
| func (r *Router) StartTLS(addr, certFile, keyFile string, conf *tls.Config) error { |  | ||||||
| 	httpr := r.getHttpr() |  | ||||||
| 
 |  | ||||||
| 	r.server = &http.Server{Addr: addr, Handler: httpr, TLSConfig: conf} |  | ||||||
| 	return r.server.ListenAndServeTLS(certFile, keyFile) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Stop stops the web server |  | ||||||
| func (r *Router) Stop() error { |  | ||||||
| 	if r.server == nil { |  | ||||||
| 		return nil |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) |  | ||||||
| 	defer cancel() |  | ||||||
| 	err := r.server.Shutdown(ctx) |  | ||||||
| 	if err == context.DeadlineExceeded { |  | ||||||
| 		err = r.server.Close() |  | ||||||
| 	} |  | ||||||
| 	r.server = nil |  | ||||||
| 
 |  | ||||||
| 	return err |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (r *Router) getHttpr() http.Handler { |  | ||||||
| 	httpr := httprouter.New() | 	httpr := httprouter.New() | ||||||
| 
 | 
 | ||||||
| 	for _, v := range r.routes { | 	for _, v := range r.routes { | ||||||
|  | @ -137,11 +106,7 @@ func (r *Router) getHttpr() http.Handler { | ||||||
| 			handle = handlePOST(r, v.Handle) | 			handle = handlePOST(r, v.Handle) | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		middleware := make([]Middleware, len(r.middleware)+len(v.Middleware)) | 		httpr.Handle(v.Method, v.Path, handleReq(r, handle, append(r.middleware, v.Middleware...))) | ||||||
| 		copy(middleware, r.middleware) |  | ||||||
| 		copy(middleware[len(r.middleware):], v.Middleware) |  | ||||||
| 
 |  | ||||||
| 		httpr.Handle(v.Method, v.Path, handleReq(r, handle, middleware)) |  | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	httpr.NotFound = http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) { | 	httpr.NotFound = http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) { | ||||||
|  | @ -153,22 +118,10 @@ func (r *Router) getHttpr() http.Handler { | ||||||
| 	}) | 	}) | ||||||
| 
 | 
 | ||||||
| 	httpr.PanicHandler = func(res http.ResponseWriter, req *http.Request, err interface{}) { | 	httpr.PanicHandler = func(res http.ResponseWriter, req *http.Request, err interface{}) { | ||||||
| 		c := NewContext(r, res, req, nil) | 		c := newContext(r, res, req, nil) | ||||||
| 		r.ErrorHandler(c, err) | 		r.ErrorHandler(c, err) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if r.TrimTrailingSlashes { |  | ||||||
| 		httpr.RedirectTrailingSlash = false |  | ||||||
| 
 |  | ||||||
| 		return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { |  | ||||||
| 			l := len(req.URL.Path) |  | ||||||
| 			if l > 1 && req.URL.Path[l-1] == '/' { |  | ||||||
| 				req.URL.Path = req.URL.Path[:l-1] |  | ||||||
| 			} |  | ||||||
| 			httpr.ServeHTTP(w, req) |  | ||||||
| 		}) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return httpr | 	return httpr | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -194,6 +147,8 @@ func checkInterfaceHandle(f interface{}) { | ||||||
| 	if rt.In(0) != reflect.TypeOf(&Context{}) { | 	if rt.In(0) != reflect.TypeOf(&Context{}) { | ||||||
| 		panic(`handle should accept Context as first argument`) | 		panic(`handle should accept Context as first argument`) | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
|  | 	return | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func handlePOST(r *Router, f interface{}) Handle { | func handlePOST(r *Router, f interface{}) Handle { | ||||||
|  | @ -224,10 +179,10 @@ func handlePOST(r *Router, f interface{}) Handle { | ||||||
| 
 | 
 | ||||||
| func handleReq(r *Router, handle Handle, m []Middleware) httprouter.Handle { | func handleReq(r *Router, handle Handle, m []Middleware) httprouter.Handle { | ||||||
| 	return func(res http.ResponseWriter, req *http.Request, param httprouter.Params) { | 	return func(res http.ResponseWriter, req *http.Request, param httprouter.Params) { | ||||||
| 		c := NewContext(r, res, req, param) | 		c := newContext(r, res, req, param) | ||||||
| 
 | 
 | ||||||
| 		f := handle | 		f := handle | ||||||
| 		for i := len(m) - 1; i >= 0; i-- { | 		for i := len(m) - 1; i >= 0; i-- { // TODO: 1,2,3 of 3,2,1 | ||||||
| 			f = m[i](f) | 			f = m[i](f) | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue