traffic

package module
v0.0.0-...-ea753fc Latest Latest
Warning

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

Go to latest
Published: Jul 14, 2021 License: MIT Imports: 19 Imported by: 0

README

Traffic

Build Status

Package traffic - a Sinatra inspired regexp/pattern mux for Go.

Installation

go get github.com/pilu/traffic

Features

Development Features

development is the default environment. The above middlewares are loaded only in development.

If you want to run your application in production, export TRAFFIC_ENV with production as value.

TRAFFIC_ENV=production your-executable-name

Installation

Dowload the Traffic code:

go get github.com/pilu/traffic

Build the command line tool:

go get github.com/pilu/traffic/traffic

Create a new project:

traffic new hello

Run your project:

cd hello
go build && ./hello

You can use Fresh if you want to build and restart your application every time you create/modify/delete a file.

Example:

The following code is a simple example, the documentation in still in development. For more examples check the examples folder.

package main

import (
  "net/http"
  "github.com/pilu/traffic"
  "fmt"
)

func rootHandler(w traffic.ResponseWriter, r *traffic.Request) {
  fmt.Fprint(w, "Hello World\n")
}

func pageHandler(w traffic.ResponseWriter, r *traffic.Request) {
  params := r.URL.Query()
  fmt.Fprintf(w, "Category ID: %s\n", params.Get("category_id"))
  fmt.Fprintf(w, "Page ID: %s\n", params.Get("id"))
}

func main() {
  router := traffic.New()

  // Routes
  router.Get("/", rootHandler)
  router.Get("/categories/:category_id/pages/:id", pageHandler)

  router.Run()
}

Before Filters

You can also add "before filters" to all your routes or just to some of them:

router := traffic.New()

// Executed before all handlers
router.AddBeforeFilter(checkApiKey).
       AddBeforeFilter(addAppNameHeader).
       AddBeforeFilter(addTimeHeader)

// Routes
router.Get("/", rootHandler)
router.Get("/categories/:category_id/pages/:id", pageHandler)

// "/private" has one more before filter that checks for a second api key (private_api_key)
router.Get("/private", privatePageHandler).
        AddBeforeFilter(checkPrivatePageApiKey)

Complete example:

func rootHandler(w traffic.ResponseWriter, r *traffic.Request) {
  fmt.Fprint(w, "Hello World\n")
}

func privatePageHandler(w traffic.ResponseWriter, r *traffic.Request) {
  fmt.Fprint(w, "Hello Private Page\n")
}

func pageHandler(w traffic.ResponseWriter, r *traffic.Request) {
  params := r.URL.Query()
  fmt.Fprintf(w, "Category ID: %s\n", params.Get("category_id"))
  fmt.Fprintf(w, "Page ID: %s\n", params.Get("id"))
}

func checkApiKey(w traffic.ResponseWriter, r *traffic.Request) {
  params := r.URL.Query()
  if params.Get("api_key") != "foo" {
    w.WriteHeader(http.StatusUnauthorized)
  }
}

func checkPrivatePageApiKey(w traffic.ResponseWriter, r *traffic.Request) {
  params := r.URL.Query()
  if params.Get("private_api_key") != "bar" {
    w.WriteHeader(http.StatusUnauthorized)
  }
}

func addAppNameHeader(w traffic.ResponseWriter, r *traffic.Request) {
  w.Header().Add("X-APP-NAME", "My App")
}

func addTimeHeader(w traffic.ResponseWriter, r *traffic.Request) {
  t := fmt.Sprintf("%s", time.Now())
  w.Header().Add("X-APP-TIME", t)
}

func main() {
  router := traffic.New()

  // Routes
  router.Get("/", rootHandler)
  router.Get("/categories/:category_id/pages/:id", pageHandler)
  // "/private" has one more before filter that checks for a second api key (private_api_key)
  router.Get("/private", privatePageHandler).
          AddBeforeFilter(checkPrivatePageApiKey)

  // Executed before all handlers
  router.AddBeforeFilter(checkApiKey).
         AddBeforeFilter(addAppNameHeader).
         AddBeforeFilter(addTimeHeader)

  router.Run()
}

Author

More

Documentation

Overview

Package traffic - a Sinatra inspired regexp/pattern mux for Go.

Docs and examples are on github: https://github.com/pilu/traffic/

Index

Constants

View Source
const (
	EnvDevelopment    = "development"
	EnvProduction     = "production"
	DefaultEnv        = EnvProduction
	DefaultViewsPath  = "views"
	DefaultPublicPath = "public"
	DefaultConfigFile = "traffic.conf"
	DefaultPort       = 3000
	DefaultHost       = "127.0.0.1"
)
View Source
const TemplateExtension = ".tpl"

Variables

This section is empty.

Functions

func ConfigFilePath

func ConfigFilePath() string

func Env

func Env() string

func GetStringVar

func GetStringVar(key string) string

func GetStringVarWithDefault

func GetStringVarWithDefault(key, defaultValue string) string

func GetVar

func GetVar(key string) interface{}

func Host

func Host() string

func Port

func Port() int

func PublicPath

func PublicPath() string

func RenderTemplate

func RenderTemplate(w ResponseWriter, templateName string, data ...interface{})

func RootPath

func RootPath() string

func SetHost

func SetHost(host string)

func SetLogger

func SetLogger(customLogger ILogger)

func SetPort

func SetPort(port int)

func SetVar

func SetVar(key string, value interface{})

func TemplateFunc

func TemplateFunc(name string, fn interface{})

func TemplateFuncs

func TemplateFuncs(funcs map[string]interface{})

func ViewsPath

func ViewsPath() string

Types

type ErrorHandlerFunc

type ErrorHandlerFunc func(ResponseWriter, *Request, interface{})

type HttpHandleFunc

type HttpHandleFunc func(ResponseWriter, *Request)

type HttpMethod

type HttpMethod string

type ILogger

type ILogger interface {
	Print(...interface{})
	Printf(string, ...interface{})
}

func Logger

func Logger() ILogger

type LoggerMiddleware

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

func (*LoggerMiddleware) ServeHTTP

func (loggerMiddleware *LoggerMiddleware) ServeHTTP(w ResponseWriter, r *Request, next NextMiddlewareFunc)

type Middleware

type Middleware interface {
	ServeHTTP(ResponseWriter, *Request, NextMiddlewareFunc)
}

type NextMiddlewareFunc

type NextMiddlewareFunc func() Middleware

type RenderFunc

type RenderFunc func(w ResponseWriter, template string, data interface{})

type Request

type Request struct {
	*http.Request
}

func (Request) Param

func (r Request) Param(key string) string

func (Request) Params

func (r Request) Params() url.Values

type ResponseWriter

type ResponseWriter interface {
	http.ResponseWriter
	http.Hijacker
	SetVar(string, interface{})
	GetVar(string) interface{}
	StatusCode() int
	Written() bool
	BodyWritten() bool
	Render(string, ...interface{})
	WriteJSON(data interface{})
	WriteXML(data interface{})
	WriteText(string, ...interface{})
}

type Route

type Route struct {
	Path       string
	PathRegexp *regexp.Regexp
	IsStatic   bool
	Handlers   []HttpHandleFunc
	// contains filtered or unexported fields
}

func NewRoute

func NewRoute(path string, handlers ...HttpHandleFunc) *Route

func (*Route) AddBeforeFilter

func (route *Route) AddBeforeFilter(beforeFilters ...HttpHandleFunc) *Route

func (Route) Match

func (route Route) Match(path string) (url.Values, bool)

type Router

type Router struct {
	NotFoundHandler HttpHandleFunc
	ErrorHandler    ErrorHandlerFunc
	// contains filtered or unexported fields
}

func New

func New() *Router

func (*Router) Add

func (router *Router) Add(method HttpMethod, path string, handlers ...HttpHandleFunc) *Route

func (*Router) AddBeforeFilter

func (router *Router) AddBeforeFilter(beforeFilters ...HttpHandleFunc) *Router

func (*Router) Delete

func (router *Router) Delete(path string, handlers ...HttpHandleFunc) *Route

func (*Router) Get

func (router *Router) Get(path string, handlers ...HttpHandleFunc) *Route

func (*Router) GetVar

func (router *Router) GetVar(key string) interface{}

func (Router) MiddlewareEnumerator

func (router Router) MiddlewareEnumerator() func() Middleware

func (*Router) Patch

func (router *Router) Patch(path string, handlers ...HttpHandleFunc) *Route

func (*Router) Post

func (router *Router) Post(path string, handlers ...HttpHandleFunc) *Route

func (*Router) Put

func (router *Router) Put(path string, handlers ...HttpHandleFunc) *Route

func (*Router) Run

func (router *Router) Run()

func (*Router) RunSSL

func (router *Router) RunSSL(certFile, keyFile string)

func (*Router) ServeHTTP

func (router *Router) ServeHTTP(httpResponseWriter http.ResponseWriter, httpRequest *http.Request)

func (*Router) SetVar

func (router *Router) SetVar(key string, value interface{})

func (*Router) Use

func (router *Router) Use(middleware Middleware)

type RouterMiddleware

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

func (*RouterMiddleware) ServeHTTP

func (routerMiddleware *RouterMiddleware) ServeHTTP(w ResponseWriter, r *Request, next NextMiddlewareFunc)

type ShowErrorsMiddleware

type ShowErrorsMiddleware struct{}

func (ShowErrorsMiddleware) RenderError

func (middleware ShowErrorsMiddleware) RenderError(w ResponseWriter, r *Request, err interface{}, stack []byte)

func (ShowErrorsMiddleware) ServeHTTP

func (middleware ShowErrorsMiddleware) ServeHTTP(w ResponseWriter, r *Request, next NextMiddlewareFunc)

type StaticMiddleware

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

func NewStaticMiddleware

func NewStaticMiddleware(publicPath string) *StaticMiddleware

func (*StaticMiddleware) ServeHTTP

func (middleware *StaticMiddleware) ServeHTTP(w ResponseWriter, r *Request, next NextMiddlewareFunc)

type TemplateManager

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

func (*TemplateManager) Render

func (t *TemplateManager) Render(w ResponseWriter, template string, data interface{})

func (*TemplateManager) RenderTemplateErrors

func (t *TemplateManager) RenderTemplateErrors(w ResponseWriter, template string, data interface{})

func (*TemplateManager) WalkFunc

func (t *TemplateManager) WalkFunc(path string, info os.FileInfo, err error) error

Jump to

Keyboard shortcuts

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