123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784 |
- package iris
- import (
- "io/ioutil"
- "os"
- "os/user"
- "path/filepath"
- "runtime"
- "github.com/BurntSushi/toml"
- "gopkg.in/yaml.v2"
- "github.com/kataras/iris/context"
- "github.com/kataras/iris/core/errors"
- )
- const globalConfigurationKeyword = "~"
- // homeConfigurationFilename returns the physical location of the global configuration(yaml or toml) file.
- // This is useful when we run multiple iris servers that share the same
- // configuration, even with custom values at its "Other" field.
- // It will return a file location
- // which targets to $HOME or %HOMEDRIVE%+%HOMEPATH% + "iris" + the given "ext".
- func homeConfigurationFilename(ext string) string {
- return filepath.Join(homeDir(), "iris"+ext)
- }
- func homeDir() (home string) {
- u, err := user.Current()
- if u != nil && err == nil {
- home = u.HomeDir
- }
- if home == "" {
- home = os.Getenv("HOME")
- }
- if home == "" {
- if runtime.GOOS == "plan9" {
- home = os.Getenv("home")
- } else if runtime.GOOS == "windows" {
- home = os.Getenv("HOMEDRIVE") + os.Getenv("HOMEPATH")
- if home == "" {
- home = os.Getenv("USERPROFILE")
- }
- }
- }
- return
- }
- var errConfigurationDecode = errors.New("error while trying to decode configuration")
- func parseYAML(filename string) (Configuration, error) {
- c := DefaultConfiguration()
- // get the abs
- // which will try to find the 'filename' from current workind dir too.
- yamlAbsPath, err := filepath.Abs(filename)
- if err != nil {
- return c, errConfigurationDecode.AppendErr(err)
- }
- // read the raw contents of the file
- data, err := ioutil.ReadFile(yamlAbsPath)
- if err != nil {
- return c, errConfigurationDecode.AppendErr(err)
- }
- // put the file's contents as yaml to the default configuration(c)
- if err := yaml.Unmarshal(data, &c); err != nil {
- return c, errConfigurationDecode.AppendErr(err)
- }
- return c, nil
- }
- // YAML reads Configuration from a configuration.yml file.
- //
- // Accepts the absolute path of the cfg.yml.
- // An error will be shown to the user via panic with the error message.
- // Error may occur when the cfg.yml doesn't exists or is not formatted correctly.
- //
- // Note: if the char '~' passed as "filename" then it tries to load and return
- // the configuration from the $home_directory + iris.yml,
- // see `WithGlobalConfiguration` for more information.
- //
- // Usage:
- // app.Configure(iris.WithConfiguration(iris.YAML("myconfig.yml"))) or
- // app.Run([iris.Runner], iris.WithConfiguration(iris.YAML("myconfig.yml"))).
- func YAML(filename string) Configuration {
- // check for globe configuration file and use that, otherwise
- // return the default configuration if file doesn't exist.
- if filename == globalConfigurationKeyword {
- filename = homeConfigurationFilename(".yml")
- if _, err := os.Stat(filename); os.IsNotExist(err) {
- panic("default configuration file '" + filename + "' does not exist")
- }
- }
- c, err := parseYAML(filename)
- if err != nil {
- panic(err)
- }
- return c
- }
- // TOML reads Configuration from a toml-compatible document file.
- // Read more about toml's implementation at:
- // https://github.com/toml-lang/toml
- //
- //
- // Accepts the absolute path of the configuration file.
- // An error will be shown to the user via panic with the error message.
- // Error may occur when the file doesn't exists or is not formatted correctly.
- //
- // Note: if the char '~' passed as "filename" then it tries to load and return
- // the configuration from the $home_directory + iris.tml,
- // see `WithGlobalConfiguration` for more information.
- //
- // Usage:
- // app.Configure(iris.WithConfiguration(iris.YAML("myconfig.tml"))) or
- // app.Run([iris.Runner], iris.WithConfiguration(iris.YAML("myconfig.tml"))).
- func TOML(filename string) Configuration {
- c := DefaultConfiguration()
- // check for globe configuration file and use that, otherwise
- // return the default configuration if file doesn't exist.
- if filename == globalConfigurationKeyword {
- filename = homeConfigurationFilename(".tml")
- if _, err := os.Stat(filename); os.IsNotExist(err) {
- panic("default configuration file '" + filename + "' does not exist")
- }
- }
- // get the abs
- // which will try to find the 'filename' from current workind dir too.
- tomlAbsPath, err := filepath.Abs(filename)
- if err != nil {
- panic(errConfigurationDecode.AppendErr(err))
- }
- // read the raw contents of the file
- data, err := ioutil.ReadFile(tomlAbsPath)
- if err != nil {
- panic(errConfigurationDecode.AppendErr(err))
- }
- // put the file's contents as toml to the default configuration(c)
- if _, err := toml.Decode(string(data), &c); err != nil {
- panic(errConfigurationDecode.AppendErr(err))
- }
- // Author's notes:
- // The toml's 'usual thing' for key naming is: the_config_key instead of TheConfigKey
- // but I am always prefer to use the specific programming language's syntax
- // and the original configuration name fields for external configuration files
- // so we do 'toml: "TheConfigKeySameAsTheConfigField" instead.
- return c
- }
- // Configurator is just an interface which accepts the framework instance.
- //
- // It can be used to register a custom configuration with `Configure` in order
- // to modify the framework instance.
- //
- // Currently Configurator is being used to describe the configuration's fields values.
- type Configurator func(*Application)
- // WithGlobalConfiguration will load the global yaml configuration file
- // from the home directory and it will set/override the whole app's configuration
- // to that file's contents. The global configuration file can be modified by user
- // and be used by multiple iris instances.
- //
- // This is useful when we run multiple iris servers that share the same
- // configuration, even with custom values at its "Other" field.
- //
- // Usage: `app.Configure(iris.WithGlobalConfiguration)` or `app.Run([iris.Runner], iris.WithGlobalConfiguration)`.
- var WithGlobalConfiguration = func(app *Application) {
- app.Configure(WithConfiguration(YAML(globalConfigurationKeyword)))
- }
- // variables for configurators don't need any receivers, functions
- // for them that need (helps code editors to recognise as variables without parenthesis completion).
- // WithoutServerError will cause to ignore the matched "errors"
- // from the main application's `Run` function.
- //
- // Usage:
- // err := app.Run(iris.Addr(":8080"), iris.WithoutServerError(iris.ErrServerClosed))
- // will return `nil` if the server's error was `http/iris#ErrServerClosed`.
- //
- // See `Configuration#IgnoreServerErrors []string` too.
- //
- // Example: https://github.com/kataras/iris/tree/master/_examples/http-listening/listen-addr/omit-server-errors
- func WithoutServerError(errors ...error) Configurator {
- return func(app *Application) {
- if len(errors) == 0 {
- return
- }
- errorsAsString := make([]string, len(errors))
- for i, e := range errors {
- errorsAsString[i] = e.Error()
- }
- app.config.IgnoreServerErrors = append(app.config.IgnoreServerErrors, errorsAsString...)
- }
- }
- // WithoutStartupLog turns off the information send, once, to the terminal when the main server is open.
- var WithoutStartupLog = func(app *Application) {
- app.config.DisableStartupLog = true
- }
- // WithoutBanner is a conversion for the `WithoutStartupLog` option.
- //
- // Turns off the information send, once, to the terminal when the main server is open.
- var WithoutBanner = WithoutStartupLog
- // WithoutInterruptHandler disables the automatic graceful server shutdown
- // when control/cmd+C pressed.
- var WithoutInterruptHandler = func(app *Application) {
- app.config.DisableInterruptHandler = true
- }
- // WithoutVersionChecker will disable the version checker and updater.
- // The Iris server will be not
- // receive automatic updates if you pass this
- // to the `Run` function. Use it only while you're ready for Production environment.
- var WithoutVersionChecker = func(app *Application) {
- app.config.DisableVersionChecker = true
- }
- // WithoutPathCorrection disables the PathCorrection setting.
- //
- // See `Configuration`.
- var WithoutPathCorrection = func(app *Application) {
- app.config.DisablePathCorrection = true
- }
- // WithoutBodyConsumptionOnUnmarshal disables BodyConsumptionOnUnmarshal setting.
- //
- // See `Configuration`.
- var WithoutBodyConsumptionOnUnmarshal = func(app *Application) {
- app.config.DisableBodyConsumptionOnUnmarshal = true
- }
- // WithoutAutoFireStatusCode disables the AutoFireStatusCode setting.
- //
- // See `Configuration`.
- var WithoutAutoFireStatusCode = func(app *Application) {
- app.config.DisableAutoFireStatusCode = true
- }
- // WithPathEscape enanbles the PathEscape setting.
- //
- // See `Configuration`.
- var WithPathEscape = func(app *Application) {
- app.config.EnablePathEscape = true
- }
- // WithOptimizations can force the application to optimize for the best performance where is possible.
- //
- // See `Configuration`.
- var WithOptimizations = func(app *Application) {
- app.config.EnableOptimizations = true
- }
- // WithFireMethodNotAllowed enanbles the FireMethodNotAllowed setting.
- //
- // See `Configuration`.
- var WithFireMethodNotAllowed = func(app *Application) {
- app.config.FireMethodNotAllowed = true
- }
- // WithTimeFormat sets the TimeFormat setting.
- //
- // See `Configuration`.
- func WithTimeFormat(timeformat string) Configurator {
- return func(app *Application) {
- app.config.TimeFormat = timeformat
- }
- }
- // WithCharset sets the Charset setting.
- //
- // See `Configuration`.
- func WithCharset(charset string) Configurator {
- return func(app *Application) {
- app.config.Charset = charset
- }
- }
- // WithPostMaxMemory sets the maximum post data size
- // that a client can send to the server, this differs
- // from the overral request body size which can be modified
- // by the `context#SetMaxRequestBodySize` or `iris#LimitRequestBodySize`.
- //
- // Defaults to 32MB or 32 << 20 if you prefer.
- func WithPostMaxMemory(limit int64) Configurator {
- return func(app *Application) {
- app.config.PostMaxMemory = limit
- }
- }
- // WithRemoteAddrHeader enables or adds a new or existing request header name
- // that can be used to validate the client's real IP.
- //
- // By-default no "X-" header is consired safe to be used for retrieving the
- // client's IP address, because those headers can manually change by
- // the client. But sometimes are useful e.g., when behind a proxy
- // you want to enable the "X-Forwarded-For" or when cloudflare
- // you want to enable the "CF-Connecting-IP", inneed you
- // can allow the `ctx.RemoteAddr()` to use any header
- // that the client may sent.
- //
- // Defaults to an empty map but an example usage is:
- // WithRemoteAddrHeader("X-Forwarded-For")
- //
- // Look `context.RemoteAddr()` for more.
- func WithRemoteAddrHeader(headerName string) Configurator {
- return func(app *Application) {
- if app.config.RemoteAddrHeaders == nil {
- app.config.RemoteAddrHeaders = make(map[string]bool)
- }
- app.config.RemoteAddrHeaders[headerName] = true
- }
- }
- // WithoutRemoteAddrHeader disables an existing request header name
- // that can be used to validate and parse the client's real IP.
- //
- //
- // Keep note that RemoteAddrHeaders is already defaults to an empty map
- // so you don't have to call this Configurator if you didn't
- // add allowed headers via configuration or via `WithRemoteAddrHeader` before.
- //
- // Look `context.RemoteAddr()` for more.
- func WithoutRemoteAddrHeader(headerName string) Configurator {
- return func(app *Application) {
- if app.config.RemoteAddrHeaders == nil {
- app.config.RemoteAddrHeaders = make(map[string]bool)
- }
- app.config.RemoteAddrHeaders[headerName] = false
- }
- }
- // WithOtherValue adds a value based on a key to the Other setting.
- //
- // See `Configuration`.
- func WithOtherValue(key string, val interface{}) Configurator {
- return func(app *Application) {
- if app.config.Other == nil {
- app.config.Other = make(map[string]interface{})
- }
- app.config.Other[key] = val
- }
- }
- // Configuration the whole configuration for an iris instance
- // these can be passed via options also, look at the top of this file(configuration.go).
- // Configuration is a valid OptionSetter.
- type Configuration struct {
- // vhost is private and setted only with .Run method, it cannot be changed after the first set.
- // It can be retrieved by the context if needed (i.e router for subdomains)
- vhost string
- // IgnoreServerErrors will cause to ignore the matched "errors"
- // from the main application's `Run` function.
- // This is a slice of string, not a slice of error
- // users can register these errors using yaml or toml configuration file
- // like the rest of the configuration fields.
- //
- // See `WithoutServerError(...)` function too.
- //
- // Example: https://github.com/kataras/iris/tree/master/_examples/http-listening/listen-addr/omit-server-errors
- //
- // Defaults to an empty slice.
- IgnoreServerErrors []string `json:"ignoreServerErrors,omitempty" yaml:"IgnoreServerErrors" toml:"IgnoreServerErrors"`
- // DisableStartupLog if setted to true then it turns off the write banner on server startup.
- //
- // Defaults to false.
- DisableStartupLog bool `json:"disableStartupLog,omitempty" yaml:"DisableStartupLog" toml:"DisableStartupLog"`
- // DisableInterruptHandler if setted to true then it disables the automatic graceful server shutdown
- // when control/cmd+C pressed.
- // Turn this to true if you're planning to handle this by your own via a custom host.Task.
- //
- // Defaults to false.
- DisableInterruptHandler bool `json:"disableInterruptHandler,omitempty" yaml:"DisableInterruptHandler" toml:"DisableInterruptHandler"`
- // DisableVersionChecker if true then process will be not be notified for any available updates.
- //
- // Defaults to false.
- DisableVersionChecker bool `json:"disableVersionChecker,omitempty" yaml:"DisableVersionChecker" toml:"DisableVersionChecker"`
- // DisablePathCorrection corrects and redirects the requested path to the registered path
- // for example, if /home/ path is requested but no handler for this Route found,
- // then the Router checks if /home handler exists, if yes,
- // (permant)redirects the client to the correct path /home
- //
- // Defaults to false.
- DisablePathCorrection bool `json:"disablePathCorrection,omitempty" yaml:"DisablePathCorrection" toml:"DisablePathCorrection"`
- // EnablePathEscape when is true then its escapes the path, the named parameters (if any).
- // Change to false it if you want something like this https://github.com/kataras/iris/issues/135 to work
- //
- // When do you need to Disable(false) it:
- // accepts parameters with slash '/'
- // Request: http://localhost:8080/details/Project%2FDelta
- // ctx.Param("project") returns the raw named parameter: Project%2FDelta
- // which you can escape it manually with net/url:
- // projectName, _ := url.QueryUnescape(c.Param("project").
- //
- // Defaults to false.
- EnablePathEscape bool `json:"enablePathEscape,omitempty" yaml:"EnablePathEscape" toml:"EnablePathEscape"`
- // EnableOptimization when this field is true
- // then the application tries to optimize for the best performance where is possible.
- //
- // Defaults to false.
- EnableOptimizations bool `json:"enableOptimizations,omitempty" yaml:"EnableOptimizations" toml:"EnableOptimizations"`
- // FireMethodNotAllowed if it's true router checks for StatusMethodNotAllowed(405) and
- // fires the 405 error instead of 404
- // Defaults to false.
- FireMethodNotAllowed bool `json:"fireMethodNotAllowed,omitempty" yaml:"FireMethodNotAllowed" toml:"FireMethodNotAllowed"`
- // DisableBodyConsumptionOnUnmarshal manages the reading behavior of the context's body readers/binders.
- // If setted to true then it
- // disables the body consumption by the `context.UnmarshalBody/ReadJSON/ReadXML`.
- //
- // By-default io.ReadAll` is used to read the body from the `context.Request.Body which is an `io.ReadCloser`,
- // if this field setted to true then a new buffer will be created to read from and the request body.
- // The body will not be changed and existing data before the
- // context.UnmarshalBody/ReadJSON/ReadXML will be not consumed.
- DisableBodyConsumptionOnUnmarshal bool `json:"disableBodyConsumptionOnUnmarshal,omitempty" yaml:"DisableBodyConsumptionOnUnmarshal" toml:"DisableBodyConsumptionOnUnmarshal"`
- // DisableAutoFireStatusCode if true then it turns off the http error status code handler automatic execution
- // from (`context.StatusCodeNotSuccessful`, defaults to < 200 || >= 400).
- // If that is false then for a direct error firing, then call the "context#FireStatusCode(statusCode)" manually.
- //
- // By-default a custom http error handler will be fired when "context.StatusCode(code)" called,
- // code should be equal with the result of the the `context.StatusCodeNotSuccessful` in order to be received as an "http error handler".
- //
- // Developer may want this option to setted as true in order to manually call the
- // error handlers when needed via "context#FireStatusCode(< 200 || >= 400)".
- // HTTP Custom error handlers are being registered via app.OnErrorCode(code, handler)".
- //
- // Defaults to false.
- DisableAutoFireStatusCode bool `json:"disableAutoFireStatusCode,omitempty" yaml:"DisableAutoFireStatusCode" toml:"DisableAutoFireStatusCode"`
- // TimeFormat time format for any kind of datetime parsing
- // Defaults to "Mon, 02 Jan 2006 15:04:05 GMT".
- TimeFormat string `json:"timeFormat,omitempty" yaml:"TimeFormat" toml:"TimeFormat"`
- // Charset character encoding for various rendering
- // used for templates and the rest of the responses
- // Defaults to "UTF-8".
- Charset string `json:"charset,omitempty" yaml:"Charset" toml:"Charset"`
- // PostMaxMemory sets the maximum post data size
- // that a client can send to the server, this differs
- // from the overral request body size which can be modified
- // by the `context#SetMaxRequestBodySize` or `iris#LimitRequestBodySize`.
- //
- // Defaults to 32MB or 32 << 20 if you prefer.
- PostMaxMemory int64 `json:"postMaxMemory" yaml:"PostMaxMemory" toml:"PostMaxMemory"`
- // +----------------------------------------------------+
- // | Context's keys for values used on various featuers |
- // +----------------------------------------------------+
- // Context values' keys for various features.
- //
- // TranslateLanguageContextKey & TranslateFunctionContextKey are used by i18n handlers/middleware
- // currently we have only one: https://github.com/kataras/iris/tree/master/middleware/i18n.
- //
- // Defaults to "iris.translate" and "iris.language"
- TranslateFunctionContextKey string `json:"translateFunctionContextKey,omitempty" yaml:"TranslateFunctionContextKey" toml:"TranslateFunctionContextKey"`
- // TranslateLanguageContextKey used for i18n.
- //
- // Defaults to "iris.language"
- TranslateLanguageContextKey string `json:"translateLanguageContextKey,omitempty" yaml:"TranslateLanguageContextKey" toml:"TranslateLanguageContextKey"`
- // GetViewLayoutContextKey is the key of the context's user values' key
- // which is being used to set the template
- // layout from a middleware or the main handler.
- // Overrides the parent's or the configuration's.
- //
- // Defaults to "iris.ViewLayout"
- ViewLayoutContextKey string `json:"viewLayoutContextKey,omitempty" yaml:"ViewLayoutContextKey" toml:"ViewLayoutContextKey"`
- // GetViewDataContextKey is the key of the context's user values' key
- // which is being used to set the template
- // binding data from a middleware or the main handler.
- //
- // Defaults to "iris.viewData"
- ViewDataContextKey string `json:"viewDataContextKey,omitempty" yaml:"ViewDataContextKey" toml:"ViewDataContextKey"`
- // RemoteAddrHeaders are the allowed request headers names
- // that can be valid to parse the client's IP based on.
- // By-default no "X-" header is consired safe to be used for retrieving the
- // client's IP address, because those headers can manually change by
- // the client. But sometimes are useful e.g., when behind a proxy
- // you want to enable the "X-Forwarded-For" or when cloudflare
- // you want to enable the "CF-Connecting-IP", inneed you
- // can allow the `ctx.RemoteAddr()` to use any header
- // that the client may sent.
- //
- // Defaults to an empty map but an example usage is:
- // RemoteAddrHeaders {
- // "X-Real-Ip": true,
- // "X-Forwarded-For": true,
- // "CF-Connecting-IP": true,
- // }
- //
- // Look `context.RemoteAddr()` for more.
- RemoteAddrHeaders map[string]bool `json:"remoteAddrHeaders,omitempty" yaml:"RemoteAddrHeaders" toml:"RemoteAddrHeaders"`
- // Other are the custom, dynamic options, can be empty.
- // This field used only by you to set any app's options you want.
- //
- // Defaults to a non-nil empty map.
- Other map[string]interface{} `json:"other,omitempty" yaml:"Other" toml:"Other"`
- }
- var _ context.ConfigurationReadOnly = &Configuration{}
- // GetVHost returns the non-exported vhost config field.
- //
- // If original addr ended with :443 or :80, it will return the host without the port.
- // If original addr was :https or :http, it will return localhost.
- // If original addr was 0.0.0.0, it will return localhost.
- func (c Configuration) GetVHost() string {
- return c.vhost
- }
- // GetDisablePathCorrection returns the Configuration#DisablePathCorrection,
- // DisablePathCorrection corrects and redirects the requested path to the registered path
- // for example, if /home/ path is requested but no handler for this Route found,
- // then the Router checks if /home handler exists, if yes,
- // (permant)redirects the client to the correct path /home.
- func (c Configuration) GetDisablePathCorrection() bool {
- return c.DisablePathCorrection
- }
- // GetEnablePathEscape is the Configuration#EnablePathEscape,
- // returns true when its escapes the path, the named parameters (if any).
- func (c Configuration) GetEnablePathEscape() bool {
- return c.EnablePathEscape
- }
- // GetEnableOptimizations returns whether
- // the application has performance optimizations enabled.
- func (c Configuration) GetEnableOptimizations() bool {
- return c.EnableOptimizations
- }
- // GetFireMethodNotAllowed returns the Configuration#FireMethodNotAllowed.
- func (c Configuration) GetFireMethodNotAllowed() bool {
- return c.FireMethodNotAllowed
- }
- // GetDisableBodyConsumptionOnUnmarshal returns the Configuration#GetDisableBodyConsumptionOnUnmarshal,
- // manages the reading behavior of the context's body readers/binders.
- // If returns true then the body consumption by the `context.UnmarshalBody/ReadJSON/ReadXML`
- // is disabled.
- //
- // By-default io.ReadAll` is used to read the body from the `context.Request.Body which is an `io.ReadCloser`,
- // if this field setted to true then a new buffer will be created to read from and the request body.
- // The body will not be changed and existing data before the
- // context.UnmarshalBody/ReadJSON/ReadXML will be not consumed.
- func (c Configuration) GetDisableBodyConsumptionOnUnmarshal() bool {
- return c.DisableBodyConsumptionOnUnmarshal
- }
- // GetDisableAutoFireStatusCode returns the Configuration#DisableAutoFireStatusCode.
- // Returns true when the http error status code handler automatic execution turned off.
- func (c Configuration) GetDisableAutoFireStatusCode() bool {
- return c.DisableAutoFireStatusCode
- }
- // GetTimeFormat returns the Configuration#TimeFormat,
- // format for any kind of datetime parsing.
- func (c Configuration) GetTimeFormat() string {
- return c.TimeFormat
- }
- // GetCharset returns the Configuration#Charset,
- // the character encoding for various rendering
- // used for templates and the rest of the responses.
- func (c Configuration) GetCharset() string {
- return c.Charset
- }
- // GetPostMaxMemory returns the maximum configured post data size
- // that a client can send to the server, this differs
- // from the overral request body size which can be modified
- // by the `context#SetMaxRequestBodySize` or `iris#LimitRequestBodySize`.
- //
- // Defaults to 32MB or 32 << 20 if you prefer.
- func (c Configuration) GetPostMaxMemory() int64 {
- return c.PostMaxMemory
- }
- // GetTranslateFunctionContextKey returns the configuration's TranslateFunctionContextKey value,
- // used for i18n.
- func (c Configuration) GetTranslateFunctionContextKey() string {
- return c.TranslateFunctionContextKey
- }
- // GetTranslateLanguageContextKey returns the configuration's TranslateLanguageContextKey value,
- // used for i18n.
- func (c Configuration) GetTranslateLanguageContextKey() string {
- return c.TranslateLanguageContextKey
- }
- // GetViewLayoutContextKey returns the key of the context's user values' key
- // which is being used to set the template
- // layout from a middleware or the main handler.
- // Overrides the parent's or the configuration's.
- func (c Configuration) GetViewLayoutContextKey() string {
- return c.ViewLayoutContextKey
- }
- // GetViewDataContextKey returns the key of the context's user values' key
- // which is being used to set the template
- // binding data from a middleware or the main handler.
- func (c Configuration) GetViewDataContextKey() string {
- return c.ViewDataContextKey
- }
- // GetRemoteAddrHeaders returns the allowed request headers names
- // that can be valid to parse the client's IP based on.
- // By-default no "X-" header is consired safe to be used for retrieving the
- // client's IP address, because those headers can manually change by
- // the client. But sometimes are useful e.g., when behind a proxy
- // you want to enable the "X-Forwarded-For" or when cloudflare
- // you want to enable the "CF-Connecting-IP", inneed you
- // can allow the `ctx.RemoteAddr()` to use any header
- // that the client may sent.
- //
- // Defaults to an empty map but an example usage is:
- // RemoteAddrHeaders {
- // "X-Real-Ip": true,
- // "X-Forwarded-For": true,
- // "CF-Connecting-IP": true,
- // }
- //
- // Look `context.RemoteAddr()` for more.
- func (c Configuration) GetRemoteAddrHeaders() map[string]bool {
- return c.RemoteAddrHeaders
- }
- // GetOther returns the Configuration#Other map.
- func (c Configuration) GetOther() map[string]interface{} {
- return c.Other
- }
- // WithConfiguration sets the "c" values to the framework's configurations.
- //
- // Usage:
- // app.Run(iris.Addr(":8080"), iris.WithConfiguration(iris.Configuration{/* fields here */ }))
- // or
- // iris.WithConfiguration(iris.YAML("./cfg/iris.yml"))
- // or
- // iris.WithConfiguration(iris.TOML("./cfg/iris.tml"))
- func WithConfiguration(c Configuration) Configurator {
- return func(app *Application) {
- main := app.config
- if v := c.IgnoreServerErrors; len(v) > 0 {
- main.IgnoreServerErrors = append(main.IgnoreServerErrors, v...)
- }
- if v := c.DisableStartupLog; v {
- main.DisableStartupLog = v
- }
- if v := c.DisableInterruptHandler; v {
- main.DisableInterruptHandler = v
- }
- if v := c.DisableVersionChecker; v {
- main.DisableVersionChecker = v
- }
- if v := c.DisablePathCorrection; v {
- main.DisablePathCorrection = v
- }
- if v := c.EnablePathEscape; v {
- main.EnablePathEscape = v
- }
- if v := c.EnableOptimizations; v {
- main.EnableOptimizations = v
- }
- if v := c.FireMethodNotAllowed; v {
- main.FireMethodNotAllowed = v
- }
- if v := c.DisableBodyConsumptionOnUnmarshal; v {
- main.DisableBodyConsumptionOnUnmarshal = v
- }
- if v := c.DisableAutoFireStatusCode; v {
- main.DisableAutoFireStatusCode = v
- }
- if v := c.TimeFormat; v != "" {
- main.TimeFormat = v
- }
- if v := c.Charset; v != "" {
- main.Charset = v
- }
- if v := c.PostMaxMemory; v > 0 {
- main.PostMaxMemory = v
- }
- if v := c.TranslateFunctionContextKey; v != "" {
- main.TranslateFunctionContextKey = v
- }
- if v := c.TranslateLanguageContextKey; v != "" {
- main.TranslateLanguageContextKey = v
- }
- if v := c.ViewLayoutContextKey; v != "" {
- main.ViewLayoutContextKey = v
- }
- if v := c.ViewDataContextKey; v != "" {
- main.ViewDataContextKey = v
- }
- if v := c.RemoteAddrHeaders; len(v) > 0 {
- if main.RemoteAddrHeaders == nil {
- main.RemoteAddrHeaders = make(map[string]bool, len(v))
- }
- for key, value := range v {
- main.RemoteAddrHeaders[key] = value
- }
- }
- if v := c.Other; len(v) > 0 {
- if main.Other == nil {
- main.Other = make(map[string]interface{}, len(v))
- }
- for key, value := range v {
- main.Other[key] = value
- }
- }
- }
- }
- // DefaultConfiguration returns the default configuration for an iris station, fills the main Configuration
- func DefaultConfiguration() Configuration {
- return Configuration{
- DisableStartupLog: false,
- DisableInterruptHandler: false,
- DisableVersionChecker: false,
- DisablePathCorrection: false,
- EnablePathEscape: false,
- FireMethodNotAllowed: false,
- DisableBodyConsumptionOnUnmarshal: false,
- DisableAutoFireStatusCode: false,
- TimeFormat: "Mon, Jan 02 2006 15:04:05 GMT",
- Charset: "UTF-8",
- // PostMaxMemory is for post body max memory.
- //
- // The request body the size limit
- // can be set by the middleware `LimitRequestBodySize`
- // or `context#SetMaxRequestBodySize`.
- PostMaxMemory: 32 << 20, // 32MB
- TranslateFunctionContextKey: "iris.translate",
- TranslateLanguageContextKey: "iris.language",
- ViewLayoutContextKey: "iris.viewLayout",
- ViewDataContextKey: "iris.viewData",
- RemoteAddrHeaders: make(map[string]bool),
- EnableOptimizations: false,
- Other: make(map[string]interface{}),
- }
- }
|