route catch optiong route

This commit is contained in:
Ankit Patial 2024-11-04 10:40:29 +05:30
parent f4a2452a94
commit c34f5b7d0d
3 changed files with 45 additions and 22 deletions

View File

@ -49,7 +49,7 @@ type OriginValidator func(string) bool
var ( var (
defaultCorsOptionStatusCode = http.StatusOK defaultCorsOptionStatusCode = http.StatusOK
defaultCorsMethods = []string{http.MethodHead, http.MethodGet, http.MethodPost} defaultCorsMethods = []string{http.MethodHead, http.MethodGet, http.MethodPost}
defaultCorsHeaders = []string{"Accept", "Accept-Language", "Content-Language", "Origin"} defaultCorsHeaders = []string{"Accept", "Accept-Language", "Content-Type", "Content-Language", "Origin"}
// (WebKit/Safari v9 sends the Origin header by default in AJAX requests). // (WebKit/Safari v9 sends the Origin header by default in AJAX requests).
) )

View File

@ -14,9 +14,13 @@ type Router struct {
} }
func NewRouter() *Router { func NewRouter() *Router {
return &Router{ r := &Router{
mux: http.NewServeMux(), mux: http.NewServeMux(),
} }
// catch all options
r.mux.Handle("OPTIONS /", optionsHandler{})
return r
} }
// Use will register middleware(s) with router stack // Use will register middleware(s) with router stack
@ -27,48 +31,46 @@ func (r *Router) Use(h ...func(http.Handler) http.Handler) {
r.middlewares = append(r.middlewares, h...) r.middlewares = append(r.middlewares, h...)
} }
// Get method route // GET method route
func (r *Router) Get(pattern string, h http.HandlerFunc) { func (r *Router) GET(pattern string, h http.HandlerFunc) {
r.handlerFunc(http.MethodGet, pattern, h) r.handlerFunc(http.MethodGet, pattern, h)
} }
// Head method route // HEAD method route
func (r *Router) Head(pattern string, h http.HandlerFunc) { func (r *Router) HEAD(pattern string, h http.HandlerFunc) {
r.handlerFunc(http.MethodHead, pattern, h) r.handlerFunc(http.MethodHead, pattern, h)
} }
// Post method route // POST method route
func (r *Router) Post(pattern string, h http.HandlerFunc) { func (r *Router) POST(pattern string, h http.HandlerFunc) {
r.handlerFunc(http.MethodPost, pattern, h) r.handlerFunc(http.MethodPost, pattern, h)
} }
// Put method route // PUT method route
func (r *Router) Put(pattern string, h http.HandlerFunc) { func (r *Router) PUT(pattern string, h http.HandlerFunc) {
r.handlerFunc(http.MethodPut, pattern, h) r.handlerFunc(http.MethodPut, pattern, h)
} }
// Patch method route // PATCH method route
func (r *Router) Patch(pattern string, h http.HandlerFunc) { func (r *Router) PATCH(pattern string, h http.HandlerFunc) {
r.handlerFunc(http.MethodPatch, pattern, h) r.handlerFunc(http.MethodPatch, pattern, h)
} }
// Delete method route // DELETE method route
func (r *Router) Delete(pattern string, h http.HandlerFunc) { func (r *Router) DELETE(pattern string, h http.HandlerFunc) {
r.handlerFunc(http.MethodDelete, pattern, h) r.handlerFunc(http.MethodDelete, pattern, h)
} }
// Connect method route // CONNECT method route
func (r *Router) Connect(pattern string, h http.HandlerFunc) { func (r *Router) CONNECT(pattern string, h http.HandlerFunc) {
r.handlerFunc(http.MethodConnect, pattern, h) r.handlerFunc(http.MethodConnect, pattern, h)
} } // OPTIONS method route
func (r *Router) OPTIONS(pattern string, h http.HandlerFunc) {
// Options method route
func (r *Router) Options(pattern string, h http.HandlerFunc) {
r.handlerFunc(http.MethodOptions, pattern, h) r.handlerFunc(http.MethodOptions, pattern, h)
} }
// Trace method route // TRACE method route
func (r *Router) Trace(pattern string, h http.HandlerFunc) { func (r *Router) TRACE(pattern string, h http.HandlerFunc) {
r.handlerFunc(http.MethodTrace, pattern, h) r.handlerFunc(http.MethodTrace, pattern, h)
} }

21
router_options_handler.go Normal file
View File

@ -0,0 +1,21 @@
package mux
import (
"io"
"net/http"
)
type optionsHandler struct{}
func (optionsHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Length", "0")
if r.ContentLength != 0 {
// Read up to 4KB of OPTIONS body (as mentioned in the
// spec as being reserved for future use), but anything
// over that is considered a waste of server resources
// (or an attack) and we abort and close the connection,
// courtesy of MaxBytesReader's EOF behavior.
mb := http.MaxBytesReader(w, r.Body, 4<<10)
io.Copy(io.Discard, mb)
}
}