ruffe

package module
v1.4.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 3, 2021 License: MIT Imports: 6 Imported by: 2

README

Ruffe

Go Report GoDoc go.dev reference License Tag

Ruffe preview

Golang HTTP handler

Guide

Installing
go get -u github.com/8bitdogs/ruffe
Router
package main

import (
	"net/http"

	"github.com/8bitdogs/ruffe"
)

func main() {
	// Ruffe instance
	rr := ruffe.New()

	// add handler
	rr.HandleFunc("/", http.MethodGet, hello)

	// Start server
	http.ListenAndServe(":3030", rs)
}

// hello handler
func hello(ctx ruffe.Context) error {
	return ctx.Result(http.StatusOK, "hello world")
}
Customization

Using custom request router

package main

import (
	"net/http"

	"github.com/8bitdogs/ruffe"
	"github.com/gorilla/mux"
)

type Router struct {
	*mux.Router
}

// We have to override gorilla Handle and HandleFunc, because those two functions are returning gorilla Router instance

func (r *Router) Handle(pattern string, handler http.Handler) {
	r.Router.Handle(pattern, handler)
}

func (r *Router) HandleFunc(pattern string, handler func(http.ResponseWriter, *http.Request)) {
	r.Router.HandleFunc(pattern, handler)
}

type muxCreator struct{}

func (muxCreator) Create() ruffe.Mux {
	return &Router{
		Router: mux.NewRouter(),
	}
}

func main() {
	r := ruffe.NewMux(muxCreator{})
	r.HandleFunc("/foo/{id}", "GET", func(ctx ruffe.Context) error {
		// as you can see, gorilla mux features are available :) 
		return ctx.Result(http.StatusOK, "bar"+mux.Vars(ctx.Request())["id"])
	})
	http.ListenAndServe(":3030", r)
}
Interceptors

example with logging interceptor

rr := ruffe.New()

// adding interceptor
rr.AppendInterceptor(func(w http.ResponseWriter, r *http.Request, next http.HandlerFunc) {
	log.Println(r.URL, r.Method, r.Header)
	next(w, r)
	log.Println("done")
})

// ... handlers registration

http.ListenAndServe(":3030", rr)
Middlewares
Handler middleware
// Initializing Ruffe Middleware
// Middleware implements ruffe.Handler interface
mw := ruffe.NewMiddlewareFunc(func(_ ruffe.Context) error {
	// Middleware logic
	return nil
})

// Add middleware handler before calling <ruffe handler> 
mwh := mw.Before(<ruffe handler>) // WrapFunc returns middleware

// Add middleware handler after calling <ruffe handler> 
mwh := mw.After(<ruffe handler>) // WrapAfterFunc returns middleware
Router middleware
rr := ruffe.New()

// applies handler which invokes before executing each registered handler
rr.Use(<ruffe handler>)

// applies handler which invokes after executing each registered handler
rr.UseAfter(<ruffe handler>)
Error handling
package main

import (
	"errors"
	"net/http"

	"github.com/8bitdogs/ruffe"
)

var Err = errors.New("error")

func main() {
	// Ruffe instance
	rr := ruffe.New()

	// Define error handler
	rr.OnError = func(_ ruffe.Context, err error) error {
		if err == Err {
			// Caught!
			return nil
		}
		return nil
	}

	// add handler
	rr.HandleFunc("/", http.MethodGet, hello)

	// Start server
	http.ListenAndServe(":3030", rs)
}

// hello handler
func hello(_ ruffe.Context) error {
	return Err
}

Documentation

Index

Constants

View Source
const (
	AcceptHeader      = "Accept"
	ContentTypeHeader = "Content-Type"
)
View Source
const (
	MethodGet     = "GET"
	MethodHead    = "HEAD"
	MethodPost    = "POST"
	MethodPut     = "PUT"
	MethodPatch   = "PATCH" // RFC 5789
	MethodDelete  = "DELETE"
	MethodConnect = "CONNECT"
	MethodOptions = "OPTIONS"
	MethodTrace   = "TRACE"
)

Variables

View Source
var (
	ErrResponseWasAlreadySent = errors.New("result was sent")
	ErrUnsupportableContext   = errors.New("unsupportable context")
)
View Source
var Content = ContentUtil{}

Functions

func Load

func Load(ctx Context, key interface{}) interface{}

func Store

func Store(ctx Context, key interface{}, value interface{})

Types

type ContentUtil

type ContentUtil struct{}

func (ContentUtil) JSON

func (u ContentUtil) JSON(ctx Context) error

func (ContentUtil) SetJSONMarshaller

func (u ContentUtil) SetJSONMarshaller(ctx Context) error

func (ContentUtil) SetJSONUnmarshaller

func (u ContentUtil) SetJSONUnmarshaller(ctx Context) error

func (ContentUtil) SetXMLMarshaller

func (u ContentUtil) SetXMLMarshaller(ctx Context) error

func (ContentUtil) SetXMLUnmarshaller

func (u ContentUtil) SetXMLUnmarshaller(ctx Context) error

func (ContentUtil) XML

func (u ContentUtil) XML(ctx Context) error

type Context

type Context interface {
	http.ResponseWriter
	Request() *http.Request
	Bind(interface{}) error
	Result(int, interface{}) error
	// contains filtered or unexported methods
}

func ContextFromRequest

func ContextFromRequest(w http.ResponseWriter, r *http.Request) Context

type HTTPHandlerFunc

type HTTPHandlerFunc func(http.ResponseWriter, *http.Request)

func (HTTPHandlerFunc) Handle

func (h HTTPHandlerFunc) Handle(ctx Context) error

type Handler

type Handler interface {
	Handle(h Context) error
}

type HandlerFunc

type HandlerFunc func(Context) error

func (HandlerFunc) Handle

func (h HandlerFunc) Handle(ctx Context) error

type Middleware

type Middleware struct {
	OnError func(Context, error) error
	// contains filtered or unexported fields
}

func NewMiddleware

func NewMiddleware(h Handler) *Middleware

func NewMiddlewareFunc

func NewMiddlewareFunc(f func(Context) error) *Middleware

func (*Middleware) After added in v1.4.0

func (m *Middleware) After(h Handler) *Middleware

After create middleware which call Middleware handler after handler from argument

func (*Middleware) AfterFunc added in v1.4.0

func (m *Middleware) AfterFunc(f func(Context) error) *Middleware

AfterFunc do same as After

func (*Middleware) Before added in v1.4.0

func (m *Middleware) Before(h Handler) *Middleware

Before create middleware which call Middleware handler before handler from argument

func (*Middleware) BeforeFunc added in v1.4.0

func (m *Middleware) BeforeFunc(f func(Context) error) *Middleware

BeforeFunc do same as Before

func (*Middleware) Handle

func (m *Middleware) Handle(ctx Context) error

func (*Middleware) Wrap

func (m *Middleware) Wrap(f func(ctx Context, next Handler) error) *Middleware

Wrap crate middleware from f argument where pass Middleware handler as next argument

type Mux

type Mux interface {
	Handle(pattern string, handler http.Handler)
	HandleFunc(pattern string, handler func(http.ResponseWriter, *http.Request))
	ServeHTTP(w http.ResponseWriter, r *http.Request)
}

type MuxCreator

type MuxCreator interface {
	Create() Mux
}

type Router

type Router struct {
	// contains filtered or unexported fields
}

func New

func New() *Router

New allocates and returns a new ruffe Router with http.ServeMux

func NewMux

func NewMux(mc MuxCreator) *Router

NewMux allocates and returns a new ruffe Router with provided mux

func (*Router) AppendInterceptor

func (r *Router) AppendInterceptor(i func(w http.ResponseWriter, r *http.Request, next http.HandlerFunc))

AppendInterceptor adding http.Handler with reference on next interceptor which invokes before ruffe handler Warning: Don't forget to call next(w, r) inside interceptor, if it won't be called handler will stop on current executing interceptor

func (*Router) Delete added in v1.4.2

func (r *Router) Delete(pattern string, h Handler)

func (*Router) DeleteFunc added in v1.4.2

func (r *Router) DeleteFunc(pattern string, f func(Context) error)

func (*Router) Get added in v1.4.2

func (r *Router) Get(pattern string, h Handler)

func (*Router) GetFunc added in v1.4.2

func (r *Router) GetFunc(pattern string, f func(Context) error)

func (*Router) Handle

func (r *Router) Handle(pattern, method string, h Handler)

Handle registers the handler for the given pattern with method. If a handler already exists for pattern, Handle panics (Only for default Mux).

func (*Router) HandleFunc

func (r *Router) HandleFunc(pattern, method string, f func(Context) error)

HandleFunc registers the handler for the given pattern with method. If a handler already exists for pattern, Handle panics (Only for default Mux).

func (*Router) Head added in v1.4.2

func (r *Router) Head(pattern string, h Handler)

func (*Router) HeadFunc added in v1.4.2

func (r *Router) HeadFunc(pattern string, f func(Context) error)

func (*Router) OnError

func (r *Router) OnError(f func(Context, error) error)

OnError assign error handler for Route

func (*Router) Patch added in v1.4.2

func (r *Router) Patch(pattern string, h Handler)

func (*Router) PatchFunc added in v1.4.2

func (r *Router) PatchFunc(pattern string, f func(Context) error)

func (*Router) Post added in v1.4.2

func (r *Router) Post(pattern string, h Handler)

func (*Router) PostFunc added in v1.4.2

func (r *Router) PostFunc(pattern string, f func(Context) error)

func (*Router) Put added in v1.4.2

func (r *Router) Put(pattern string, h Handler)

func (*Router) PutFunc added in v1.4.2

func (r *Router) PutFunc(pattern string, f func(Context) error)

func (*Router) ServeHTTP

func (r *Router) ServeHTTP(w http.ResponseWriter, rq *http.Request)

func (*Router) Subrouter added in v1.3.1

func (r *Router) Subrouter(pathPrefix string) *Router

Subrouter creates copy of router Handle and HandleFunc will register handlers to parent router mux

func (*Router) Use

func (r *Router) Use(h Handler)

Use applies handler which invokes before executing each registered handler

func (*Router) UseAfter

func (r *Router) UseAfter(h Handler)

UseAfter applies handler which invokes after executing each registered handler

func (*Router) UseAfterFunc

func (r *Router) UseAfterFunc(f func(Context) error)

UseAfterFunc applies handler which invokes after executing each registered handler

func (*Router) UseFunc

func (r *Router) UseFunc(f func(Context) error)

UseFunc applies handler which invokes before executing each registered handler

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL