mirror of
https://github.com/kataras/iris.git
synced 2025-01-23 10:41:03 +01:00
401 lines
14 KiB
Go
401 lines
14 KiB
Go
package iris
|
|
|
|
import (
|
|
"github.com/kataras/iris/config"
|
|
"github.com/kataras/iris/logger"
|
|
"github.com/kataras/iris/mail"
|
|
"github.com/kataras/iris/render/rest"
|
|
"github.com/kataras/iris/render/template"
|
|
"github.com/kataras/iris/server"
|
|
"github.com/kataras/iris/websocket"
|
|
)
|
|
|
|
// DefaultIris in order to use iris.Get(...,...) we need a default Iris on the package level
|
|
var DefaultIris = New()
|
|
|
|
// Listen starts the standalone http server
|
|
// which listens to the addr parameter which as the form of
|
|
// host:port or just port
|
|
//
|
|
// It panics on error if you need a func to return an error use the ListenWithErr
|
|
// ex: iris.Listen(":8080")
|
|
func Listen(addr string) {
|
|
DefaultIris.Listen(addr)
|
|
}
|
|
|
|
// ListenWithErr starts the standalone http server
|
|
// which listens to the addr parameter which as the form of
|
|
// host:port or just port
|
|
//
|
|
// It returns an error you are responsible how to handle this
|
|
// if you need a func to panic on error use the Listen
|
|
// ex: log.Fatal(iris.ListenWithErr(":8080"))
|
|
func ListenWithErr(addr string) error {
|
|
return DefaultIris.ListenWithErr(addr)
|
|
}
|
|
|
|
// ListenTLS Starts a https server with certificates,
|
|
// if you use this method the requests of the form of 'http://' will fail
|
|
// only https:// connections are allowed
|
|
// which listens to the addr parameter which as the form of
|
|
// host:port or just port
|
|
//
|
|
// It panics on error if you need a func to return an error use the ListenTLSWithErr
|
|
// ex: iris.ListenTLS(":8080","yourfile.cert","yourfile.key")
|
|
func ListenTLS(addr string, certFile, keyFile string) {
|
|
DefaultIris.ListenTLS(addr, certFile, keyFile)
|
|
}
|
|
|
|
// ListenTLSWithErr Starts a https server with certificates,
|
|
// if you use this method the requests of the form of 'http://' will fail
|
|
// only https:// connections are allowed
|
|
// which listens to the addr parameter which as the form of
|
|
// host:port or just port
|
|
//
|
|
// It returns an error you are responsible how to handle this
|
|
// if you need a func to panic on error use the ListenTLS
|
|
// ex: log.Fatal(iris.ListenTLSWithErr(":8080","yourfile.cert","yourfile.key"))
|
|
func ListenTLSWithErr(addr string, certFile, keyFile string) error {
|
|
return DefaultIris.ListenTLSWithErr(addr, certFile, keyFile)
|
|
}
|
|
|
|
// Close is used to close the net.Listener of the standalone http server which has already running via .Listen
|
|
func Close() { DefaultIris.Close() }
|
|
|
|
// Router implementation
|
|
|
|
// Party is just a group joiner of routes which have the same prefix and share same middleware(s) also.
|
|
// Party can also be named as 'Join' or 'Node' or 'Group' , Party chosen because it has more fun
|
|
func Party(path string, handlersFn ...HandlerFunc) IParty {
|
|
return DefaultIris.Party(path, handlersFn...)
|
|
}
|
|
|
|
// Handle registers a route to the server's router
|
|
// if empty method is passed then registers handler(s) for all methods, same as .Any
|
|
func Handle(method string, registedPath string, handlers ...Handler) IRoute {
|
|
return DefaultIris.Handle(method, registedPath, handlers...)
|
|
}
|
|
|
|
// HandleFunc registers a route with a method, path string, and a handler
|
|
func HandleFunc(method string, path string, handlersFn ...HandlerFunc) IRoute {
|
|
return DefaultIris.HandleFunc(method, path, handlersFn...)
|
|
}
|
|
|
|
// API converts & registers a custom struct to the router
|
|
// receives two parameters
|
|
// first is the request path (string)
|
|
// second is the custom struct (interface{}) which can be anything that has a *iris.Context as field.
|
|
// third are the common middlewares, is optional parameter
|
|
//
|
|
// Note that API's routes have their default-name to the full registed path,
|
|
// no need to give a special name for it, because it's not supposed to be used inside your templates.
|
|
//
|
|
// Recommend to use when you retrieve data from an external database,
|
|
// and the router-performance is not the (only) thing which slows the server's overall performance.
|
|
//
|
|
// This is a slow method, if you care about router-performance use the Handle/HandleFunc/Get/Post/Put/Delete/Trace/Options... instead
|
|
//
|
|
// Usage:
|
|
// All the below methods are optional except the *iris.Context field,
|
|
// example with /users :
|
|
/*
|
|
|
|
package main
|
|
|
|
import (
|
|
"github.com/kataras/iris"
|
|
)
|
|
|
|
type UserAPI struct {
|
|
*iris.Context
|
|
}
|
|
|
|
// GET /users
|
|
func (u UserAPI) Get() {
|
|
u.Write("Get from /users")
|
|
// u.JSON(iris.StatusOK,myDb.AllUsers())
|
|
}
|
|
|
|
// GET /:param1 which its value passed to the id argument
|
|
func (u UserAPI) GetBy(id string) { // id equals to u.Param("param1")
|
|
u.Write("Get from /users/%s", id)
|
|
// u.JSON(iris.StatusOK, myDb.GetUserById(id))
|
|
|
|
}
|
|
|
|
// PUT /users
|
|
func (u UserAPI) Put() {
|
|
name := u.FormValue("name")
|
|
// myDb.InsertUser(...)
|
|
println(string(name))
|
|
println("Put from /users")
|
|
}
|
|
|
|
// POST /users/:param1
|
|
func (u UserAPI) PostBy(id string) {
|
|
name := u.FormValue("name") // you can still use the whole Context's features!
|
|
// myDb.UpdateUser(...)
|
|
println(string(name))
|
|
println("Post from /users/" + id)
|
|
}
|
|
|
|
// DELETE /users/:param1
|
|
func (u UserAPI) DeleteBy(id string) {
|
|
// myDb.DeleteUser(id)
|
|
println("Delete from /" + id)
|
|
}
|
|
|
|
func main() {
|
|
iris.API("/users", UserAPI{})
|
|
iris.Listen(":80")
|
|
}
|
|
*/
|
|
func API(registedPath string, controller HandlerAPI, middlewares ...HandlerFunc) error {
|
|
return DefaultIris.API(registedPath, controller, middlewares...)
|
|
}
|
|
|
|
// Use appends a middleware to the route or to the router if it's called from router
|
|
func Use(handlers ...Handler) {
|
|
DefaultIris.Use(handlers...)
|
|
}
|
|
|
|
// UseFunc same as Use but it accepts/receives ...HandlerFunc instead of ...Handler
|
|
// form of acceptable: func(c *iris.Context){//first middleware}, func(c *iris.Context){//second middleware}
|
|
func UseFunc(handlersFn ...HandlerFunc) {
|
|
DefaultIris.UseFunc(handlersFn...)
|
|
}
|
|
|
|
// Get registers a route for the Get http method
|
|
func Get(path string, handlersFn ...HandlerFunc) RouteNameFunc {
|
|
return DefaultIris.Get(path, handlersFn...)
|
|
}
|
|
|
|
// Post registers a route for the Post http method
|
|
func Post(path string, handlersFn ...HandlerFunc) RouteNameFunc {
|
|
return DefaultIris.Post(path, handlersFn...)
|
|
}
|
|
|
|
// Put registers a route for the Put http method
|
|
func Put(path string, handlersFn ...HandlerFunc) RouteNameFunc {
|
|
return DefaultIris.Put(path, handlersFn...)
|
|
}
|
|
|
|
// Delete registers a route for the Delete http method
|
|
func Delete(path string, handlersFn ...HandlerFunc) RouteNameFunc {
|
|
return DefaultIris.Delete(path, handlersFn...)
|
|
}
|
|
|
|
// Connect registers a route for the Connect http method
|
|
func Connect(path string, handlersFn ...HandlerFunc) RouteNameFunc {
|
|
return DefaultIris.Connect(path, handlersFn...)
|
|
}
|
|
|
|
// Head registers a route for the Head http method
|
|
func Head(path string, handlersFn ...HandlerFunc) RouteNameFunc {
|
|
return DefaultIris.Head(path, handlersFn...)
|
|
}
|
|
|
|
// Options registers a route for the Options http method
|
|
func Options(path string, handlersFn ...HandlerFunc) RouteNameFunc {
|
|
return DefaultIris.Options(path, handlersFn...)
|
|
}
|
|
|
|
// Patch registers a route for the Patch http method
|
|
func Patch(path string, handlersFn ...HandlerFunc) RouteNameFunc {
|
|
return DefaultIris.Patch(path, handlersFn...)
|
|
}
|
|
|
|
// Trace registers a route for the Trace http methodd
|
|
func Trace(path string, handlersFn ...HandlerFunc) RouteNameFunc {
|
|
return DefaultIris.Trace(path, handlersFn...)
|
|
}
|
|
|
|
// Any registers a route for ALL of the http methods (Get,Post,Put,Head,Patch,Options,Connect,Delete)
|
|
func Any(path string, handlersFn ...HandlerFunc) []IRoute {
|
|
return DefaultIris.Any(path, handlersFn...)
|
|
}
|
|
|
|
// RouteByName returns a route by its name,if not found then returns a route with empty path
|
|
// Note that the searching is case-sensitive
|
|
func RouteByName(lookUpName string) IRoute {
|
|
return DefaultIris.RouteByName(lookUpName)
|
|
}
|
|
|
|
// StaticHandlerFunc returns a HandlerFunc to serve static system directory
|
|
// Accepts 5 parameters
|
|
//
|
|
// first is the systemPath (string)
|
|
// Path to the root directory to serve files from.
|
|
//
|
|
// second is the stripSlashes (int) level
|
|
// * stripSlashes = 0, original path: "/foo/bar", result: "/foo/bar"
|
|
// * stripSlashes = 1, original path: "/foo/bar", result: "/bar"
|
|
// * stripSlashes = 2, original path: "/foo/bar", result: ""
|
|
//
|
|
// third is the compress (bool)
|
|
// Transparently compresses responses if set to true.
|
|
//
|
|
// The server tries minimizing CPU usage by caching compressed files.
|
|
// It adds FSCompressedFileSuffix suffix to the original file name and
|
|
// tries saving the resulting compressed file under the new file name.
|
|
// So it is advisable to give the server write access to Root
|
|
// and to all inner folders in order to minimze CPU usage when serving
|
|
// compressed responses.
|
|
//
|
|
// fourth is the generateIndexPages (bool)
|
|
// Index pages for directories without files matching IndexNames
|
|
// are automatically generated if set.
|
|
//
|
|
// Directory index generation may be quite slow for directories
|
|
// with many files (more than 1K), so it is discouraged enabling
|
|
// index pages' generation for such directories.
|
|
//
|
|
// fifth is the indexNames ([]string)
|
|
// List of index file names to try opening during directory access.
|
|
//
|
|
// For example:
|
|
//
|
|
// * index.html
|
|
// * index.htm
|
|
// * my-super-index.xml
|
|
//
|
|
func StaticHandlerFunc(systemPath string, stripSlashes int, compress bool, generateIndexPages bool, indexNames []string) HandlerFunc {
|
|
return DefaultIris.StaticHandlerFunc(systemPath, stripSlashes, compress, generateIndexPages, indexNames)
|
|
}
|
|
|
|
// Static registers a route which serves a system directory
|
|
// this doesn't generates an index page which list all files
|
|
// no compression is used also, for these features look at StaticFS func
|
|
// accepts three parameters
|
|
// first parameter is the request url path (string)
|
|
// second parameter is the system directory (string)
|
|
// third parameter is the level (int) of stripSlashes
|
|
// * stripSlashes = 0, original path: "/foo/bar", result: "/foo/bar"
|
|
// * stripSlashes = 1, original path: "/foo/bar", result: "/bar"
|
|
// * stripSlashes = 2, original path: "/foo/bar", result: ""
|
|
func Static(reqPath string, systemPath string, stripSlashes int) {
|
|
DefaultIris.Static(reqPath, systemPath, stripSlashes)
|
|
}
|
|
|
|
// StaticFS registers a route which serves a system directory
|
|
// generates an index page which list all files
|
|
// uses compression which file cache, if you use this method it will generate compressed files also
|
|
// think this function as small fileserver with http
|
|
// accepts three parameters
|
|
// first parameter is the request url path (string)
|
|
// second parameter is the system directory (string)
|
|
// third parameter is the level (int) of stripSlashes
|
|
// * stripSlashes = 0, original path: "/foo/bar", result: "/foo/bar"
|
|
// * stripSlashes = 1, original path: "/foo/bar", result: "/bar"
|
|
// * stripSlashes = 2, original path: "/foo/bar", result: ""
|
|
func StaticFS(reqPath string, systemPath string, stripSlashes int) {
|
|
DefaultIris.StaticFS(reqPath, systemPath, stripSlashes)
|
|
}
|
|
|
|
// StaticWeb same as Static but if index.html exists and request uri is '/' then display the index.html's contents
|
|
// accepts three parameters
|
|
// first parameter is the request url path (string)
|
|
// second parameter is the system directory (string)
|
|
// third parameter is the level (int) of stripSlashes
|
|
// * stripSlashes = 0, original path: "/foo/bar", result: "/foo/bar"
|
|
// * stripSlashes = 1, original path: "/foo/bar", result: "/bar"
|
|
// * stripSlashes = 2, original path: "/foo/bar", result: ""
|
|
func StaticWeb(reqPath string, systemPath string, stripSlashes int) {
|
|
DefaultIris.StaticWeb(reqPath, systemPath, stripSlashes)
|
|
}
|
|
|
|
// StaticServe serves a directory as web resource
|
|
// it's the simpliest form of the Static* functions
|
|
// Almost same usage as StaticWeb
|
|
// accepts only one required parameter which is the systemPath ( the same path will be used to register the GET&HEAD routes)
|
|
// if second parameter is empty, otherwise the requestPath is the second parameter
|
|
// it uses gzip compression (compression on each request, no file cache)
|
|
func StaticServe(systemPath string, requestPath ...string) {
|
|
DefaultIris.StaticServe(systemPath, requestPath...)
|
|
}
|
|
|
|
// Favicon serves static favicon
|
|
// accepts 2 parameters, second is optionally
|
|
// favPath (string), declare the system directory path of the __.ico
|
|
// requestPath (string), it's the route's path, by default this is the "/favicon.ico" because some browsers tries to get this by default first,
|
|
// you can declare your own path if you have more than one favicon (desktop, mobile and so on)
|
|
//
|
|
// this func will add a route for you which will static serve the /yuorpath/yourfile.ico to the /yourfile.ico (nothing special that you can't handle by yourself)
|
|
// Note that you have to call it on every favicon you have to serve automatically (dekstop, mobile and so on)
|
|
//
|
|
// returns an error if something goes bad
|
|
func Favicon(favPath string, requestPath ...string) error {
|
|
return DefaultIris.Favicon(favPath)
|
|
}
|
|
|
|
// StaticContent serves bytes, memory cached, on the reqPath
|
|
func StaticContent(reqPath string, contentType string, content []byte) {
|
|
DefaultIris.StaticContent(reqPath, contentType, content)
|
|
}
|
|
|
|
// OnError Registers a handler for a specific http error status
|
|
func OnError(httpStatus int, handler HandlerFunc) {
|
|
DefaultIris.OnError(httpStatus, handler)
|
|
}
|
|
|
|
// EmitError executes the handler of the given error http status code
|
|
func EmitError(httpStatus int, ctx *Context) {
|
|
DefaultIris.EmitError(httpStatus, ctx)
|
|
}
|
|
|
|
// OnNotFound sets the handler for http status 404,
|
|
// default is a response with text: 'Not Found' and status: 404
|
|
func OnNotFound(handlerFunc HandlerFunc) {
|
|
DefaultIris.OnNotFound(handlerFunc)
|
|
}
|
|
|
|
// OnPanic sets the handler for http status 500,
|
|
// default is a response with text: The server encountered an unexpected condition which prevented it from fulfilling the request. and status: 500
|
|
func OnPanic(handlerFunc HandlerFunc) {
|
|
DefaultIris.OnPanic(handlerFunc)
|
|
}
|
|
|
|
// ***********************
|
|
// Export DefaultIris's exported properties
|
|
// ***********************
|
|
|
|
// Server returns the server
|
|
func Server() *server.Server {
|
|
return DefaultIris.Server()
|
|
}
|
|
|
|
// Plugins returns the plugin container
|
|
func Plugins() *PluginContainer {
|
|
return DefaultIris.Plugins()
|
|
}
|
|
|
|
// Config returns the configs
|
|
func Config() *config.Iris {
|
|
return DefaultIris.Config()
|
|
}
|
|
|
|
// Logger returns the logger
|
|
func Logger() *logger.Logger {
|
|
return DefaultIris.Logger()
|
|
}
|
|
|
|
// Rest returns the rest render
|
|
func Rest() *rest.Render {
|
|
return DefaultIris.Rest()
|
|
}
|
|
|
|
// Templates returns the template render
|
|
func Templates() *template.Template {
|
|
return DefaultIris.Templates()
|
|
}
|
|
|
|
// Websocket returns the websocket server
|
|
func Websocket() websocket.Server {
|
|
return DefaultIris.Websocket()
|
|
}
|
|
|
|
// Mail returns the mail sender service
|
|
func Mail() mail.Service {
|
|
return DefaultIris.Mail()
|
|
}
|