From 1beaee70eddff3377137978077470a8b724bf7ff Mon Sep 17 00:00:00 2001 From: SystemGlitch Date: Sat, 11 Jan 2020 22:08:12 +0100 Subject: [PATCH 1/4] Fix File.Save() documentation --- docs_src/src/guide/advanced/helpers.md | 2 +- helper/filesystem/file.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs_src/src/guide/advanced/helpers.md b/docs_src/src/guide/advanced/helpers.md index 54eb1973..e353dd19 100644 --- a/docs_src/src/guide/advanced/helpers.md +++ b/docs_src/src/guide/advanced/helpers.md @@ -148,7 +148,7 @@ Writes the given file on the disk. Appends a timestamp to the given file name to avoid duplicate file names. The file is not readable anymore once saved as its FileReader has already been closed. -Returns the actual path to the saved file. +Returns the actual file name. | Parameters | Return | |------------------------|----------| diff --git a/helper/filesystem/file.go b/helper/filesystem/file.go index 0ab4d311..471eb254 100644 --- a/helper/filesystem/file.go +++ b/helper/filesystem/file.go @@ -18,7 +18,7 @@ type File struct { // The file is not readable anymore once saved as its FileReader has already been // closed. // -// Returns the actual path to the saved file. +// Returns the actual file name. func (file *File) Save(path string, name string) string { name = timestampFileName(name) writer, err := os.OpenFile(path+string(os.PathSeparator)+name, os.O_WRONLY|os.O_CREATE, 0660) From 61c7f40301744187e5f78e3c7fe83cedd7cf5605 Mon Sep 17 00:00:00 2001 From: SystemGlitch Date: Sat, 11 Jan 2020 22:19:35 +0100 Subject: [PATCH 2/4] Don't override Content-Type header when sending a file if already set --- docs/404.html | 6 +++--- docs/assets/js/{10.4b24f42f.js => 10.47eb47a3.js} | 2 +- docs/assets/js/23.06395a7d.js | 1 + docs/assets/js/23.384cd264.js | 1 - docs/assets/js/{app.d20b98e4.js => app.82c28168.js} | 4 ++-- docs/guide/advanced/authentication.html | 4 ++-- docs/guide/advanced/cors.html | 4 ++-- docs/guide/advanced/helpers.html | 6 +++--- docs/guide/advanced/index.html | 4 ++-- docs/guide/advanced/localization.html | 4 ++-- docs/guide/advanced/multi-services.html | 4 ++-- docs/guide/advanced/status-handlers.html | 4 ++-- docs/guide/advanced/testing.html | 4 ++-- docs/guide/architecture-concepts.html | 4 ++-- docs/guide/basics/controllers.html | 4 ++-- docs/guide/basics/database.html | 4 ++-- docs/guide/basics/middleware.html | 4 ++-- docs/guide/basics/requests.html | 4 ++-- docs/guide/basics/responses.html | 4 ++-- docs/guide/basics/routing.html | 4 ++-- docs/guide/basics/validation.html | 4 ++-- docs/guide/changelog.html | 6 +++--- docs/guide/configuration.html | 4 ++-- docs/guide/contribution-guide.html | 4 ++-- docs/guide/deployment.html | 4 ++-- docs/guide/index.html | 4 ++-- docs/guide/installation.html | 4 ++-- docs/guide/upgrade-guide.html | 4 ++-- docs/index.html | 4 ++-- docs_src/package-lock.json | 2 +- docs_src/package.json | 2 +- docs_src/src/guide/changelog.md | 4 ++++ response.go | 5 ++++- response_test.go | 8 ++++++++ 34 files changed, 75 insertions(+), 60 deletions(-) rename docs/assets/js/{10.4b24f42f.js => 10.47eb47a3.js} (61%) create mode 100644 docs/assets/js/23.06395a7d.js delete mode 100644 docs/assets/js/23.384cd264.js rename docs/assets/js/{app.d20b98e4.js => app.82c28168.js} (90%) diff --git a/docs/404.html b/docs/404.html index b4f473ab..12ff323a 100644 --- a/docs/404.html +++ b/docs/404.html @@ -21,11 +21,11 @@ - + -

404

Looks like we've got some broken links.
Take me home.
- +

404

How did we get here?
Take me home.
+ diff --git a/docs/assets/js/10.4b24f42f.js b/docs/assets/js/10.47eb47a3.js similarity index 61% rename from docs/assets/js/10.4b24f42f.js rename to docs/assets/js/10.47eb47a3.js index ea554c2b..612bab74 100644 --- a/docs/assets/js/10.4b24f42f.js +++ b/docs/assets/js/10.47eb47a3.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[10],{215:function(t,s,a){"use strict";a.r(s);var e=a(0),n=Object(e.a)({},(function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"helpers"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#helpers"}},[t._v("#")]),t._v(" Helpers")]),t._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#general"}},[t._v("General")])]),a("li",[a("a",{attrs:{href:"#filesystem"}},[t._v("Filesystem")])])])]),a("p"),t._v(" "),a("p",[t._v("The Goyave framework offers a collection of helpers to ease development.")]),t._v(" "),a("h2",{attrs:{id:"general"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#general"}},[t._v("#")]),t._v(" General")]),t._v(" "),a("p",[t._v("The helpers require the "),a("code",[t._v("helper")]),t._v(" package to be imported.")]),t._v(" "),a("div",{staticClass:"language-go extra-class"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"github.com/System-Glitch/goyave/v2/helper"')]),t._v("\n")])])]),a("p",[a("strong",[t._v("List of general helpers")]),t._v(":")]),t._v(" "),a("div",{staticClass:"table"},[a("p",[a("a",{attrs:{href:"#helper-contains"}},[t._v("Contains")]),t._v(" "),a("a",{attrs:{href:"#helper-sliceequal"}},[t._v("SliceEqual")]),t._v(" "),a("a",{attrs:{href:"#helper-tofloat64"}},[t._v("ToFloat64")]),t._v(" "),a("a",{attrs:{href:"#helper-tostring"}},[t._v("ToString")]),t._v(" "),a("a",{attrs:{href:"#helper-parsemultivaluesheader"}},[t._v("ParseMultiValuesHeader")])])]),a("h4",{attrs:{id:"helper-contains"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#helper-contains"}},[t._v("#")]),t._v(" helper.Contains")]),t._v(" "),a("p",[t._v("Check if a generic slice contains the given value.")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Parameters")]),t._v(" "),a("th",[t._v("Return")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[a("code",[t._v("slice interface{}")])]),t._v(" "),a("td",[a("code",[t._v("bool")])])]),t._v(" "),a("tr",[a("td",[a("code",[t._v("value interface{}")])]),t._v(" "),a("td")])])]),t._v(" "),a("p",[a("strong",[t._v("Example:")])]),t._v(" "),a("div",{staticClass:"language-go extra-class"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[t._v("slice "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Avogado"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Goyave"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Pear"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Apple"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\nfmt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("helper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Contains")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("slice"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Goyave"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// true")]),t._v("\n")])])]),a("h4",{attrs:{id:"helper-sliceequal"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#helper-sliceequal"}},[t._v("#")]),t._v(" helper.SliceEqual")]),t._v(" "),a("p",[t._v("Check if two generic slices are the same.")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Parameters")]),t._v(" "),a("th",[t._v("Return")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[a("code",[t._v("first interface{}")])]),t._v(" "),a("td",[a("code",[t._v("bool")])])]),t._v(" "),a("tr",[a("td",[a("code",[t._v("second interface{}")])]),t._v(" "),a("td")])])]),t._v(" "),a("p",[a("strong",[t._v("Example:")])]),t._v(" "),a("div",{staticClass:"language-go extra-class"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[t._v("first "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Avogado"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Goyave"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Pear"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Apple"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\nsecond "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Goyave"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Avogado"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Pear"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Apple"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\nfmt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("helper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("SliceEqual")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("first"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" second"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// false")]),t._v("\n")])])]),a("h4",{attrs:{id:"helper-tofloat64"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#helper-tofloat64"}},[t._v("#")]),t._v(" helper.ToFloat64")]),t._v(" "),a("p",[t._v("Check if two generic slices are the same.")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Parameters")]),t._v(" "),a("th",[t._v("Return")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[a("code",[t._v("value interface{}")])]),t._v(" "),a("td",[a("code",[t._v("float64")])])]),t._v(" "),a("tr",[a("td"),t._v(" "),a("td",[a("code",[t._v("error")])])])])]),t._v(" "),a("p",[a("strong",[t._v("Examples:")])]),t._v(" "),a("div",{staticClass:"language-go extra-class"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[t._v("fmt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("helper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("ToFloat64")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1.42")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 1.42 nil")]),t._v("\nfmt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("helper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("ToFloat64")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 1.0 nil")]),t._v("\nfmt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("helper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("ToFloat64")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"1.42"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 1.42 nil")]),t._v("\nfmt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("helper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("ToFloat64")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"NaN"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 0 nil")]),t._v("\nfmt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("helper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("ToFloat64")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 0 nil")]),t._v("\n")])])]),a("h4",{attrs:{id:"helper-tostring"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#helper-tostring"}},[t._v("#")]),t._v(" helper.ToString")]),t._v(" "),a("p",[t._v("Convert a generic value to string.")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Parameters")]),t._v(" "),a("th",[t._v("Return")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[a("code",[t._v("value interface{}")])]),t._v(" "),a("td",[a("code",[t._v("string")])])])])]),t._v(" "),a("p",[a("strong",[t._v("Examples:")])]),t._v(" "),a("div",{staticClass:"language-go extra-class"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[t._v("fmt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("helper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("ToString")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1.42")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// "1.42"')]),t._v("\nfmt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("helper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("ToString")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("nil")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// "nil"')]),t._v("\nfmt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("helper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("ToString")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"hello"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// "hello"')]),t._v("\nfmt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("helper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("ToString")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// "[]"')]),t._v("\n")])])]),a("h4",{attrs:{id:"helper-parsemultivaluesheader"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#helper-parsemultivaluesheader"}},[t._v("#")]),t._v(" helper.ParseMultiValuesHeader")]),t._v(" "),a("p",[t._v("Parses multi-values HTTP headers, taking the quality values into account. The result is a slice of values sorted according to the order of priority.")]),t._v(" "),a("p",[t._v("See: "),a("a",{attrs:{href:"https://developer.mozilla.org/en-US/docs/Glossary/Quality_values",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://developer.mozilla.org/en-US/docs/Glossary/Quality_values"),a("OutboundLink")],1)]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Parameters")]),t._v(" "),a("th",[t._v("Return")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[a("code",[t._v("header string")])]),t._v(" "),a("td",[a("code",[t._v("[]filesystem.HeaderValue")])])])])]),t._v(" "),a("p",[a("strong",[t._v("HeaderValue struct:")])]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Attribute")]),t._v(" "),a("th",[t._v("Type")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[a("code",[t._v("Value")])]),t._v(" "),a("td",[a("code",[t._v("string")])])]),t._v(" "),a("tr",[a("td",[a("code",[t._v("Priority")])]),t._v(" "),a("td",[a("code",[t._v("float64")])])])])]),t._v(" "),a("p",[a("strong",[t._v("Examples:")])]),t._v(" "),a("div",{staticClass:"language-go extra-class"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[t._v("fmt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("helper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("ParseMultiValuesHeader")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"text/html,text/*;q=0.5,*/*;q=0.7"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// [{text/html 1} {*/* 0.7} {text/* 0.5}]")]),t._v("\n\nfmt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("helper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("ParseMultiValuesHeader")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"text/html;q=0.8,text/*;q=0.8,*/*;q=0.8"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// [{text/html 0.8} {text/* 0.8} {*/* 0.8}]")]),t._v("\n")])])]),a("h2",{attrs:{id:"filesystem"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#filesystem"}},[t._v("#")]),t._v(" Filesystem")]),t._v(" "),a("p",[t._v("The filesystem helpers require the "),a("code",[t._v("filesystem")]),t._v(" package to be imported.")]),t._v(" "),a("div",{staticClass:"language-go extra-class"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"github.com/System-Glitch/goyave/v2/helper/filesystem"')]),t._v("\n")])])]),a("p",[t._v("All files received in a requests are stored in the "),a("code",[t._v("filesystem.File")]),t._v(" structure. This structres gives all the information you need on a file and its content, as well as a helper function to save it easily.")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Attribute")]),t._v(" "),a("th",[t._v("Type")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[a("code",[t._v("Header")])]),t._v(" "),a("td",[a("code",[t._v("*multipart.FileHeader")])])]),t._v(" "),a("tr",[a("td",[a("code",[t._v("MIMEType")])]),t._v(" "),a("td",[a("code",[t._v("string")])])]),t._v(" "),a("tr",[a("td",[a("code",[t._v("Data")])]),t._v(" "),a("td",[a("code",[t._v("multipart.File")])])])])]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),a("p",[t._v("The data in "),a("code",[t._v("file.Header")]),t._v(" come from the client and "),a("strong",[t._v("shouldn't be trusted")]),t._v(". The filename is always optional and must not be used blindly by the application: path information should be stripped, and conversion to the server file system rules should be done. You cannot rely on the size given in the header neither.")])]),t._v(" "),a("p",[a("strong",[t._v("List of filesystem helpers")]),t._v(":")]),t._v(" "),a("div",{staticClass:"table"},[a("p",[a("a",{attrs:{href:"#filesystem-file-save"}},[t._v("File.Save")]),t._v(" "),a("a",{attrs:{href:"#filesystem-getfileextension"}},[t._v("GetFileExtension")]),t._v(" "),a("a",{attrs:{href:"#filesystem-getmimetype"}},[t._v("GetMIMEType")]),t._v(" "),a("a",{attrs:{href:"#filesystem-fileexists"}},[t._v("FileExists")]),t._v(" "),a("a",{attrs:{href:"#filesystem-isdirectory"}},[t._v("IsDirectory")]),t._v(" "),a("a",{attrs:{href:"#filesystem-delete"}},[t._v("Delete")])])]),a("h4",{attrs:{id:"filesystem-file-save"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#filesystem-file-save"}},[t._v("#")]),t._v(" filesystem.File.Save")]),t._v(" "),a("p",[t._v("Writes the given file on the disk.\nAppends a timestamp to the given file name to avoid duplicate file names.\nThe file is not readable anymore once saved as its FileReader has already been closed.")]),t._v(" "),a("p",[t._v("Returns the actual path to the saved file.")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Parameters")]),t._v(" "),a("th",[t._v("Return")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[a("code",[t._v("path string")])]),t._v(" "),a("td",[a("code",[t._v("string")])])]),t._v(" "),a("tr",[a("td",[a("code",[t._v("name string")])]),t._v(" "),a("td")])])]),t._v(" "),a("p",[a("strong",[t._v("Example:")])]),t._v(" "),a("div",{staticClass:"language-go extra-class"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[t._v("image "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" request"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"image"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("filesystem"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("File"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// As file fields can be multi-files uploads, a file field")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// is always a slice.")]),t._v("\n\nname "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" request"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"name"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nproduct "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" model"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Product"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n Name"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" name"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n Price"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" request"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"price"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("float64")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n Image"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" image"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Save")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"storage/img"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" name"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\ndatabase"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetConnection")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("product"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),a("h4",{attrs:{id:"filesystem-getfileextension"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#filesystem-getfileextension"}},[t._v("#")]),t._v(" filesystem.GetFileExtension")]),t._v(" "),a("p",[t._v("Returns the last part of a file name. If the file doesn't have an extension, returns an empty string.")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Parameters")]),t._v(" "),a("th",[t._v("Return")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[a("code",[t._v("file string")])]),t._v(" "),a("td",[a("code",[t._v("string")])])])])]),t._v(" "),a("p",[a("strong",[t._v("Examples:")])]),t._v(" "),a("div",{staticClass:"language-go extra-class"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[t._v("fmt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("filesystem"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetFileExtension")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"README.md"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// "md"')]),t._v("\nfmt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("filesystem"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetFileExtension")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"LICENSE"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// empty string")]),t._v("\nfmt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("filesystem"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetFileExtension")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"archive.tar.gz"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// "gz"')]),t._v("\n")])])]),a("h4",{attrs:{id:"filesystem-getmimetype"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#filesystem-getmimetype"}},[t._v("#")]),t._v(" filesystem.GetMIMEType")]),t._v(" "),a("p",[t._v("Get the MIME type and size of the given file. If the file cannot be opened, panics. You should check if the file exists, using "),a("code",[t._v("filesystem.FileExists()")]),t._v(", before calling this function.")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Parameters")]),t._v(" "),a("th",[t._v("Return")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[a("code",[t._v("file string")])]),t._v(" "),a("td",[a("code",[t._v("string")])])])])]),t._v(" "),a("p",[a("strong",[t._v("Examples:")])]),t._v(" "),a("div",{staticClass:"language-go extra-class"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[t._v("fmt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("filesystem"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetMIMEType")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"logo.png"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// "image/png"')]),t._v("\nfmt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("filesystem"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetFileExtension")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"config.json"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// "application/json; charset=utf-8"')]),t._v("\nfmt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("filesystem"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetFileExtension")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"index.html"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// "text/html; charset=utf-8"')]),t._v("\n")])])]),a("h4",{attrs:{id:"filesystem-fileexists"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#filesystem-fileexists"}},[t._v("#")]),t._v(" filesystem.FileExists")]),t._v(" "),a("p",[t._v("Returns true if the file at the given path exists and is readable. Returns false if the given file is a directory")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Parameters")]),t._v(" "),a("th",[t._v("Return")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[a("code",[t._v("file string")])]),t._v(" "),a("td",[a("code",[t._v("bool")])])])])]),t._v(" "),a("p",[a("strong",[t._v("Example:")])]),t._v(" "),a("div",{staticClass:"language-go extra-class"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[t._v("fmt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("filesystem"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("FileExists")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"README.md"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// true")]),t._v("\n")])])]),a("h4",{attrs:{id:"filesystem-isdirectory"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#filesystem-isdirectory"}},[t._v("#")]),t._v(" filesystem.IsDirectory")]),t._v(" "),a("p",[t._v("Returns true if the file at the given path exists, is a directory and is readable.")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Parameters")]),t._v(" "),a("th",[t._v("Return")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[a("code",[t._v("path string")])]),t._v(" "),a("td",[a("code",[t._v("bool")])])])])]),t._v(" "),a("p",[a("strong",[t._v("Example:")])]),t._v(" "),a("div",{staticClass:"language-go extra-class"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[t._v("fmt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("filesystem"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("IsDirectory")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"README.md"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// false")]),t._v("\nfmt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("filesystem"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("IsDirectory")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"resources"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// true")]),t._v("\n")])])]),a("h4",{attrs:{id:"filesystem-delete"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#filesystem-delete"}},[t._v("#")]),t._v(" filesystem.Delete")]),t._v(" "),a("p",[t._v("Delete the file at the given path. Panics if the file cannot be deleted.")]),t._v(" "),a("p",[t._v("You should check if the file exists, using "),a("code",[t._v("filesystem.FileExists()")]),t._v(", before calling this function.")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Parameters")]),t._v(" "),a("th",[t._v("Return")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[a("code",[t._v("file string")])]),t._v(" "),a("td",[a("code",[t._v("void")])])])])]),t._v(" "),a("p",[a("strong",[t._v("Example:")])]),t._v(" "),a("div",{staticClass:"language-go extra-class"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[t._v("filesystem"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Delete")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"README.md"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])])}),[],!1,null,null,null);s.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[10],{215:function(t,s,a){"use strict";a.r(s);var e=a(0),n=Object(e.a)({},(function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"helpers"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#helpers"}},[t._v("#")]),t._v(" Helpers")]),t._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#general"}},[t._v("General")])]),a("li",[a("a",{attrs:{href:"#filesystem"}},[t._v("Filesystem")])])])]),a("p"),t._v(" "),a("p",[t._v("The Goyave framework offers a collection of helpers to ease development.")]),t._v(" "),a("h2",{attrs:{id:"general"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#general"}},[t._v("#")]),t._v(" General")]),t._v(" "),a("p",[t._v("The helpers require the "),a("code",[t._v("helper")]),t._v(" package to be imported.")]),t._v(" "),a("div",{staticClass:"language-go extra-class"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"github.com/System-Glitch/goyave/v2/helper"')]),t._v("\n")])])]),a("p",[a("strong",[t._v("List of general helpers")]),t._v(":")]),t._v(" "),a("div",{staticClass:"table"},[a("p",[a("a",{attrs:{href:"#helper-contains"}},[t._v("Contains")]),t._v(" "),a("a",{attrs:{href:"#helper-sliceequal"}},[t._v("SliceEqual")]),t._v(" "),a("a",{attrs:{href:"#helper-tofloat64"}},[t._v("ToFloat64")]),t._v(" "),a("a",{attrs:{href:"#helper-tostring"}},[t._v("ToString")]),t._v(" "),a("a",{attrs:{href:"#helper-parsemultivaluesheader"}},[t._v("ParseMultiValuesHeader")])])]),a("h4",{attrs:{id:"helper-contains"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#helper-contains"}},[t._v("#")]),t._v(" helper.Contains")]),t._v(" "),a("p",[t._v("Check if a generic slice contains the given value.")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Parameters")]),t._v(" "),a("th",[t._v("Return")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[a("code",[t._v("slice interface{}")])]),t._v(" "),a("td",[a("code",[t._v("bool")])])]),t._v(" "),a("tr",[a("td",[a("code",[t._v("value interface{}")])]),t._v(" "),a("td")])])]),t._v(" "),a("p",[a("strong",[t._v("Example:")])]),t._v(" "),a("div",{staticClass:"language-go extra-class"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[t._v("slice "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Avogado"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Goyave"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Pear"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Apple"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\nfmt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("helper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Contains")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("slice"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Goyave"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// true")]),t._v("\n")])])]),a("h4",{attrs:{id:"helper-sliceequal"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#helper-sliceequal"}},[t._v("#")]),t._v(" helper.SliceEqual")]),t._v(" "),a("p",[t._v("Check if two generic slices are the same.")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Parameters")]),t._v(" "),a("th",[t._v("Return")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[a("code",[t._v("first interface{}")])]),t._v(" "),a("td",[a("code",[t._v("bool")])])]),t._v(" "),a("tr",[a("td",[a("code",[t._v("second interface{}")])]),t._v(" "),a("td")])])]),t._v(" "),a("p",[a("strong",[t._v("Example:")])]),t._v(" "),a("div",{staticClass:"language-go extra-class"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[t._v("first "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Avogado"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Goyave"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Pear"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Apple"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\nsecond "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Goyave"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Avogado"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Pear"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Apple"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\nfmt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("helper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("SliceEqual")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("first"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" second"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// false")]),t._v("\n")])])]),a("h4",{attrs:{id:"helper-tofloat64"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#helper-tofloat64"}},[t._v("#")]),t._v(" helper.ToFloat64")]),t._v(" "),a("p",[t._v("Check if two generic slices are the same.")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Parameters")]),t._v(" "),a("th",[t._v("Return")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[a("code",[t._v("value interface{}")])]),t._v(" "),a("td",[a("code",[t._v("float64")])])]),t._v(" "),a("tr",[a("td"),t._v(" "),a("td",[a("code",[t._v("error")])])])])]),t._v(" "),a("p",[a("strong",[t._v("Examples:")])]),t._v(" "),a("div",{staticClass:"language-go extra-class"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[t._v("fmt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("helper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("ToFloat64")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1.42")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 1.42 nil")]),t._v("\nfmt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("helper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("ToFloat64")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 1.0 nil")]),t._v("\nfmt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("helper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("ToFloat64")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"1.42"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 1.42 nil")]),t._v("\nfmt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("helper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("ToFloat64")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"NaN"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 0 nil")]),t._v("\nfmt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("helper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("ToFloat64")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 0 nil")]),t._v("\n")])])]),a("h4",{attrs:{id:"helper-tostring"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#helper-tostring"}},[t._v("#")]),t._v(" helper.ToString")]),t._v(" "),a("p",[t._v("Convert a generic value to string.")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Parameters")]),t._v(" "),a("th",[t._v("Return")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[a("code",[t._v("value interface{}")])]),t._v(" "),a("td",[a("code",[t._v("string")])])])])]),t._v(" "),a("p",[a("strong",[t._v("Examples:")])]),t._v(" "),a("div",{staticClass:"language-go extra-class"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[t._v("fmt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("helper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("ToString")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1.42")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// "1.42"')]),t._v("\nfmt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("helper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("ToString")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("nil")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// "nil"')]),t._v("\nfmt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("helper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("ToString")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"hello"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// "hello"')]),t._v("\nfmt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("helper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("ToString")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// "[]"')]),t._v("\n")])])]),a("h4",{attrs:{id:"helper-parsemultivaluesheader"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#helper-parsemultivaluesheader"}},[t._v("#")]),t._v(" helper.ParseMultiValuesHeader")]),t._v(" "),a("p",[t._v("Parses multi-values HTTP headers, taking the quality values into account. The result is a slice of values sorted according to the order of priority.")]),t._v(" "),a("p",[t._v("See: "),a("a",{attrs:{href:"https://developer.mozilla.org/en-US/docs/Glossary/Quality_values",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://developer.mozilla.org/en-US/docs/Glossary/Quality_values"),a("OutboundLink")],1)]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Parameters")]),t._v(" "),a("th",[t._v("Return")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[a("code",[t._v("header string")])]),t._v(" "),a("td",[a("code",[t._v("[]filesystem.HeaderValue")])])])])]),t._v(" "),a("p",[a("strong",[t._v("HeaderValue struct:")])]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Attribute")]),t._v(" "),a("th",[t._v("Type")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[a("code",[t._v("Value")])]),t._v(" "),a("td",[a("code",[t._v("string")])])]),t._v(" "),a("tr",[a("td",[a("code",[t._v("Priority")])]),t._v(" "),a("td",[a("code",[t._v("float64")])])])])]),t._v(" "),a("p",[a("strong",[t._v("Examples:")])]),t._v(" "),a("div",{staticClass:"language-go extra-class"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[t._v("fmt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("helper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("ParseMultiValuesHeader")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"text/html,text/*;q=0.5,*/*;q=0.7"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// [{text/html 1} {*/* 0.7} {text/* 0.5}]")]),t._v("\n\nfmt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("helper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("ParseMultiValuesHeader")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"text/html;q=0.8,text/*;q=0.8,*/*;q=0.8"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// [{text/html 0.8} {text/* 0.8} {*/* 0.8}]")]),t._v("\n")])])]),a("h2",{attrs:{id:"filesystem"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#filesystem"}},[t._v("#")]),t._v(" Filesystem")]),t._v(" "),a("p",[t._v("The filesystem helpers require the "),a("code",[t._v("filesystem")]),t._v(" package to be imported.")]),t._v(" "),a("div",{staticClass:"language-go extra-class"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"github.com/System-Glitch/goyave/v2/helper/filesystem"')]),t._v("\n")])])]),a("p",[t._v("All files received in a requests are stored in the "),a("code",[t._v("filesystem.File")]),t._v(" structure. This structres gives all the information you need on a file and its content, as well as a helper function to save it easily.")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Attribute")]),t._v(" "),a("th",[t._v("Type")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[a("code",[t._v("Header")])]),t._v(" "),a("td",[a("code",[t._v("*multipart.FileHeader")])])]),t._v(" "),a("tr",[a("td",[a("code",[t._v("MIMEType")])]),t._v(" "),a("td",[a("code",[t._v("string")])])]),t._v(" "),a("tr",[a("td",[a("code",[t._v("Data")])]),t._v(" "),a("td",[a("code",[t._v("multipart.File")])])])])]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),a("p",[t._v("The data in "),a("code",[t._v("file.Header")]),t._v(" come from the client and "),a("strong",[t._v("shouldn't be trusted")]),t._v(". The filename is always optional and must not be used blindly by the application: path information should be stripped, and conversion to the server file system rules should be done. You cannot rely on the size given in the header neither.")])]),t._v(" "),a("p",[a("strong",[t._v("List of filesystem helpers")]),t._v(":")]),t._v(" "),a("div",{staticClass:"table"},[a("p",[a("a",{attrs:{href:"#filesystem-file-save"}},[t._v("File.Save")]),t._v(" "),a("a",{attrs:{href:"#filesystem-getfileextension"}},[t._v("GetFileExtension")]),t._v(" "),a("a",{attrs:{href:"#filesystem-getmimetype"}},[t._v("GetMIMEType")]),t._v(" "),a("a",{attrs:{href:"#filesystem-fileexists"}},[t._v("FileExists")]),t._v(" "),a("a",{attrs:{href:"#filesystem-isdirectory"}},[t._v("IsDirectory")]),t._v(" "),a("a",{attrs:{href:"#filesystem-delete"}},[t._v("Delete")])])]),a("h4",{attrs:{id:"filesystem-file-save"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#filesystem-file-save"}},[t._v("#")]),t._v(" filesystem.File.Save")]),t._v(" "),a("p",[t._v("Writes the given file on the disk.\nAppends a timestamp to the given file name to avoid duplicate file names.\nThe file is not readable anymore once saved as its FileReader has already been closed.")]),t._v(" "),a("p",[t._v("Returns the actual file name.")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Parameters")]),t._v(" "),a("th",[t._v("Return")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[a("code",[t._v("path string")])]),t._v(" "),a("td",[a("code",[t._v("string")])])]),t._v(" "),a("tr",[a("td",[a("code",[t._v("name string")])]),t._v(" "),a("td")])])]),t._v(" "),a("p",[a("strong",[t._v("Example:")])]),t._v(" "),a("div",{staticClass:"language-go extra-class"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[t._v("image "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" request"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"image"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("filesystem"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("File"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// As file fields can be multi-files uploads, a file field")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// is always a slice.")]),t._v("\n\nname "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" request"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"name"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nproduct "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" model"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Product"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n Name"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" name"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n Price"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" request"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"price"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("float64")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n Image"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" image"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Save")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"storage/img"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" name"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\ndatabase"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetConnection")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("product"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),a("h4",{attrs:{id:"filesystem-getfileextension"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#filesystem-getfileextension"}},[t._v("#")]),t._v(" filesystem.GetFileExtension")]),t._v(" "),a("p",[t._v("Returns the last part of a file name. If the file doesn't have an extension, returns an empty string.")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Parameters")]),t._v(" "),a("th",[t._v("Return")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[a("code",[t._v("file string")])]),t._v(" "),a("td",[a("code",[t._v("string")])])])])]),t._v(" "),a("p",[a("strong",[t._v("Examples:")])]),t._v(" "),a("div",{staticClass:"language-go extra-class"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[t._v("fmt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("filesystem"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetFileExtension")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"README.md"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// "md"')]),t._v("\nfmt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("filesystem"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetFileExtension")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"LICENSE"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// empty string")]),t._v("\nfmt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("filesystem"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetFileExtension")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"archive.tar.gz"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// "gz"')]),t._v("\n")])])]),a("h4",{attrs:{id:"filesystem-getmimetype"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#filesystem-getmimetype"}},[t._v("#")]),t._v(" filesystem.GetMIMEType")]),t._v(" "),a("p",[t._v("Get the MIME type and size of the given file. If the file cannot be opened, panics. You should check if the file exists, using "),a("code",[t._v("filesystem.FileExists()")]),t._v(", before calling this function.")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Parameters")]),t._v(" "),a("th",[t._v("Return")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[a("code",[t._v("file string")])]),t._v(" "),a("td",[a("code",[t._v("string")])])])])]),t._v(" "),a("p",[a("strong",[t._v("Examples:")])]),t._v(" "),a("div",{staticClass:"language-go extra-class"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[t._v("fmt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("filesystem"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetMIMEType")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"logo.png"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// "image/png"')]),t._v("\nfmt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("filesystem"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetFileExtension")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"config.json"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// "application/json; charset=utf-8"')]),t._v("\nfmt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("filesystem"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetFileExtension")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"index.html"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// "text/html; charset=utf-8"')]),t._v("\n")])])]),a("h4",{attrs:{id:"filesystem-fileexists"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#filesystem-fileexists"}},[t._v("#")]),t._v(" filesystem.FileExists")]),t._v(" "),a("p",[t._v("Returns true if the file at the given path exists and is readable. Returns false if the given file is a directory")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Parameters")]),t._v(" "),a("th",[t._v("Return")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[a("code",[t._v("file string")])]),t._v(" "),a("td",[a("code",[t._v("bool")])])])])]),t._v(" "),a("p",[a("strong",[t._v("Example:")])]),t._v(" "),a("div",{staticClass:"language-go extra-class"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[t._v("fmt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("filesystem"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("FileExists")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"README.md"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// true")]),t._v("\n")])])]),a("h4",{attrs:{id:"filesystem-isdirectory"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#filesystem-isdirectory"}},[t._v("#")]),t._v(" filesystem.IsDirectory")]),t._v(" "),a("p",[t._v("Returns true if the file at the given path exists, is a directory and is readable.")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Parameters")]),t._v(" "),a("th",[t._v("Return")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[a("code",[t._v("path string")])]),t._v(" "),a("td",[a("code",[t._v("bool")])])])])]),t._v(" "),a("p",[a("strong",[t._v("Example:")])]),t._v(" "),a("div",{staticClass:"language-go extra-class"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[t._v("fmt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("filesystem"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("IsDirectory")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"README.md"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// false")]),t._v("\nfmt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("filesystem"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("IsDirectory")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"resources"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// true")]),t._v("\n")])])]),a("h4",{attrs:{id:"filesystem-delete"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#filesystem-delete"}},[t._v("#")]),t._v(" filesystem.Delete")]),t._v(" "),a("p",[t._v("Delete the file at the given path. Panics if the file cannot be deleted.")]),t._v(" "),a("p",[t._v("You should check if the file exists, using "),a("code",[t._v("filesystem.FileExists()")]),t._v(", before calling this function.")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Parameters")]),t._v(" "),a("th",[t._v("Return")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[a("code",[t._v("file string")])]),t._v(" "),a("td",[a("code",[t._v("void")])])])])]),t._v(" "),a("p",[a("strong",[t._v("Example:")])]),t._v(" "),a("div",{staticClass:"language-go extra-class"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[t._v("filesystem"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Delete")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"README.md"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])])}),[],!1,null,null,null);s.default=n.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/23.06395a7d.js b/docs/assets/js/23.06395a7d.js new file mode 100644 index 00000000..3e84c7f6 --- /dev/null +++ b/docs/assets/js/23.06395a7d.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[23],{222:function(e,t,a){"use strict";a.r(t);var v=a(0),i=Object(v.a)({},(function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("h1",{attrs:{id:"changelog"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#changelog"}},[e._v("#")]),e._v(" Changelog")]),e._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#v2-4-2"}},[e._v("v2.4.2")])]),a("li",[a("a",{attrs:{href:"#v2-4-1"}},[e._v("v2.4.1")])]),a("li",[a("a",{attrs:{href:"#v2-4-0"}},[e._v("v2.4.0")])]),a("li",[a("a",{attrs:{href:"#v2-3-0"}},[e._v("v2.3.0")])]),a("li",[a("a",{attrs:{href:"#v2-2-1"}},[e._v("v2.2.1")])]),a("li",[a("a",{attrs:{href:"#v2-2-0"}},[e._v("v2.2.0")])]),a("li",[a("a",{attrs:{href:"#v2-1-0"}},[e._v("v2.1.0")])]),a("li",[a("a",{attrs:{href:"#v2-0-0"}},[e._v("v2.0.0")])])])]),a("p"),e._v(" "),a("h2",{attrs:{id:"v2-4-2"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#v2-4-2"}},[e._v("#")]),e._v(" v2.4.2")]),e._v(" "),a("ul",[a("li",[e._v("Don't override "),a("code",[e._v("Content-Type")]),e._v(" header when sending a file if already set.")])]),e._v(" "),a("h2",{attrs:{id:"v2-4-1"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#v2-4-1"}},[e._v("#")]),e._v(" v2.4.1")]),e._v(" "),a("ul",[a("li",[e._v("Bundle default config and language in executable to avoid needing to deploy "),a("code",[e._v("$GOROOT/pkg/mod/github.com/!system-!glitch/goyave/")]),e._v(" with the application.")])]),e._v(" "),a("h2",{attrs:{id:"v2-4-0"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#v2-4-0"}},[e._v("#")]),e._v(" v2.4.0")]),e._v(" "),a("ul",[a("li",[e._v("Added "),a("router-link",{attrs:{to:"/guide/basics/responses.html#response-render"}},[e._v("template rendring")]),e._v(".")],1),e._v(" "),a("li",[e._v("Fixed PostgreSQL options not working.")]),e._v(" "),a("li",[a("code",[e._v("TestSuite.Middleware()")]),e._v(" now has a more realistic behavior: the finalization step of the request life-cycle is now also executed. This may require your tests to be updated if those check the status code in the response.")]),e._v(" "),a("li",[e._v("Added "),a("router-link",{attrs:{to:"/guide/advanced/status-handlers.html"}},[e._v("status handlers")]),e._v(".")],1)]),e._v(" "),a("h2",{attrs:{id:"v2-3-0"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#v2-3-0"}},[e._v("#")]),e._v(" v2.3.0")]),e._v(" "),a("ul",[a("li",[e._v("Added "),a("router-link",{attrs:{to:"/guide/advanced/cors.html"}},[e._v("CORS options")]),e._v(".")],1)]),e._v(" "),a("h2",{attrs:{id:"v2-2-1"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#v2-2-1"}},[e._v("#")]),e._v(" v2.2.1")]),e._v(" "),a("ul",[a("li",[e._v("Added "),a("code",[e._v("domain")]),e._v(" config entry. This entry is used for url generation, especially for the TLS redirect.")]),e._v(" "),a("li",[e._v("Don't show port in TLS redirect response if ports are standard (80 for HTTP, 443 for HTTPS).")])]),e._v(" "),a("h2",{attrs:{id:"v2-2-0"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#v2-2-0"}},[e._v("#")]),e._v(" v2.2.0")]),e._v(" "),a("ul",[a("li",[e._v("Added "),a("router-link",{attrs:{to:"/guide/advanced/testing.html"}},[e._v("testing API")]),e._v(".")],1),e._v(" "),a("li",[e._v("Fixed links in documentation.")]),e._v(" "),a("li",[e._v("Fixed "),a("code",[e._v("models")]),e._v(" package in template project. (Changed to "),a("code",[e._v("model")]),e._v(")")]),e._v(" "),a("li",[e._v("Added "),a("router-link",{attrs:{to:"/guide/basics/database.html#database-clearregisteredmodels"}},[a("code",[e._v("database.ClearRegisteredModels")])])],1)]),e._v(" "),a("h2",{attrs:{id:"v2-1-0"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#v2-1-0"}},[e._v("#")]),e._v(" v2.1.0")]),e._v(" "),a("ul",[a("li",[a("code",[e._v("filesystem.GetMIMEType")]),e._v(" now detects "),a("code",[e._v("css")]),e._v(", "),a("code",[e._v("js")]),e._v(", "),a("code",[e._v("json")]),e._v(" and "),a("code",[e._v("jsonld")]),e._v(" files based on their extension.")]),e._v(" "),a("li",[e._v("Added maintenance mode.\n"),a("ul",[a("li",[e._v("Can be "),a("router-link",{attrs:{to:"/guide/advanced/multi-services.html#maintenance-mode"}},[e._v("toggled at runtime")]),e._v(".")],1),e._v(" "),a("li",[e._v("The server can be started in maintenance mode using the "),a("code",[e._v("maintenance")]),e._v(" config option. (Defaults to "),a("code",[e._v("false")]),e._v(")")])])]),e._v(" "),a("li",[e._v("Added "),a("router-link",{attrs:{to:"/guide/basics/validation.html#validating-arrays"}},[e._v("advanced array validation")]),e._v(", with support for n-dimensional arrays."),a("Badge",{attrs:{text:"BETA",type:"warn"}})],1),e._v(" "),a("li",[e._v("Malformed request messages can now be localized. ("),a("code",[e._v("malformed-request")]),e._v(" and "),a("code",[e._v("malformed-json")]),e._v(" entries in "),a("code",[e._v("locale.json")]),e._v(")")]),e._v(" "),a("li",[e._v("Modified the validator to allow "),a("router-link",{attrs:{to:"/guide/basics/validation.html#manual-validation"}},[e._v("manual validation")]),e._v(".")],1)]),e._v(" "),a("h2",{attrs:{id:"v2-0-0"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#v2-0-0"}},[e._v("#")]),e._v(" v2.0.0")]),e._v(" "),a("ul",[a("li",[e._v("Documentation and README improvements.")]),e._v(" "),a("li",[e._v("In the configuration:\n"),a("ul",[a("li",[e._v("The default value of "),a("code",[e._v("dbConnection")]),e._v(" has been changed to "),a("code",[e._v("none")]),e._v(".")]),e._v(" "),a("li",[e._v("The default value of "),a("code",[e._v("dbAutoMigrate")]),e._v(" has been changed to "),a("code",[e._v("false")]),e._v(".")])])]),e._v(" "),a("li",[e._v("Added "),a("router-link",{attrs:{to:"/guide/basics/requests.html#accessors"}},[e._v("request data accessors")]),e._v(".")],1),e._v(" "),a("li",[e._v("Some refactoring and package renaming have been done to better respect the Go conventions.\n"),a("ul",[a("li",[e._v("The "),a("code",[e._v("helpers")]),e._v(" package have been renamed to "),a("code",[e._v("helper")])])])]),e._v(" "),a("li",[e._v("The server now shuts down when it encounters an error during startup.")]),e._v(" "),a("li",[e._v("New "),a("router-link",{attrs:{to:"/guide/basics/validation.html#validation-getfieldtype"}},[a("code",[e._v("validation.GetFieldType")])]),e._v(" function.")],1),e._v(" "),a("li",[e._v("Config and Lang are now protected with a "),a("code",[e._v("sync.RWMutex")]),e._v(" to avoid data races in multi-threaded environments.")]),e._v(" "),a("li",[e._v("Greatly improve concurrency.")]),e._v(" "),a("li",[e._v("Config can now be reloaded manually.")]),e._v(" "),a("li",[e._v("Added the "),a("router-link",{attrs:{to:"/guide/basics/middleware.html#trim"}},[a("code",[e._v("Trim")])]),e._v(" middleware.")],1),e._v(" "),a("li",[a("code",[e._v("goyave.Response")]),e._v(" now implements "),a("code",[e._v("http.ResponseWriter")]),e._v(".\n"),a("ul",[a("li",[e._v("All writing functions can now return an error.")])])]),e._v(" "),a("li",[e._v("Added the "),a("router-link",{attrs:{to:"/guide/basics/routing.html#native-handlers"}},[a("code",[e._v("NativeHandler")])]),e._v(" compatibility layer.")],1),e._v(" "),a("li",[e._v("Fixed a bug preventing the static resources handler to find "),a("code",[e._v("index.html")]),e._v(" if a directory with a depth of one was requested without a trailing slash.")]),e._v(" "),a("li",[e._v("Now panics when calling "),a("code",[e._v("Start()")]),e._v(" while the server is already running.")])])])}),[],!1,null,null,null);t.default=i.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/23.384cd264.js b/docs/assets/js/23.384cd264.js deleted file mode 100644 index 8c7a8190..00000000 --- a/docs/assets/js/23.384cd264.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[23],{222:function(e,t,a){"use strict";a.r(t);var i=a(0),v=Object(i.a)({},(function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("h1",{attrs:{id:"changelog"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#changelog"}},[e._v("#")]),e._v(" Changelog")]),e._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#v2-4-1"}},[e._v("v2.4.1")])]),a("li",[a("a",{attrs:{href:"#v2-4-0"}},[e._v("v2.4.0")])]),a("li",[a("a",{attrs:{href:"#v2-3-0"}},[e._v("v2.3.0")])]),a("li",[a("a",{attrs:{href:"#v2-2-1"}},[e._v("v2.2.1")])]),a("li",[a("a",{attrs:{href:"#v2-2-0"}},[e._v("v2.2.0")])]),a("li",[a("a",{attrs:{href:"#v2-1-0"}},[e._v("v2.1.0")])]),a("li",[a("a",{attrs:{href:"#v2-0-0"}},[e._v("v2.0.0")])])])]),a("p"),e._v(" "),a("h2",{attrs:{id:"v2-4-1"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#v2-4-1"}},[e._v("#")]),e._v(" v2.4.1")]),e._v(" "),a("ul",[a("li",[e._v("Bundle default config and language in executable to avoid needing to deploy "),a("code",[e._v("$GOROOT/pkg/mod/github.com/!system-!glitch/goyave/")]),e._v(" with the application.")])]),e._v(" "),a("h2",{attrs:{id:"v2-4-0"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#v2-4-0"}},[e._v("#")]),e._v(" v2.4.0")]),e._v(" "),a("ul",[a("li",[e._v("Added "),a("router-link",{attrs:{to:"/guide/basics/responses.html#response-render"}},[e._v("template rendring")]),e._v(".")],1),e._v(" "),a("li",[e._v("Fixed PostgreSQL options not working.")]),e._v(" "),a("li",[a("code",[e._v("TestSuite.Middleware()")]),e._v(" now has a more realistic behavior: the finalization step of the request life-cycle is now also executed. This may require your tests to be updated if those check the status code in the response.")]),e._v(" "),a("li",[e._v("Added "),a("router-link",{attrs:{to:"/guide/advanced/status-handlers.html"}},[e._v("status handlers")]),e._v(".")],1)]),e._v(" "),a("h2",{attrs:{id:"v2-3-0"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#v2-3-0"}},[e._v("#")]),e._v(" v2.3.0")]),e._v(" "),a("ul",[a("li",[e._v("Added "),a("router-link",{attrs:{to:"/guide/advanced/cors.html"}},[e._v("CORS options")]),e._v(".")],1)]),e._v(" "),a("h2",{attrs:{id:"v2-2-1"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#v2-2-1"}},[e._v("#")]),e._v(" v2.2.1")]),e._v(" "),a("ul",[a("li",[e._v("Added "),a("code",[e._v("domain")]),e._v(" config entry. This entry is used for url generation, especially for the TLS redirect.")]),e._v(" "),a("li",[e._v("Don't show port in TLS redirect response if ports are standard (80 for HTTP, 443 for HTTPS).")])]),e._v(" "),a("h2",{attrs:{id:"v2-2-0"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#v2-2-0"}},[e._v("#")]),e._v(" v2.2.0")]),e._v(" "),a("ul",[a("li",[e._v("Added "),a("router-link",{attrs:{to:"/guide/advanced/testing.html"}},[e._v("testing API")]),e._v(".")],1),e._v(" "),a("li",[e._v("Fixed links in documentation.")]),e._v(" "),a("li",[e._v("Fixed "),a("code",[e._v("models")]),e._v(" package in template project. (Changed to "),a("code",[e._v("model")]),e._v(")")]),e._v(" "),a("li",[e._v("Added "),a("router-link",{attrs:{to:"/guide/basics/database.html#database-clearregisteredmodels"}},[a("code",[e._v("database.ClearRegisteredModels")])])],1)]),e._v(" "),a("h2",{attrs:{id:"v2-1-0"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#v2-1-0"}},[e._v("#")]),e._v(" v2.1.0")]),e._v(" "),a("ul",[a("li",[a("code",[e._v("filesystem.GetMIMEType")]),e._v(" now detects "),a("code",[e._v("css")]),e._v(", "),a("code",[e._v("js")]),e._v(", "),a("code",[e._v("json")]),e._v(" and "),a("code",[e._v("jsonld")]),e._v(" files based on their extension.")]),e._v(" "),a("li",[e._v("Added maintenance mode.\n"),a("ul",[a("li",[e._v("Can be "),a("router-link",{attrs:{to:"/guide/advanced/multi-services.html#maintenance-mode"}},[e._v("toggled at runtime")]),e._v(".")],1),e._v(" "),a("li",[e._v("The server can be started in maintenance mode using the "),a("code",[e._v("maintenance")]),e._v(" config option. (Defaults to "),a("code",[e._v("false")]),e._v(")")])])]),e._v(" "),a("li",[e._v("Added "),a("router-link",{attrs:{to:"/guide/basics/validation.html#validating-arrays"}},[e._v("advanced array validation")]),e._v(", with support for n-dimensional arrays."),a("Badge",{attrs:{text:"BETA",type:"warn"}})],1),e._v(" "),a("li",[e._v("Malformed request messages can now be localized. ("),a("code",[e._v("malformed-request")]),e._v(" and "),a("code",[e._v("malformed-json")]),e._v(" entries in "),a("code",[e._v("locale.json")]),e._v(")")]),e._v(" "),a("li",[e._v("Modified the validator to allow "),a("router-link",{attrs:{to:"/guide/basics/validation.html#manual-validation"}},[e._v("manual validation")]),e._v(".")],1)]),e._v(" "),a("h2",{attrs:{id:"v2-0-0"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#v2-0-0"}},[e._v("#")]),e._v(" v2.0.0")]),e._v(" "),a("ul",[a("li",[e._v("Documentation and README improvements.")]),e._v(" "),a("li",[e._v("In the configuration:\n"),a("ul",[a("li",[e._v("The default value of "),a("code",[e._v("dbConnection")]),e._v(" has been changed to "),a("code",[e._v("none")]),e._v(".")]),e._v(" "),a("li",[e._v("The default value of "),a("code",[e._v("dbAutoMigrate")]),e._v(" has been changed to "),a("code",[e._v("false")]),e._v(".")])])]),e._v(" "),a("li",[e._v("Added "),a("router-link",{attrs:{to:"/guide/basics/requests.html#accessors"}},[e._v("request data accessors")]),e._v(".")],1),e._v(" "),a("li",[e._v("Some refactoring and package renaming have been done to better respect the Go conventions.\n"),a("ul",[a("li",[e._v("The "),a("code",[e._v("helpers")]),e._v(" package have been renamed to "),a("code",[e._v("helper")])])])]),e._v(" "),a("li",[e._v("The server now shuts down when it encounters an error during startup.")]),e._v(" "),a("li",[e._v("New "),a("router-link",{attrs:{to:"/guide/basics/validation.html#validation-getfieldtype"}},[a("code",[e._v("validation.GetFieldType")])]),e._v(" function.")],1),e._v(" "),a("li",[e._v("Config and Lang are now protected with a "),a("code",[e._v("sync.RWMutex")]),e._v(" to avoid data races in multi-threaded environments.")]),e._v(" "),a("li",[e._v("Greatly improve concurrency.")]),e._v(" "),a("li",[e._v("Config can now be reloaded manually.")]),e._v(" "),a("li",[e._v("Added the "),a("router-link",{attrs:{to:"/guide/basics/middleware.html#trim"}},[a("code",[e._v("Trim")])]),e._v(" middleware.")],1),e._v(" "),a("li",[a("code",[e._v("goyave.Response")]),e._v(" now implements "),a("code",[e._v("http.ResponseWriter")]),e._v(".\n"),a("ul",[a("li",[e._v("All writing functions can now return an error.")])])]),e._v(" "),a("li",[e._v("Added the "),a("router-link",{attrs:{to:"/guide/basics/routing.html#native-handlers"}},[a("code",[e._v("NativeHandler")])]),e._v(" compatibility layer.")],1),e._v(" "),a("li",[e._v("Fixed a bug preventing the static resources handler to find "),a("code",[e._v("index.html")]),e._v(" if a directory with a depth of one was requested without a trailing slash.")]),e._v(" "),a("li",[e._v("Now panics when calling "),a("code",[e._v("Start()")]),e._v(" while the server is already running.")])])])}),[],!1,null,null,null);t.default=v.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/app.d20b98e4.js b/docs/assets/js/app.82c28168.js similarity index 90% rename from docs/assets/js/app.d20b98e4.js rename to docs/assets/js/app.82c28168.js index a6f37ac3..73290080 100644 --- a/docs/assets/js/app.d20b98e4.js +++ b/docs/assets/js/app.82c28168.js @@ -1,4 +1,4 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[0],[]]);!function(t){function e(e){for(var r,a,s=e[0],l=e[1],c=e[2],f=0,p=[];f
'};function o(t,e,n){return tn?n:t}function i(t){return 100*(-1+t)}n.configure=function(t){var e,n;for(e in t)void 0!==(n=t[e])&&t.hasOwnProperty(e)&&(r[e]=n);return this},n.status=null,n.set=function(t){var e=n.isStarted();t=o(t,r.minimum,1),n.status=1===t?null:t;var l=n.render(!e),c=l.querySelector(r.barSelector),u=r.speed,f=r.easing;return l.offsetWidth,a((function(e){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),s(c,function(t,e,n){var o;return(o="translate3d"===r.positionUsing?{transform:"translate3d("+i(t)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+i(t)+"%,0)"}:{"margin-left":i(t)+"%"}).transition="all "+e+"ms "+n,o}(t,u,f)),1===t?(s(l,{transition:"none",opacity:1}),l.offsetWidth,setTimeout((function(){s(l,{transition:"all "+u+"ms linear",opacity:0}),setTimeout((function(){n.remove(),e()}),u)}),u)):setTimeout(e,u)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var t=function(){setTimeout((function(){n.status&&(n.trickle(),t())}),r.trickleSpeed)};return r.trickle&&t(),this},n.done=function(t){return t||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(t){var e=n.status;return e?("number"!=typeof t&&(t=(1-e)*o(Math.random()*e,.1,.95)),e=o(e+t,0,.994),n.set(e)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},t=0,e=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===e&&n.start(),t++,e++,r.always((function(){0==--e?(t=0,n.done()):n.set((t-e)/t)})),this):this},n.render=function(t){if(n.isRendered())return document.getElementById("nprogress");c(document.documentElement,"nprogress-busy");var e=document.createElement("div");e.id="nprogress",e.innerHTML=r.template;var o,a=e.querySelector(r.barSelector),l=t?"-100":i(n.status||0),u=document.querySelector(r.parent);return s(a,{transition:"all 0 linear",transform:"translate3d("+l+"%,0,0)"}),r.showSpinner||(o=e.querySelector(r.spinnerSelector))&&p(o),u!=document.body&&c(u,"nprogress-custom-parent"),u.appendChild(e),e},n.remove=function(){u(document.documentElement,"nprogress-busy"),u(document.querySelector(r.parent),"nprogress-custom-parent");var t=document.getElementById("nprogress");t&&p(t)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var t=document.body.style,e="WebkitTransform"in t?"Webkit":"MozTransform"in t?"Moz":"msTransform"in t?"ms":"OTransform"in t?"O":"";return e+"Perspective"in t?"translate3d":e+"Transform"in t?"translate":"margin"};var a=function(){var t=[];function e(){var n=t.shift();n&&n(e)}return function(n){t.push(n),1==t.length&&e()}}(),s=function(){var t=["Webkit","O","Moz","ms"],e={};function n(n){return n=n.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(t,e){return e.toUpperCase()})),e[n]||(e[n]=function(e){var n=document.body.style;if(e in n)return e;for(var r,o=t.length,i=e.charAt(0).toUpperCase()+e.slice(1);o--;)if((r=t[o]+i)in n)return r;return e}(n))}function r(t,e,r){e=n(e),t.style[e]=r}return function(t,e){var n,o,i=arguments;if(2==i.length)for(n in e)void 0!==(o=e[n])&&e.hasOwnProperty(n)&&r(t,n,o);else r(t,i[1],i[2])}}();function l(t,e){return("string"==typeof t?t:f(t)).indexOf(" "+e+" ")>=0}function c(t,e){var n=f(t),r=n+e;l(n,e)||(t.className=r.substring(1))}function u(t,e){var n,r=f(t);l(t,e)&&(n=r.replace(" "+e+" "," "),t.className=n.substring(1,n.length-1))}function f(t){return(" "+(t.className||"")+" ").replace(/\s+/gi," ")}function p(t){t&&t.parentNode&&t.parentNode.removeChild(t)}return n})?r.call(e,n,e,t):r)||(t.exports=o)},function(t,e,n){var r=n(5),o=n(26),i=n(13),a=Object.defineProperty;e.f=n(2)?Object.defineProperty:function(t,e,n){if(r(t),e=i(e,!0),r(n),o)try{return a(t,e,n)}catch(t){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(t[e]=n.value),t}},function(t,e,n){var r=n(36),o=n(15);t.exports=function(t){return r(o(t))}},function(t,e){var n=t.exports={version:"2.6.11"};"number"==typeof __e&&(__e=n)},function(t,e,n){var r=n(3);t.exports=function(t,e){if(!r(t))return t;var n,o;if(e&&"function"==typeof(n=t.toString)&&!r(o=n.call(t)))return o;if("function"==typeof(n=t.valueOf)&&!r(o=n.call(t)))return o;if(!e&&"function"==typeof(n=t.toString)&&!r(o=n.call(t)))return o;throw TypeError("Can't convert object to primitive value")}},function(t,e){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(t,e){t.exports=function(t){if(null==t)throw TypeError("Can't call method on "+t);return t}},function(t,e,n){var r=n(10),o=n(21);t.exports=n(2)?function(t,e,n){return r.f(t,e,o(1,n))}:function(t,e,n){return t[e]=n,t}},function(t,e,n){var r=n(1),o=n(16),i=n(6),a=n(24)("src"),s=n(50),l=(""+s).split("toString");n(12).inspectSource=function(t){return s.call(t)},(t.exports=function(t,e,n,s){var c="function"==typeof n;c&&(i(n,"name")||o(n,"name",e)),t[e]!==n&&(c&&(i(n,a)||o(n,a,t[e]?""+t[e]:l.join(String(e)))),t===r?t[e]=n:s?t[e]?t[e]=n:o(t,e,n):(delete t[e],o(t,e,n)))})(Function.prototype,"toString",(function(){return"function"==typeof this&&this[a]||s.call(this)}))},function(t,e){var n={}.toString;t.exports=function(t){return n.call(t).slice(8,-1)}},function(t,e){var n=Math.ceil,r=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?r:n)(t)}},function(t,e,n){var r=n(47);t.exports=function(t,e,n){if(r(t),void 0===e)return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,r){return t.call(e,n,r)};case 3:return function(n,r,o){return t.call(e,n,r,o)}}return function(){return t.apply(e,arguments)}}},function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},function(t,e,n){var r=n(23)("keys"),o=n(24);t.exports=function(t){return r[t]||(r[t]=o(t))}},function(t,e,n){var r=n(12),o=n(1),i=o["__core-js_shared__"]||(o["__core-js_shared__"]={});(t.exports=function(t,e){return i[t]||(i[t]=void 0!==e?e:{})})("versions",[]).push({version:r.version,mode:n(38)?"pure":"global",copyright:"© 2019 Denis Pushkarev (zloirock.ru)"})},function(t,e){var n=0,r=Math.random();t.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++n+r).toString(36))}},function(t,e,n){var r=n(48),o=n(21),i=n(11),a=n(13),s=n(6),l=n(26),c=Object.getOwnPropertyDescriptor;e.f=n(2)?c:function(t,e){if(t=i(t),e=a(e,!0),l)try{return c(t,e)}catch(t){}if(s(t,e))return o(!r.f.call(t,e),t[e])}},function(t,e,n){t.exports=!n(2)&&!n(4)((function(){return 7!=Object.defineProperty(n(27)("div"),"a",{get:function(){return 7}}).a}))},function(t,e,n){var r=n(3),o=n(1).document,i=r(o)&&r(o.createElement);t.exports=function(t){return i?o.createElement(t):{}}},function(t,e,n){var r=n(6),o=n(11),i=n(33)(!1),a=n(22)("IE_PROTO");t.exports=function(t,e){var n,s=o(t),l=0,c=[];for(n in s)n!=a&&r(s,n)&&c.push(n);for(;e.length>l;)r(s,n=e[l++])&&(~i(c,n)||c.push(n));return c}},function(t,e,n){!function(){"use strict";t.exports={polyfill:function(){var t=window,e=document;if(!("scrollBehavior"in e.documentElement.style&&!0!==t.__forceSmoothScrollPolyfill__)){var n,r=t.HTMLElement||t.Element,o=468,i={scroll:t.scroll||t.scrollTo,scrollBy:t.scrollBy,elementScroll:r.prototype.scroll||l,scrollIntoView:r.prototype.scrollIntoView},a=t.performance&&t.performance.now?t.performance.now.bind(t.performance):Date.now,s=(n=t.navigator.userAgent,new RegExp(["MSIE ","Trident/","Edge/"].join("|")).test(n)?1:0);t.scroll=t.scrollTo=function(){void 0!==arguments[0]&&(!0!==c(arguments[0])?v.call(t,e.body,void 0!==arguments[0].left?~~arguments[0].left:t.scrollX||t.pageXOffset,void 0!==arguments[0].top?~~arguments[0].top:t.scrollY||t.pageYOffset):i.scroll.call(t,void 0!==arguments[0].left?arguments[0].left:"object"!=typeof arguments[0]?arguments[0]:t.scrollX||t.pageXOffset,void 0!==arguments[0].top?arguments[0].top:void 0!==arguments[1]?arguments[1]:t.scrollY||t.pageYOffset))},t.scrollBy=function(){void 0!==arguments[0]&&(c(arguments[0])?i.scrollBy.call(t,void 0!==arguments[0].left?arguments[0].left:"object"!=typeof arguments[0]?arguments[0]:0,void 0!==arguments[0].top?arguments[0].top:void 0!==arguments[1]?arguments[1]:0):v.call(t,e.body,~~arguments[0].left+(t.scrollX||t.pageXOffset),~~arguments[0].top+(t.scrollY||t.pageYOffset)))},r.prototype.scroll=r.prototype.scrollTo=function(){if(void 0!==arguments[0])if(!0!==c(arguments[0])){var t=arguments[0].left,e=arguments[0].top;v.call(this,this,void 0===t?this.scrollLeft:~~t,void 0===e?this.scrollTop:~~e)}else{if("number"==typeof arguments[0]&&void 0===arguments[1])throw new SyntaxError("Value could not be converted");i.elementScroll.call(this,void 0!==arguments[0].left?~~arguments[0].left:"object"!=typeof arguments[0]?~~arguments[0]:this.scrollLeft,void 0!==arguments[0].top?~~arguments[0].top:void 0!==arguments[1]?~~arguments[1]:this.scrollTop)}},r.prototype.scrollBy=function(){void 0!==arguments[0]&&(!0!==c(arguments[0])?this.scroll({left:~~arguments[0].left+this.scrollLeft,top:~~arguments[0].top+this.scrollTop,behavior:arguments[0].behavior}):i.elementScroll.call(this,void 0!==arguments[0].left?~~arguments[0].left+this.scrollLeft:~~arguments[0]+this.scrollLeft,void 0!==arguments[0].top?~~arguments[0].top+this.scrollTop:~~arguments[1]+this.scrollTop))},r.prototype.scrollIntoView=function(){if(!0!==c(arguments[0])){var n=d(this),r=n.getBoundingClientRect(),o=this.getBoundingClientRect();n!==e.body?(v.call(this,n,n.scrollLeft+o.left-r.left,n.scrollTop+o.top-r.top),"fixed"!==t.getComputedStyle(n).position&&t.scrollBy({left:r.left,top:r.top,behavior:"smooth"})):t.scrollBy({left:o.left,top:o.top,behavior:"smooth"})}else i.scrollIntoView.call(this,void 0===arguments[0]||arguments[0])}}function l(t,e){this.scrollLeft=t,this.scrollTop=e}function c(t){if(null===t||"object"!=typeof t||void 0===t.behavior||"auto"===t.behavior||"instant"===t.behavior)return!0;if("object"==typeof t&&"smooth"===t.behavior)return!1;throw new TypeError("behavior member of ScrollOptions "+t.behavior+" is not a valid value for enumeration ScrollBehavior.")}function u(t,e){return"Y"===e?t.clientHeight+s1?1:l,n=.5*(1-Math.cos(Math.PI*s)),r=e.startX+(e.x-e.startX)*n,i=e.startY+(e.y-e.startY)*n,e.method.call(e.scrollable,r,i),r===e.x&&i===e.y||t.requestAnimationFrame(h.bind(t,e))}function v(n,r,o){var s,c,u,f,p=a();n===e.body?(s=t,c=t.scrollX||t.pageXOffset,u=t.scrollY||t.pageYOffset,f=i.scroll):(s=n,c=n.scrollLeft,u=n.scrollTop,f=l),h({scrollable:s,method:f,startTime:p,startX:c,startY:u,x:r,y:o})}}}}()},function(t,e){var n="Expected a function",r=NaN,o="[object Symbol]",i=/^\s+|\s+$/g,a=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,l=/^0o[0-7]+$/i,c=parseInt,u="object"==typeof global&&global&&global.Object===Object&&global,f="object"==typeof self&&self&&self.Object===Object&&self,p=u||f||Function("return this")(),d=Object.prototype.toString,h=Math.max,v=Math.min,m=function(){return p.Date.now()};function g(t){var e=typeof t;return!!t&&("object"==e||"function"==e)}function y(t){if("number"==typeof t)return t;if(function(t){return"symbol"==typeof t||function(t){return!!t&&"object"==typeof t}(t)&&d.call(t)==o}(t))return r;if(g(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=g(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=t.replace(i,"");var n=s.test(t);return n||l.test(t)?c(t.slice(2),n?2:8):a.test(t)?r:+t}t.exports=function(t,e,r){var o,i,a,s,l,c,u=0,f=!1,p=!1,d=!0;if("function"!=typeof t)throw new TypeError(n);function b(e){var n=o,r=i;return o=i=void 0,u=e,s=t.apply(r,n)}function _(t){var n=t-c;return void 0===c||n>=e||n<0||p&&t-u>=a}function w(){var t=m();if(_(t))return x(t);l=setTimeout(w,function(t){var n=e-(t-c);return p?v(n,a-(t-u)):n}(t))}function x(t){return l=void 0,d&&o?b(t):(o=i=void 0,s)}function C(){var t=m(),n=_(t);if(o=arguments,i=this,c=t,n){if(void 0===l)return function(t){return u=t,l=setTimeout(w,e),f?b(t):s}(c);if(p)return l=setTimeout(w,e),b(c)}return void 0===l&&(l=setTimeout(w,e)),s}return e=y(e)||0,g(r)&&(f=!!r.leading,a=(p="maxWait"in r)?h(y(r.maxWait)||0,e):a,d="trailing"in r?!!r.trailing:d),C.cancel=function(){void 0!==l&&clearTimeout(l),u=0,o=c=i=l=void 0},C.flush=function(){return void 0===l?s:x(m())},C}},function(t,e,n){var r=n(1),o=n(12),i=n(16),a=n(17),s=n(20),l=function(t,e,n){var c,u,f,p,d=t&l.F,h=t&l.G,v=t&l.S,m=t&l.P,g=t&l.B,y=h?r:v?r[e]||(r[e]={}):(r[e]||{}).prototype,b=h?o:o[e]||(o[e]={}),_=b.prototype||(b.prototype={});for(c in h&&(n=e),n)f=((u=!d&&y&&void 0!==y[c])?y:n)[c],p=g&&u?s(f,r):m&&"function"==typeof f?s(Function.call,f):f,y&&a(y,c,f,t&l.U),b[c]!=f&&i(b,c,p),m&&_[c]!=f&&(_[c]=f)};r.core=o,l.F=1,l.G=2,l.S=4,l.P=8,l.B=16,l.W=32,l.U=64,l.R=128,t.exports=l},function(t,e,n){var r=n(19),o=Math.min;t.exports=function(t){return t>0?o(r(t),9007199254740991):0}},function(t,e,n){var r=n(11),o=n(32),i=n(49);t.exports=function(t){return function(e,n,a){var s,l=r(e),c=o(l.length),u=i(a,c);if(t&&n!=n){for(;c>u;)if((s=l[u++])!=s)return!0}else for(;c>u;u++)if((t||u in l)&&l[u]===n)return t||u||0;return!t&&-1}}},function(t,e,n){var r=n(28),o=n(14);t.exports=Object.keys||function(t){return r(t,o)}},function(t,e,n){var r=n(3),o=n(46).set;t.exports=function(t,e,n){var i,a=e.constructor;return a!==n&&"function"==typeof a&&(i=a.prototype)!==n.prototype&&r(i)&&o&&o(t,i),t}},function(t,e,n){var r=n(18);t.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==r(t)?t.split(""):Object(t)}},function(t,e,n){var r=n(28),o=n(14).concat("length","prototype");e.f=Object.getOwnPropertyNames||function(t){return r(t,o)}},function(t,e){t.exports=!1},function(t,e,n){var r=n(31),o=n(15),i=n(4),a=n(51),s="["+a+"]",l=RegExp("^"+s+s+"*"),c=RegExp(s+s+"*$"),u=function(t,e,n){var o={},s=i((function(){return!!a[t]()||"​…"!="​…"[t]()})),l=o[t]=s?e(f):a[t];n&&(o[n]=l),r(r.P+r.F*s,"String",o)},f=u.trim=function(t,e){return t=String(o(t)),1&e&&(t=t.replace(l,"")),2&e&&(t=t.replace(c,"")),t};t.exports=u},function(t,e,n){var r=n(5),o=n(52),i=n(14),a=n(22)("IE_PROTO"),s=function(){},l=function(){var t,e=n(27)("iframe"),r=i.length;for(e.style.display="none",n(53).appendChild(e),e.src="javascript:",(t=e.contentWindow.document).open(),t.write(" + diff --git a/docs/guide/advanced/cors.html b/docs/guide/advanced/cors.html index 91739fb9..b50b9a81 100644 --- a/docs/guide/advanced/cors.html +++ b/docs/guide/advanced/cors.html @@ -21,7 +21,7 @@ - + @@ -47,6 +47,6 @@ Status Handlers

- + diff --git a/docs/guide/advanced/helpers.html b/docs/guide/advanced/helpers.html index 752c5c96..f03828ef 100644 --- a/docs/guide/advanced/helpers.html +++ b/docs/guide/advanced/helpers.html @@ -21,7 +21,7 @@ - + @@ -52,7 +52,7 @@

# Filesystem

The filesystem helpers require the filesystem package to be imported.

import "github.com/System-Glitch/goyave/v2/helper/filesystem"
 

All files received in a requests are stored in the filesystem.File structure. This structres gives all the information you need on a file and its content, as well as a helper function to save it easily.

Attribute Type
Header *multipart.FileHeader
MIMEType string
Data multipart.File

WARNING

The data in file.Header come from the client and shouldn't be trusted. The filename is always optional and must not be used blindly by the application: path information should be stripped, and conversion to the server file system rules should be done. You cannot rely on the size given in the header neither.

List of filesystem helpers:

# filesystem.File.Save

Writes the given file on the disk. Appends a timestamp to the given file name to avoid duplicate file names. -The file is not readable anymore once saved as its FileReader has already been closed.

Returns the actual path to the saved file.

Parameters Return
path string string
name string

Example:

image := request.Data["image"].([]filesystem.File)[0]
+The file is not readable anymore once saved as its FileReader has already been closed.

Returns the actual file name.

Parameters Return
path string string
name string

Example:

image := request.Data["image"].([]filesystem.File)[0]
 // As file fields can be multi-files uploads, a file field
 // is always a slice.
 
@@ -78,6 +78,6 @@
        Authentication

- + diff --git a/docs/guide/advanced/index.html b/docs/guide/advanced/index.html index 68f3e3e0..cea1c1e2 100644 --- a/docs/guide/advanced/index.html +++ b/docs/guide/advanced/index.html @@ -21,7 +21,7 @@ - + @@ -30,6 +30,6 @@

# Advanced

- + diff --git a/docs/guide/advanced/localization.html b/docs/guide/advanced/localization.html index 7d412b93..97b76e0e 100644 --- a/docs/guide/advanced/localization.html +++ b/docs/guide/advanced/localization.html @@ -21,7 +21,7 @@ - + @@ -85,6 +85,6 @@ Testing

- + diff --git a/docs/guide/advanced/multi-services.html b/docs/guide/advanced/multi-services.html index aabfba4f..a5e798be 100644 --- a/docs/guide/advanced/multi-services.html +++ b/docs/guide/advanced/multi-services.html @@ -21,7 +21,7 @@ - + @@ -52,6 +52,6 @@ CORS

- + diff --git a/docs/guide/advanced/status-handlers.html b/docs/guide/advanced/status-handlers.html index 5ed3a1ec..3bc4957a 100644 --- a/docs/guide/advanced/status-handlers.html +++ b/docs/guide/advanced/status-handlers.html @@ -21,7 +21,7 @@ - + @@ -54,6 +54,6 @@
- + diff --git a/docs/guide/advanced/testing.html b/docs/guide/advanced/testing.html index 8b992497..4f4fc17a 100644 --- a/docs/guide/advanced/testing.html +++ b/docs/guide/advanced/testing.html @@ -21,7 +21,7 @@ - + @@ -178,6 +178,6 @@ Multi-services

- + diff --git a/docs/guide/architecture-concepts.html b/docs/guide/architecture-concepts.html index 40faf3e9..7fc76da6 100644 --- a/docs/guide/architecture-concepts.html +++ b/docs/guide/architecture-concepts.html @@ -21,7 +21,7 @@ - + @@ -72,6 +72,6 @@ Deployment

- + diff --git a/docs/guide/basics/controllers.html b/docs/guide/basics/controllers.html index 07943eeb..0b50125e 100644 --- a/docs/guide/basics/controllers.html +++ b/docs/guide/basics/controllers.html @@ -21,7 +21,7 @@ - + @@ -80,6 +80,6 @@ Responses

- + diff --git a/docs/guide/basics/database.html b/docs/guide/basics/database.html index dc2767d2..d2d6a66f 100644 --- a/docs/guide/basics/database.html +++ b/docs/guide/basics/database.html @@ -21,7 +21,7 @@ - + @@ -62,6 +62,6 @@ Validation

- + diff --git a/docs/guide/basics/middleware.html b/docs/guide/basics/middleware.html index e25bd96a..ac70f65f 100644 --- a/docs/guide/basics/middleware.html +++ b/docs/guide/basics/middleware.html @@ -21,7 +21,7 @@ - + @@ -56,6 +56,6 @@ Requests

- + diff --git a/docs/guide/basics/requests.html b/docs/guide/basics/requests.html index 82fad2af..ecd59afa 100644 --- a/docs/guide/basics/requests.html +++ b/docs/guide/basics/requests.html @@ -21,7 +21,7 @@ - + @@ -83,6 +83,6 @@ Controllers

- + diff --git a/docs/guide/basics/responses.html b/docs/guide/basics/responses.html index ebfe1184..57266349 100644 --- a/docs/guide/basics/responses.html +++ b/docs/guide/basics/responses.html @@ -21,7 +21,7 @@ - + @@ -77,6 +77,6 @@ Database

- + diff --git a/docs/guide/basics/routing.html b/docs/guide/basics/routing.html index 8992b386..956b84ed 100644 --- a/docs/guide/basics/routing.html +++ b/docs/guide/basics/routing.html @@ -21,7 +21,7 @@ - + @@ -102,6 +102,6 @@ Middleware

- + diff --git a/docs/guide/basics/validation.html b/docs/guide/basics/validation.html index a59b8ffd..f2bd6b00 100644 --- a/docs/guide/basics/validation.html +++ b/docs/guide/basics/validation.html @@ -21,7 +21,7 @@ - + @@ -128,6 +128,6 @@ Helpers

- + diff --git a/docs/guide/changelog.html b/docs/guide/changelog.html index 47ea4981..b46f87df 100644 --- a/docs/guide/changelog.html +++ b/docs/guide/changelog.html @@ -21,7 +21,7 @@ - + @@ -29,7 +29,7 @@ GitHub

# Changelog

# v2.4.1

  • Bundle default config and language in executable to avoid needing to deploy $GOROOT/pkg/mod/github.com/!system-!glitch/goyave/ with the application.

# v2.4.0

  • Added template rendring.
  • Fixed PostgreSQL options not working.
  • TestSuite.Middleware() now has a more realistic behavior: the finalization step of the request life-cycle is now also executed. This may require your tests to be updated if those check the status code in the response.
  • Added status handlers.

# v2.3.0

# v2.2.1

  • Added domain config entry. This entry is used for url generation, especially for the TLS redirect.
  • Don't show port in TLS redirect response if ports are standard (80 for HTTP, 443 for HTTPS).

# v2.2.0

# v2.1.0

  • filesystem.GetMIMEType now detects css, js, json and jsonld files based on their extension.
  • Added maintenance mode. +

    # Changelog

    # v2.4.2

    • Don't override Content-Type header when sending a file if already set.

    # v2.4.1

    • Bundle default config and language in executable to avoid needing to deploy $GOROOT/pkg/mod/github.com/!system-!glitch/goyave/ with the application.

    # v2.4.0

    • Added template rendring.
    • Fixed PostgreSQL options not working.
    • TestSuite.Middleware() now has a more realistic behavior: the finalization step of the request life-cycle is now also executed. This may require your tests to be updated if those check the status code in the response.
    • Added status handlers.

    # v2.3.0

    # v2.2.1

    • Added domain config entry. This entry is used for url generation, especially for the TLS redirect.
    • Don't show port in TLS redirect response if ports are standard (80 for HTTP, 443 for HTTPS).

    # v2.2.0

    # v2.1.0

    • filesystem.GetMIMEType now detects css, js, json and jsonld files based on their extension.
    • Added maintenance mode.
      • Can be toggled at runtime.
      • The server can be started in maintenance mode using the maintenance config option. (Defaults to false)
    • Added advanced array validation, with support for n-dimensional arrays.BETA
    • Malformed request messages can now be localized. (malformed-request and malformed-json entries in locale.json)
    • Modified the validator to allow manual validation.

    # v2.0.0

    • Documentation and README improvements.
    • In the configuration:
      • The default value of dbConnection has been changed to none.
      • The default value of dbAutoMigrate has been changed to false.
    • Added request data accessors.
    • Some refactoring and package renaming have been done to better respect the Go conventions.
      • The helpers package have been renamed to helper
    • The server now shuts down when it encounters an error during startup.
    • New validation.GetFieldType function.
    • Config and Lang are now protected with a sync.RWMutex to avoid data races in multi-threaded environments.
    • Greatly improve concurrency.
    • Config can now be reloaded manually.
    • Added the Trim middleware.
    • goyave.Response now implements http.ResponseWriter. @@ -38,6 +38,6 @@ Installation

- + diff --git a/docs/guide/configuration.html b/docs/guide/configuration.html index 4d424854..c1e1a258 100644 --- a/docs/guide/configuration.html +++ b/docs/guide/configuration.html @@ -21,7 +21,7 @@ - + @@ -49,6 +49,6 @@ Architecture Concepts

- + diff --git a/docs/guide/contribution-guide.html b/docs/guide/contribution-guide.html index 9aecdfec..417dbc22 100644 --- a/docs/guide/contribution-guide.html +++ b/docs/guide/contribution-guide.html @@ -21,7 +21,7 @@ - + @@ -35,6 +35,6 @@ Routing

- + diff --git a/docs/guide/deployment.html b/docs/guide/deployment.html index 977eb138..292b8f3c 100644 --- a/docs/guide/deployment.html +++ b/docs/guide/deployment.html @@ -21,7 +21,7 @@ - + @@ -112,6 +112,6 @@ Contributing to Goyave

- + diff --git a/docs/guide/index.html b/docs/guide/index.html index 163fa73c..c15f2bca 100644 --- a/docs/guide/index.html +++ b/docs/guide/index.html @@ -21,7 +21,7 @@ - + @@ -32,6 +32,6 @@

# Introduction

Welcome to the Goyave documentation!

This documentation is both a guide and a reference for Goyave application building. You will find instructions covering the basics as well as more advanced topics, from project setup to deployment. But first, let's talk about the framework itself.

Goyave is a framework aiming at cleanliness, fast development and power. Goyave applications stay clean and concise thanks to minimalist function calls and route handlers. The framework gives you all the tools to create an easily readable and maintainable web application, which let you concentrate on the business logic. Although Goyave handles many things for you, such as headers or marshaling, this characteristic doesn't compromise on your freedom of code.

Most golang frameworks for web development don't have a strong directory structure nor conventions to make applications have a uniform architecture and limit redundancy. This makes it difficult to work with them on different projects. In companies, having a well-defined and documented architecture helps new developers integrate projects faster, and reduces the time needed for maintaining them. For open source projects, it helps newcomers understanding the project and makes it easier to contribute.

Note

Please feel free to sudgest changes, ask for more details, report grammar errors, or notice of uncovered scenarios by creating an issue with the proposal template.

# Roadmap

Roadmap

# Next release

  • Direct support for authentication

# Ideas for future releases

  • CLI utility to help creating controllers, middlewares, etc
  • Email helpers
  • Queues/Scheduler system
  • Logging
  • Custom router implementation
  • Named routes
  • Placeholders in language lines and pluralization
  • Support for gzip compression
  • Direct support for the HEAD method
  • And more!

# Contributors

A big "Thank you" to the Goyave contributors:

- + diff --git a/docs/guide/installation.html b/docs/guide/installation.html index a8f3c48a..785b0eb9 100644 --- a/docs/guide/installation.html +++ b/docs/guide/installation.html @@ -21,7 +21,7 @@ - + @@ -73,6 +73,6 @@ Upgrade Guide

- + diff --git a/docs/guide/upgrade-guide.html b/docs/guide/upgrade-guide.html index a471d840..da3c18a1 100644 --- a/docs/guide/upgrade-guide.html +++ b/docs/guide/upgrade-guide.html @@ -21,7 +21,7 @@ - + @@ -36,6 +36,6 @@ Configuration

- + diff --git a/docs/index.html b/docs/index.html index 8e893e7d..750857b6 100644 --- a/docs/index.html +++ b/docs/index.html @@ -21,7 +21,7 @@ - + @@ -36,6 +36,6 @@

Clean

Clean Code

Goyave has an expressive, elegant syntax, a robust structure and conventions. Minimalist calls and reduced redundancy are among the Goyave's core principles.

Fast

Fast Development

Develop faster and concentrate on the business logic of your application thanks to the many helpers and built-in functions.

Powerful

Powerful functionalities

Goyave is accessible, yet powerful. The framework includes routing, request parsing, validation, localization, testing, and more!

- + diff --git a/docs_src/package-lock.json b/docs_src/package-lock.json index 0c9c152c..b3753206 100644 --- a/docs_src/package-lock.json +++ b/docs_src/package-lock.json @@ -1,6 +1,6 @@ { "name": "goyave_docs", - "version": "2.4.1", + "version": "2.4.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/docs_src/package.json b/docs_src/package.json index af4b7a6d..ba19ce32 100644 --- a/docs_src/package.json +++ b/docs_src/package.json @@ -1,6 +1,6 @@ { "name": "goyave_docs", - "version": "2.4.1", + "version": "2.4.2", "description": "An All-in-one elegant web framework written in Go", "main": "index.js", "scripts": { diff --git a/docs_src/src/guide/changelog.md b/docs_src/src/guide/changelog.md index 8192507e..513b9511 100644 --- a/docs_src/src/guide/changelog.md +++ b/docs_src/src/guide/changelog.md @@ -2,6 +2,10 @@ [[toc]] +## v2.4.2 + +- Don't override `Content-Type` header when sending a file if already set. + ## v2.4.1 - Bundle default config and language in executable to avoid needing to deploy `$GOROOT/pkg/mod/github.com/!system-!glitch/goyave/` with the application. diff --git a/response.go b/response.go index e9c28ea5..47e925f0 100644 --- a/response.go +++ b/response.go @@ -103,7 +103,10 @@ func (r *Response) writeFile(file string, disposition string) (int64, error) { r.status = http.StatusOK mime, size := filesystem.GetMIMEType(file) r.ResponseWriter.Header().Set("Content-Disposition", disposition) - r.ResponseWriter.Header().Set("Content-Type", mime) + + if r.ResponseWriter.Header().Get("Content-Type") == "" { + r.ResponseWriter.Header().Set("Content-Type", mime) + } r.ResponseWriter.Header().Set("Content-Length", strconv.FormatInt(size, 10)) f, _ := os.Open(file) diff --git a/response_test.go b/response_test.go index ed8cd458..6ec3df96 100644 --- a/response_test.go +++ b/response_test.go @@ -131,6 +131,14 @@ func (suite *ResponseTestSuite) TestResponseFile() { suite.Equal("29", resp.Header.Get("Content-Length")) suite.False(response.empty) suite.Equal(200, response.status) + + // Test no Content-Type override + rawRequest = httptest.NewRequest("GET", "/test-route", strings.NewReader("body")) + response = createTestResponse(rawRequest) + response.Header().Set("Content-Type", "text/plain") + response.File("config/config.test.json") + resp = response.ResponseWriter.(*httptest.ResponseRecorder).Result() + suite.Equal("text/plain", resp.Header.Get("Content-Type")) } func (suite *ResponseTestSuite) TestResponseFilePanic() { From 5b38b329cb1f2729d39972f815f2527ecb3a13fa Mon Sep 17 00:00:00 2001 From: SystemGlitch Date: Sat, 11 Jan 2020 22:43:42 +0100 Subject: [PATCH 3/4] Fix values placeholder conflict --- docs_src/src/guide/changelog.md | 1 + validation/placeholder.go | 13 +++++++++++-- validation/placeholder_test.go | 3 +++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/docs_src/src/guide/changelog.md b/docs_src/src/guide/changelog.md index 513b9511..38fd8662 100644 --- a/docs_src/src/guide/changelog.md +++ b/docs_src/src/guide/changelog.md @@ -5,6 +5,7 @@ ## v2.4.2 - Don't override `Content-Type` header when sending a file if already set. +- Fixed a bug with validation message placeholder `:values`, which was mistakingly using the `:value` placeholder. ## v2.4.1 diff --git a/validation/placeholder.go b/validation/placeholder.go index 40325524..91bfd194 100644 --- a/validation/placeholder.go +++ b/validation/placeholder.go @@ -1,6 +1,7 @@ package validation import ( + "sort" "strings" "time" @@ -12,6 +13,7 @@ import ( type Placeholder func(string, string, []string, string) string var placeholders map[string]Placeholder = map[string]Placeholder{} +var sortedKeys []string = []string{} // SetPlaceholder sets the replacer function for the given placeholder. // If a placeholder with this name already exists, the latter will be overridden. @@ -19,12 +21,19 @@ var placeholders map[string]Placeholder = map[string]Placeholder{} // return parameters[0] // Replace ":min" by the first parameter in the rule definition // }) func SetPlaceholder(placeholderName string, replacer Placeholder) { - placeholders[":"+placeholderName] = replacer + key := ":" + placeholderName + placeholders[key] = replacer + + // Sort keys to process placeholders in order. + // Needed to avoid conflict between "values" and "value" for example. + sortedKeys = append(sortedKeys, key) + sort.Sort(sort.Reverse(sort.StringSlice(sortedKeys))) } func processPlaceholders(field string, rule string, params []string, message string, language string) string { - for placeholder, replacer := range placeholders { + for _, placeholder := range sortedKeys { if strings.Contains(message, placeholder) { + replacer := placeholders[placeholder] message = strings.ReplaceAll(message, placeholder, replacer(field, rule, params, language)) } } diff --git a/validation/placeholder_test.go b/validation/placeholder_test.go index bd376f7d..4cd948ee 100644 --- a/validation/placeholder_test.go +++ b/validation/placeholder_test.go @@ -39,6 +39,9 @@ func (suite *PlaceholderTestSuite) TestPlaceholders() { func (suite *PlaceholderTestSuite) TestProcessPlaceholders() { suite.Equal("The email address is required.", processPlaceholders("email", "required", []string{}, "The :field is required.", "en-US")) + suite.Equal("The image must be a file with one of the following extensions: ppm.", processPlaceholders("image", "extension", []string{"ppm"}, "The :field must be a file with one of the following extensions: :values.", "en-US")) + suite.Equal("The image must be a file with one of the following extensions: ppm, png.", processPlaceholders("image", "extension", []string{"ppm", "png"}, "The :field must be a file with one of the following extensions: :values.", "en-US")) + suite.Equal("The image must have exactly 2 file(s).", processPlaceholders("image", "count", []string{"2"}, "The :field must have exactly :value file(s).", "en-US")) } func TestPlaceholderTestSuite(t *testing.T) { From a20fe244bf15284b12bb11074776898e200de360 Mon Sep 17 00:00:00 2001 From: SystemGlitch Date: Sat, 11 Jan 2020 22:44:23 +0100 Subject: [PATCH 4/4] Build docs --- docs/404.html | 6 +++--- docs/assets/js/{12.4430da55.js => 12.1e95a8f5.js} | 2 +- docs/assets/js/{13.1183b616.js => 13.5f647ffb.js} | 2 +- docs/assets/js/23.06395a7d.js | 1 - docs/assets/js/23.f52dc760.js | 1 + docs/assets/js/{app.82c28168.js => app.c69a104d.js} | 4 ++-- docs/guide/advanced/authentication.html | 4 ++-- docs/guide/advanced/cors.html | 4 ++-- docs/guide/advanced/helpers.html | 4 ++-- docs/guide/advanced/index.html | 4 ++-- docs/guide/advanced/localization.html | 4 ++-- docs/guide/advanced/multi-services.html | 4 ++-- docs/guide/advanced/status-handlers.html | 4 ++-- docs/guide/advanced/testing.html | 4 ++-- docs/guide/architecture-concepts.html | 4 ++-- docs/guide/basics/controllers.html | 4 ++-- docs/guide/basics/database.html | 4 ++-- docs/guide/basics/middleware.html | 4 ++-- docs/guide/basics/requests.html | 4 ++-- docs/guide/basics/responses.html | 4 ++-- docs/guide/basics/routing.html | 4 ++-- docs/guide/basics/validation.html | 4 ++-- docs/guide/changelog.html | 6 +++--- docs/guide/configuration.html | 4 ++-- docs/guide/contribution-guide.html | 4 ++-- docs/guide/deployment.html | 4 ++-- docs/guide/index.html | 4 ++-- docs/guide/installation.html | 4 ++-- docs/guide/upgrade-guide.html | 4 ++-- docs/index.html | 4 ++-- 30 files changed, 57 insertions(+), 57 deletions(-) rename docs/assets/js/{12.4430da55.js => 12.1e95a8f5.js} (99%) rename docs/assets/js/{13.1183b616.js => 13.5f647ffb.js} (99%) delete mode 100644 docs/assets/js/23.06395a7d.js create mode 100644 docs/assets/js/23.f52dc760.js rename docs/assets/js/{app.82c28168.js => app.c69a104d.js} (98%) diff --git a/docs/404.html b/docs/404.html index 12ff323a..6893d577 100644 --- a/docs/404.html +++ b/docs/404.html @@ -21,11 +21,11 @@ - + -

404

How did we get here?
Take me home.
- +

404

Looks like we've got some broken links.
Take me home.
+ diff --git a/docs/assets/js/12.4430da55.js b/docs/assets/js/12.1e95a8f5.js similarity index 99% rename from docs/assets/js/12.4430da55.js rename to docs/assets/js/12.1e95a8f5.js index 2d048859..c0bd961f 100644 --- a/docs/assets/js/12.4430da55.js +++ b/docs/assets/js/12.1e95a8f5.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[12],{216:function(t,e,a){"use strict";a.r(e);var s=a(0),r=Object(s.a)({},(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"multi-services"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#multi-services"}},[t._v("#")]),t._v(" Multi-services")]),t._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#introduction"}},[t._v("Introduction")])]),a("li",[a("a",{attrs:{href:"#startup-hooks"}},[t._v("Startup hooks")])]),a("li",[a("a",{attrs:{href:"#start-the-server"}},[t._v("Start the server")])]),a("li",[a("a",{attrs:{href:"#stop-the-server"}},[t._v("Stop the server")])]),a("li",[a("a",{attrs:{href:"#server-status"}},[t._v("Server status")])]),a("li",[a("a",{attrs:{href:"#maintenance-mode"}},[t._v("Maintenance mode")])])])]),a("p"),t._v(" "),a("h2",{attrs:{id:"introduction"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#introduction"}},[t._v("#")]),t._v(" Introduction")]),t._v(" "),a("p",[t._v("Sometimes you need to run several services in the same executable. For example if you are hosting a websocket server on top of your web API. Goyave can be run in a goroutine and stopped on-demand.")]),t._v(" "),a("p",[t._v("All functions below are features that require the "),a("code",[t._v("goyave")]),t._v(" package to be imported.")]),t._v(" "),a("div",{staticClass:"language-go extra-class"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"github.com/System-Glitch/goyave/v2"')]),t._v("\n")])])]),a("h2",{attrs:{id:"startup-hooks"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#startup-hooks"}},[t._v("#")]),t._v(" Startup hooks")]),t._v(" "),a("p",[t._v("Startup hooks are function executed in a goroutine after the server finished initializing. This is especially useful when you want to start other services or execute specific commands while being sure the server is up and running, ready to respond to incoming requests. Startup hooks must be registered "),a("strong",[t._v("before")]),t._v(" the "),a("code",[t._v("goyave.Start()")]),t._v(" call.")]),t._v(" "),a("h4",{attrs:{id:"goyave-registerstartuphook"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#goyave-registerstartuphook"}},[t._v("#")]),t._v(" goyave.RegisterStartupHook")]),t._v(" "),a("p",[t._v("Register a startup hook to execute some code once the server is ready and running.")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Parameters")]),t._v(" "),a("th",[t._v("Return")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[a("code",[t._v("hook func()")])]),t._v(" "),a("td",[a("code",[t._v("void")])])])])]),t._v(" "),a("p",[a("strong",[t._v("Example:")])]),t._v(" "),a("div",{staticClass:"language-go extra-class"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[t._v("goyave"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("RegsiterStartupHook")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n fmt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Server ready."')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),a("h4",{attrs:{id:"goyave-clearstartuphooks"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#goyave-clearstartuphooks"}},[t._v("#")]),t._v(" goyave.ClearStartupHooks")]),t._v(" "),a("p",[t._v("Clear all registered startup hooks. Useful when you are writing tests or developing a service able to restart your server multiple times.")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Parameters")]),t._v(" "),a("th",[t._v("Return")])])]),t._v(" "),a("tbody",[a("tr",[a("td"),t._v(" "),a("td",[a("code",[t._v("void")])])])])]),t._v(" "),a("p",[a("strong",[t._v("Example:")])]),t._v(" "),a("div",{staticClass:"language-go extra-class"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[t._v("goyave"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("ClearStartupHooks")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),a("h2",{attrs:{id:"start-the-server"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#start-the-server"}},[t._v("#")]),t._v(" Start the server")]),t._v(" "),a("h4",{attrs:{id:"goyave-start"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#goyave-start"}},[t._v("#")]),t._v(" goyave.Start")]),t._v(" "),a("p",[t._v("Starts the server. This functions needs a route registrer function as a parameter. Learn more in the "),a("router-link",{attrs:{to:"/guide/basics/routing.html"}},[t._v("routing")]),t._v(" section."),a("br"),t._v("\nThe configuration is not reloaded if you call "),a("code",[t._v("Start")]),t._v(" multiple times. You can still reload the configuration with "),a("code",[t._v("config.Load()")]),t._v(" if you need it.\nThis operation is "),a("strong",[t._v("blocking")]),t._v(". Triggers a panic if the server is already running.")],1),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Parameters")]),t._v(" "),a("th",[t._v("Return")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[a("code",[t._v("routeRegistrer func(*goyave.Router)")])]),t._v(" "),a("td",[a("code",[t._v("void")])])])])]),t._v(" "),a("p",[a("strong",[t._v("Examples:")])]),t._v(" "),a("div",{staticClass:"language-go extra-class"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[t._v("goyave"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Start")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("routes"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Register"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),a("p",[a("strong",[t._v("Running the server in the background:")])]),t._v(" "),a("p",[t._v("You can start the server in a goroutine. However, if you do this and the main goroutine terminates, the server will not shutdown gracefully and the program will exit right away. Be sure to call "),a("code",[t._v("goyave.Stop()")]),t._v(" to stop the server gracefully before exiting. Learn more in the next section.")]),t._v(" "),a("div",{staticClass:"language-go extra-class"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("go")]),t._v(" goyave"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Start")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("routes"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Register"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//...")]),t._v("\ngoyave"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Stop")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),a("h2",{attrs:{id:"stop-the-server"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#stop-the-server"}},[t._v("#")]),t._v(" Stop the server")]),t._v(" "),a("p",[t._v("When the running process receives a "),a("code",[t._v("SIGINT")]),t._v(" or a "),a("code",[t._v("SIGTERM")]),t._v(" signal, for example when you press "),a("code",[t._v("CTRL+C")]),t._v(" to interrupt the program, the server will shutdown gracefully, so you don't have to handle that yourself.")]),t._v(" "),a("p",[t._v("However, if you start the server in a goroutine, you have the responsability to shutdown properly. If you exit the program manually or if the main goroutine terminates, ensure that "),a("code",[t._v("goyave.Stop()")]),t._v(" is called. If the program exits because of an interruption signal, the server will shutdown gracefully.")]),t._v(" "),a("h4",{attrs:{id:"goyave-stop"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#goyave-stop"}},[t._v("#")]),t._v(" goyave.Stop")]),t._v(" "),a("p",[t._v("Stop the server gracefully without interrupting any active connections. Make sure the program doesn't exit and waits instead for Stop to return.")]),t._v(" "),a("p",[t._v("Stop does not attempt to close nor wait for hijacked connections such as WebSockets. The caller of "),a("code",[t._v("Stop")]),t._v(" should separately notify such long-lived connections of shutdown and wait for them to close, if desired.")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Parameters")]),t._v(" "),a("th",[t._v("Return")])])]),t._v(" "),a("tbody",[a("tr",[a("td"),t._v(" "),a("td",[a("code",[t._v("void")])])])])]),t._v(" "),a("p",[a("strong",[t._v("Examples:")])]),t._v(" "),a("div",{staticClass:"language-go extra-class"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[t._v("goyave"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Stop")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),a("h2",{attrs:{id:"server-status"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#server-status"}},[t._v("#")]),t._v(" Server status")]),t._v(" "),a("p",[t._v("The "),a("code",[t._v("goyave.IsReady()")]),t._v(" function lets you know if the server is running or not.")]),t._v(" "),a("p",[t._v("This function should not be used to wait for the server to be ready. Use a startup hook instead.")]),t._v(" "),a("h4",{attrs:{id:"goyave-isready"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#goyave-isready"}},[t._v("#")]),t._v(" goyave.IsReady")]),t._v(" "),a("p",[t._v("Returns true if the server is ready to receive and serve incoming requests.")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Parameters")]),t._v(" "),a("th",[t._v("Return")])])]),t._v(" "),a("tbody",[a("tr",[a("td"),t._v(" "),a("td",[a("code",[t._v("bool")])])])])]),t._v(" "),a("p",[a("strong",[t._v("Example:")])]),t._v(" "),a("div",{staticClass:"language-go extra-class"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" goyave"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("IsReady")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n fmt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Server is ready"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h2",{attrs:{id:"maintenance-mode"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#maintenance-mode"}},[t._v("#")]),t._v(" Maintenance mode")]),t._v(" "),a("p",[a("Badge",{attrs:{text:"Since v2.1.0"}})],1),t._v(" "),a("p",[t._v("On top of being able to start the server in maintenance mode using the "),a("code",[t._v("maintenance")]),t._v(" configuration entry, you can enable and disable this mode at runtime.")]),t._v(" "),a("div",{staticClass:"table"},[a("p",[a("a",{attrs:{href:"#goyave-enablemaintenance"}},[t._v("EnableMaintenance")]),t._v(" "),a("a",{attrs:{href:"#goyave-disablemaintenance"}},[t._v("DisableMaintenance")]),t._v(" "),a("a",{attrs:{href:"#goyave-ismaintenanceenabled"}},[t._v("IsMaintenanceEnabled")])])]),a("h4",{attrs:{id:"goyave-enablemaintenance"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#goyave-enablemaintenance"}},[t._v("#")]),t._v(" goyave.EnableMaintenance")]),t._v(" "),a("p",[t._v('Replace the main server handler with the "Service Unavailable" handler.')]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Parameters")]),t._v(" "),a("th",[t._v("Return")])])]),t._v(" "),a("tbody",[a("tr",[a("td"),t._v(" "),a("td",[a("code",[t._v("void")])])])])]),t._v(" "),a("p",[a("strong",[t._v("Example:")])]),t._v(" "),a("div",{staticClass:"language-go extra-class"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[t._v("goyave"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("EnableMaintenance")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),a("h4",{attrs:{id:"goyave-disablemaintenance"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#goyave-disablemaintenance"}},[t._v("#")]),t._v(" goyave.DisableMaintenance")]),t._v(" "),a("p",[t._v("Replace the main server handler with the original router.")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Parameters")]),t._v(" "),a("th",[t._v("Return")])])]),t._v(" "),a("tbody",[a("tr",[a("td"),t._v(" "),a("td",[a("code",[t._v("void")])])])])]),t._v(" "),a("p",[a("strong",[t._v("Example:")])]),t._v(" "),a("div",{staticClass:"language-go extra-class"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[t._v("goyave"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("DisableMaintenance")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),a("h4",{attrs:{id:"goyave-ismaintenanceenabled"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#goyave-ismaintenanceenabled"}},[t._v("#")]),t._v(" goyave.IsMaintenanceEnabled")]),t._v(" "),a("p",[t._v("Returns true if the server is currently in maintenance mode.")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Parameters")]),t._v(" "),a("th",[t._v("Return")])])]),t._v(" "),a("tbody",[a("tr",[a("td"),t._v(" "),a("td",[a("code",[t._v("bool")])])])])]),t._v(" "),a("p",[a("strong",[t._v("Example:")])]),t._v(" "),a("div",{staticClass:"language-go extra-class"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[t._v("fmt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("goyave"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("IsMaintenanceEnabled")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// false")]),t._v("\n")])])])])}),[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[12],{217:function(t,e,a){"use strict";a.r(e);var s=a(0),r=Object(s.a)({},(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"multi-services"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#multi-services"}},[t._v("#")]),t._v(" Multi-services")]),t._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#introduction"}},[t._v("Introduction")])]),a("li",[a("a",{attrs:{href:"#startup-hooks"}},[t._v("Startup hooks")])]),a("li",[a("a",{attrs:{href:"#start-the-server"}},[t._v("Start the server")])]),a("li",[a("a",{attrs:{href:"#stop-the-server"}},[t._v("Stop the server")])]),a("li",[a("a",{attrs:{href:"#server-status"}},[t._v("Server status")])]),a("li",[a("a",{attrs:{href:"#maintenance-mode"}},[t._v("Maintenance mode")])])])]),a("p"),t._v(" "),a("h2",{attrs:{id:"introduction"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#introduction"}},[t._v("#")]),t._v(" Introduction")]),t._v(" "),a("p",[t._v("Sometimes you need to run several services in the same executable. For example if you are hosting a websocket server on top of your web API. Goyave can be run in a goroutine and stopped on-demand.")]),t._v(" "),a("p",[t._v("All functions below are features that require the "),a("code",[t._v("goyave")]),t._v(" package to be imported.")]),t._v(" "),a("div",{staticClass:"language-go extra-class"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"github.com/System-Glitch/goyave/v2"')]),t._v("\n")])])]),a("h2",{attrs:{id:"startup-hooks"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#startup-hooks"}},[t._v("#")]),t._v(" Startup hooks")]),t._v(" "),a("p",[t._v("Startup hooks are function executed in a goroutine after the server finished initializing. This is especially useful when you want to start other services or execute specific commands while being sure the server is up and running, ready to respond to incoming requests. Startup hooks must be registered "),a("strong",[t._v("before")]),t._v(" the "),a("code",[t._v("goyave.Start()")]),t._v(" call.")]),t._v(" "),a("h4",{attrs:{id:"goyave-registerstartuphook"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#goyave-registerstartuphook"}},[t._v("#")]),t._v(" goyave.RegisterStartupHook")]),t._v(" "),a("p",[t._v("Register a startup hook to execute some code once the server is ready and running.")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Parameters")]),t._v(" "),a("th",[t._v("Return")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[a("code",[t._v("hook func()")])]),t._v(" "),a("td",[a("code",[t._v("void")])])])])]),t._v(" "),a("p",[a("strong",[t._v("Example:")])]),t._v(" "),a("div",{staticClass:"language-go extra-class"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[t._v("goyave"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("RegsiterStartupHook")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n fmt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Server ready."')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),a("h4",{attrs:{id:"goyave-clearstartuphooks"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#goyave-clearstartuphooks"}},[t._v("#")]),t._v(" goyave.ClearStartupHooks")]),t._v(" "),a("p",[t._v("Clear all registered startup hooks. Useful when you are writing tests or developing a service able to restart your server multiple times.")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Parameters")]),t._v(" "),a("th",[t._v("Return")])])]),t._v(" "),a("tbody",[a("tr",[a("td"),t._v(" "),a("td",[a("code",[t._v("void")])])])])]),t._v(" "),a("p",[a("strong",[t._v("Example:")])]),t._v(" "),a("div",{staticClass:"language-go extra-class"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[t._v("goyave"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("ClearStartupHooks")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),a("h2",{attrs:{id:"start-the-server"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#start-the-server"}},[t._v("#")]),t._v(" Start the server")]),t._v(" "),a("h4",{attrs:{id:"goyave-start"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#goyave-start"}},[t._v("#")]),t._v(" goyave.Start")]),t._v(" "),a("p",[t._v("Starts the server. This functions needs a route registrer function as a parameter. Learn more in the "),a("router-link",{attrs:{to:"/guide/basics/routing.html"}},[t._v("routing")]),t._v(" section."),a("br"),t._v("\nThe configuration is not reloaded if you call "),a("code",[t._v("Start")]),t._v(" multiple times. You can still reload the configuration with "),a("code",[t._v("config.Load()")]),t._v(" if you need it.\nThis operation is "),a("strong",[t._v("blocking")]),t._v(". Triggers a panic if the server is already running.")],1),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Parameters")]),t._v(" "),a("th",[t._v("Return")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[a("code",[t._v("routeRegistrer func(*goyave.Router)")])]),t._v(" "),a("td",[a("code",[t._v("void")])])])])]),t._v(" "),a("p",[a("strong",[t._v("Examples:")])]),t._v(" "),a("div",{staticClass:"language-go extra-class"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[t._v("goyave"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Start")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("routes"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Register"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),a("p",[a("strong",[t._v("Running the server in the background:")])]),t._v(" "),a("p",[t._v("You can start the server in a goroutine. However, if you do this and the main goroutine terminates, the server will not shutdown gracefully and the program will exit right away. Be sure to call "),a("code",[t._v("goyave.Stop()")]),t._v(" to stop the server gracefully before exiting. Learn more in the next section.")]),t._v(" "),a("div",{staticClass:"language-go extra-class"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("go")]),t._v(" goyave"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Start")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("routes"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Register"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//...")]),t._v("\ngoyave"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Stop")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),a("h2",{attrs:{id:"stop-the-server"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#stop-the-server"}},[t._v("#")]),t._v(" Stop the server")]),t._v(" "),a("p",[t._v("When the running process receives a "),a("code",[t._v("SIGINT")]),t._v(" or a "),a("code",[t._v("SIGTERM")]),t._v(" signal, for example when you press "),a("code",[t._v("CTRL+C")]),t._v(" to interrupt the program, the server will shutdown gracefully, so you don't have to handle that yourself.")]),t._v(" "),a("p",[t._v("However, if you start the server in a goroutine, you have the responsability to shutdown properly. If you exit the program manually or if the main goroutine terminates, ensure that "),a("code",[t._v("goyave.Stop()")]),t._v(" is called. If the program exits because of an interruption signal, the server will shutdown gracefully.")]),t._v(" "),a("h4",{attrs:{id:"goyave-stop"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#goyave-stop"}},[t._v("#")]),t._v(" goyave.Stop")]),t._v(" "),a("p",[t._v("Stop the server gracefully without interrupting any active connections. Make sure the program doesn't exit and waits instead for Stop to return.")]),t._v(" "),a("p",[t._v("Stop does not attempt to close nor wait for hijacked connections such as WebSockets. The caller of "),a("code",[t._v("Stop")]),t._v(" should separately notify such long-lived connections of shutdown and wait for them to close, if desired.")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Parameters")]),t._v(" "),a("th",[t._v("Return")])])]),t._v(" "),a("tbody",[a("tr",[a("td"),t._v(" "),a("td",[a("code",[t._v("void")])])])])]),t._v(" "),a("p",[a("strong",[t._v("Examples:")])]),t._v(" "),a("div",{staticClass:"language-go extra-class"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[t._v("goyave"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Stop")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),a("h2",{attrs:{id:"server-status"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#server-status"}},[t._v("#")]),t._v(" Server status")]),t._v(" "),a("p",[t._v("The "),a("code",[t._v("goyave.IsReady()")]),t._v(" function lets you know if the server is running or not.")]),t._v(" "),a("p",[t._v("This function should not be used to wait for the server to be ready. Use a startup hook instead.")]),t._v(" "),a("h4",{attrs:{id:"goyave-isready"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#goyave-isready"}},[t._v("#")]),t._v(" goyave.IsReady")]),t._v(" "),a("p",[t._v("Returns true if the server is ready to receive and serve incoming requests.")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Parameters")]),t._v(" "),a("th",[t._v("Return")])])]),t._v(" "),a("tbody",[a("tr",[a("td"),t._v(" "),a("td",[a("code",[t._v("bool")])])])])]),t._v(" "),a("p",[a("strong",[t._v("Example:")])]),t._v(" "),a("div",{staticClass:"language-go extra-class"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" goyave"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("IsReady")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n fmt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Server is ready"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h2",{attrs:{id:"maintenance-mode"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#maintenance-mode"}},[t._v("#")]),t._v(" Maintenance mode")]),t._v(" "),a("p",[a("Badge",{attrs:{text:"Since v2.1.0"}})],1),t._v(" "),a("p",[t._v("On top of being able to start the server in maintenance mode using the "),a("code",[t._v("maintenance")]),t._v(" configuration entry, you can enable and disable this mode at runtime.")]),t._v(" "),a("div",{staticClass:"table"},[a("p",[a("a",{attrs:{href:"#goyave-enablemaintenance"}},[t._v("EnableMaintenance")]),t._v(" "),a("a",{attrs:{href:"#goyave-disablemaintenance"}},[t._v("DisableMaintenance")]),t._v(" "),a("a",{attrs:{href:"#goyave-ismaintenanceenabled"}},[t._v("IsMaintenanceEnabled")])])]),a("h4",{attrs:{id:"goyave-enablemaintenance"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#goyave-enablemaintenance"}},[t._v("#")]),t._v(" goyave.EnableMaintenance")]),t._v(" "),a("p",[t._v('Replace the main server handler with the "Service Unavailable" handler.')]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Parameters")]),t._v(" "),a("th",[t._v("Return")])])]),t._v(" "),a("tbody",[a("tr",[a("td"),t._v(" "),a("td",[a("code",[t._v("void")])])])])]),t._v(" "),a("p",[a("strong",[t._v("Example:")])]),t._v(" "),a("div",{staticClass:"language-go extra-class"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[t._v("goyave"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("EnableMaintenance")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),a("h4",{attrs:{id:"goyave-disablemaintenance"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#goyave-disablemaintenance"}},[t._v("#")]),t._v(" goyave.DisableMaintenance")]),t._v(" "),a("p",[t._v("Replace the main server handler with the original router.")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Parameters")]),t._v(" "),a("th",[t._v("Return")])])]),t._v(" "),a("tbody",[a("tr",[a("td"),t._v(" "),a("td",[a("code",[t._v("void")])])])])]),t._v(" "),a("p",[a("strong",[t._v("Example:")])]),t._v(" "),a("div",{staticClass:"language-go extra-class"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[t._v("goyave"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("DisableMaintenance")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),a("h4",{attrs:{id:"goyave-ismaintenanceenabled"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#goyave-ismaintenanceenabled"}},[t._v("#")]),t._v(" goyave.IsMaintenanceEnabled")]),t._v(" "),a("p",[t._v("Returns true if the server is currently in maintenance mode.")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Parameters")]),t._v(" "),a("th",[t._v("Return")])])]),t._v(" "),a("tbody",[a("tr",[a("td"),t._v(" "),a("td",[a("code",[t._v("bool")])])])])]),t._v(" "),a("p",[a("strong",[t._v("Example:")])]),t._v(" "),a("div",{staticClass:"language-go extra-class"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[t._v("fmt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("goyave"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("IsMaintenanceEnabled")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// false")]),t._v("\n")])])])])}),[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/13.1183b616.js b/docs/assets/js/13.5f647ffb.js similarity index 99% rename from docs/assets/js/13.1183b616.js rename to docs/assets/js/13.5f647ffb.js index d20337d6..358b7e1e 100644 --- a/docs/assets/js/13.1183b616.js +++ b/docs/assets/js/13.5f647ffb.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[13],{217:function(t,s,e){"use strict";e.r(s);var a=e(0),n=Object(a.a)({},(function(){var t=this,s=t.$createElement,e=t._self._c||s;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"status-handlers"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#status-handlers"}},[t._v("#")]),t._v(" Status Handlers "),e("Badge",{attrs:{text:"Since v2.4.0"}})],1),t._v(" "),e("p"),e("div",{staticClass:"table-of-contents"},[e("ul",[e("li",[e("a",{attrs:{href:"#introduction"}},[t._v("Introduction")])]),e("li",[e("a",{attrs:{href:"#writing-status-handlers"}},[t._v("Writing status handlers")])]),e("li",[e("a",{attrs:{href:"#registering-status-handlers"}},[t._v("Registering status handlers")])])])]),e("p"),t._v(" "),e("h2",{attrs:{id:"introduction"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#introduction"}},[t._v("#")]),t._v(" Introduction")]),t._v(" "),e("p",[t._v("Status handlers are regular handlers executed during the "),e("strong",[t._v("finalization")]),t._v(" step of the "),e("router-link",{attrs:{to:"/guide/architecture-concepts.html#requests"}},[t._v("request's lifecycle")]),t._v(" if the response body is empty but a status code has been set. Status handler are mainly used to implement a custom behavior for user or server errors (400 and 500 status codes).")],1),t._v(" "),e("p",[t._v("Goyave comes with a default error status handler. When a panic occurs or the "),e("router-link",{attrs:{to:"/guide/basics/responses.html#response-error"}},[e("code",[t._v("Response.Error()")])]),t._v(" method is called, the request's status is set to "),e("code",[t._v("500 Internal Server Error")]),t._v(" and the request error is set. The latter can be accessed using "),e("router-link",{attrs:{to:"/guide/basics/responses.html#response-geterror"}},[e("code",[t._v("Response.GetError()")])]),t._v(". The error is printed in the console. If debugging is enabled in the config, the error is also written in the response using the JSON format, and the stacktrace is printed in the console. If debugging is not enabled, the following is returned:")],1),t._v(" "),e("div",{staticClass:"language-json extra-class"},[e("pre",{pre:!0,attrs:{class:"language-json"}},[e("code",[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v('"error"')]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Internal Server Error"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("p",[t._v("The status handler covering the "),e("code",[t._v("404")]),t._v(", "),e("code",[t._v("405")]),t._v(" and "),e("code",[t._v("501")]),t._v(" to "),e("code",[t._v("511")]),t._v(" status codes has a similar behavior but doesn't print anything to the console. For example, if the user requests a route that doesn't exist, the following is returned:")]),t._v(" "),e("div",{staticClass:"language-json extra-class"},[e("pre",{pre:!0,attrs:{class:"language-json"}},[e("code",[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v('"error"')]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Not Found"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("h2",{attrs:{id:"writing-status-handlers"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#writing-status-handlers"}},[t._v("#")]),t._v(" Writing status handlers")]),t._v(" "),e("p",[t._v("As said earlier, status handlers are regular handlers. The only difference is that they are executed at the very end of the request's lifecycle. Ideally, create a new controller for your status handlers.")]),t._v(" "),e("p",[e("code",[t._v("http/controller/status/status.go")]),t._v(":")]),t._v(" "),e("div",{staticClass:"language-go extra-class"},[e("pre",{pre:!0,attrs:{class:"language-go"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("package")]),t._v(" status\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"github.com/System-Glitch/goyave/v2"')]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("NotFound")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("response "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("goyave"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Response"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" request "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("goyave"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Request"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n response"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("RenderHTML")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("response"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetStatus")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"errors/404.html"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("nil")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("h2",{attrs:{id:"registering-status-handlers"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#registering-status-handlers"}},[t._v("#")]),t._v(" Registering status handlers")]),t._v(" "),e("p",[t._v("Status handlers are registered in the "),e("strong",[t._v("router")]),t._v(".")]),t._v(" "),e("h4",{attrs:{id:"router-statushandler"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#router-statushandler"}},[t._v("#")]),t._v(" Router.StatusHandler")]),t._v(" "),e("p",[t._v("Set a handler for responses with an empty body. The handler will be automatically executed if the request's life-cycle reaches its end and nothing has been written in the response body.")]),t._v(" "),e("p",[t._v("Multiple status codes can be given. The handler will be executed if one of them matches.")]),t._v(" "),e("p",[t._v("Status handlers are "),e("strong",[t._v("inherited")]),t._v(" as a copy in sub-routers. Modifying a child's status handler will not modify its parent's. That means that you can define different status handlers for certain route groupes if you so desire.")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("Parameters")]),t._v(" "),e("th",[t._v("Return")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[e("code",[t._v("handler Handler")])]),t._v(" "),e("td",[e("code",[t._v("void")])])]),t._v(" "),e("tr",[e("td",[e("code",[t._v("status int")])]),t._v(" "),e("td")]),t._v(" "),e("tr",[e("td",[e("code",[t._v("additionalStatuses ...int")])]),t._v(" "),e("td")])])]),t._v(" "),e("p",[e("strong",[t._v("Example:")])]),t._v(" "),e("div",{staticClass:"language-go extra-class"},[e("pre",{pre:!0,attrs:{class:"language-go"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("errorStatusHandler")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("response "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("Response"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" request "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("Request"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\tmessage "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("map")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),e("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"error"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" http"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("StatusText")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("response"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetStatus")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\tresponse"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("JSON")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("response"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetStatus")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" message"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// Use "errorStatusHandler" for empty responses having status 404 or 405.')]),t._v("\nrouter"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("StatusHandler")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("errorStatusHandler"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("404")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("405")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])])}),[],!1,null,null,null);s.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[13],{216:function(t,s,e){"use strict";e.r(s);var a=e(0),n=Object(a.a)({},(function(){var t=this,s=t.$createElement,e=t._self._c||s;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"status-handlers"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#status-handlers"}},[t._v("#")]),t._v(" Status Handlers "),e("Badge",{attrs:{text:"Since v2.4.0"}})],1),t._v(" "),e("p"),e("div",{staticClass:"table-of-contents"},[e("ul",[e("li",[e("a",{attrs:{href:"#introduction"}},[t._v("Introduction")])]),e("li",[e("a",{attrs:{href:"#writing-status-handlers"}},[t._v("Writing status handlers")])]),e("li",[e("a",{attrs:{href:"#registering-status-handlers"}},[t._v("Registering status handlers")])])])]),e("p"),t._v(" "),e("h2",{attrs:{id:"introduction"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#introduction"}},[t._v("#")]),t._v(" Introduction")]),t._v(" "),e("p",[t._v("Status handlers are regular handlers executed during the "),e("strong",[t._v("finalization")]),t._v(" step of the "),e("router-link",{attrs:{to:"/guide/architecture-concepts.html#requests"}},[t._v("request's lifecycle")]),t._v(" if the response body is empty but a status code has been set. Status handler are mainly used to implement a custom behavior for user or server errors (400 and 500 status codes).")],1),t._v(" "),e("p",[t._v("Goyave comes with a default error status handler. When a panic occurs or the "),e("router-link",{attrs:{to:"/guide/basics/responses.html#response-error"}},[e("code",[t._v("Response.Error()")])]),t._v(" method is called, the request's status is set to "),e("code",[t._v("500 Internal Server Error")]),t._v(" and the request error is set. The latter can be accessed using "),e("router-link",{attrs:{to:"/guide/basics/responses.html#response-geterror"}},[e("code",[t._v("Response.GetError()")])]),t._v(". The error is printed in the console. If debugging is enabled in the config, the error is also written in the response using the JSON format, and the stacktrace is printed in the console. If debugging is not enabled, the following is returned:")],1),t._v(" "),e("div",{staticClass:"language-json extra-class"},[e("pre",{pre:!0,attrs:{class:"language-json"}},[e("code",[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v('"error"')]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Internal Server Error"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("p",[t._v("The status handler covering the "),e("code",[t._v("404")]),t._v(", "),e("code",[t._v("405")]),t._v(" and "),e("code",[t._v("501")]),t._v(" to "),e("code",[t._v("511")]),t._v(" status codes has a similar behavior but doesn't print anything to the console. For example, if the user requests a route that doesn't exist, the following is returned:")]),t._v(" "),e("div",{staticClass:"language-json extra-class"},[e("pre",{pre:!0,attrs:{class:"language-json"}},[e("code",[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v('"error"')]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Not Found"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("h2",{attrs:{id:"writing-status-handlers"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#writing-status-handlers"}},[t._v("#")]),t._v(" Writing status handlers")]),t._v(" "),e("p",[t._v("As said earlier, status handlers are regular handlers. The only difference is that they are executed at the very end of the request's lifecycle. Ideally, create a new controller for your status handlers.")]),t._v(" "),e("p",[e("code",[t._v("http/controller/status/status.go")]),t._v(":")]),t._v(" "),e("div",{staticClass:"language-go extra-class"},[e("pre",{pre:!0,attrs:{class:"language-go"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("package")]),t._v(" status\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"github.com/System-Glitch/goyave/v2"')]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("NotFound")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("response "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("goyave"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Response"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" request "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("goyave"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Request"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n response"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("RenderHTML")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("response"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetStatus")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"errors/404.html"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("nil")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("h2",{attrs:{id:"registering-status-handlers"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#registering-status-handlers"}},[t._v("#")]),t._v(" Registering status handlers")]),t._v(" "),e("p",[t._v("Status handlers are registered in the "),e("strong",[t._v("router")]),t._v(".")]),t._v(" "),e("h4",{attrs:{id:"router-statushandler"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#router-statushandler"}},[t._v("#")]),t._v(" Router.StatusHandler")]),t._v(" "),e("p",[t._v("Set a handler for responses with an empty body. The handler will be automatically executed if the request's life-cycle reaches its end and nothing has been written in the response body.")]),t._v(" "),e("p",[t._v("Multiple status codes can be given. The handler will be executed if one of them matches.")]),t._v(" "),e("p",[t._v("Status handlers are "),e("strong",[t._v("inherited")]),t._v(" as a copy in sub-routers. Modifying a child's status handler will not modify its parent's. That means that you can define different status handlers for certain route groupes if you so desire.")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("Parameters")]),t._v(" "),e("th",[t._v("Return")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[e("code",[t._v("handler Handler")])]),t._v(" "),e("td",[e("code",[t._v("void")])])]),t._v(" "),e("tr",[e("td",[e("code",[t._v("status int")])]),t._v(" "),e("td")]),t._v(" "),e("tr",[e("td",[e("code",[t._v("additionalStatuses ...int")])]),t._v(" "),e("td")])])]),t._v(" "),e("p",[e("strong",[t._v("Example:")])]),t._v(" "),e("div",{staticClass:"language-go extra-class"},[e("pre",{pre:!0,attrs:{class:"language-go"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("errorStatusHandler")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("response "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("Response"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" request "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("Request"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\tmessage "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("map")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),e("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"error"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" http"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("StatusText")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("response"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetStatus")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\tresponse"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("JSON")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("response"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetStatus")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" message"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// Use "errorStatusHandler" for empty responses having status 404 or 405.')]),t._v("\nrouter"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("StatusHandler")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("errorStatusHandler"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("404")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("405")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])])}),[],!1,null,null,null);s.default=n.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/23.06395a7d.js b/docs/assets/js/23.06395a7d.js deleted file mode 100644 index 3e84c7f6..00000000 --- a/docs/assets/js/23.06395a7d.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[23],{222:function(e,t,a){"use strict";a.r(t);var v=a(0),i=Object(v.a)({},(function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("h1",{attrs:{id:"changelog"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#changelog"}},[e._v("#")]),e._v(" Changelog")]),e._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#v2-4-2"}},[e._v("v2.4.2")])]),a("li",[a("a",{attrs:{href:"#v2-4-1"}},[e._v("v2.4.1")])]),a("li",[a("a",{attrs:{href:"#v2-4-0"}},[e._v("v2.4.0")])]),a("li",[a("a",{attrs:{href:"#v2-3-0"}},[e._v("v2.3.0")])]),a("li",[a("a",{attrs:{href:"#v2-2-1"}},[e._v("v2.2.1")])]),a("li",[a("a",{attrs:{href:"#v2-2-0"}},[e._v("v2.2.0")])]),a("li",[a("a",{attrs:{href:"#v2-1-0"}},[e._v("v2.1.0")])]),a("li",[a("a",{attrs:{href:"#v2-0-0"}},[e._v("v2.0.0")])])])]),a("p"),e._v(" "),a("h2",{attrs:{id:"v2-4-2"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#v2-4-2"}},[e._v("#")]),e._v(" v2.4.2")]),e._v(" "),a("ul",[a("li",[e._v("Don't override "),a("code",[e._v("Content-Type")]),e._v(" header when sending a file if already set.")])]),e._v(" "),a("h2",{attrs:{id:"v2-4-1"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#v2-4-1"}},[e._v("#")]),e._v(" v2.4.1")]),e._v(" "),a("ul",[a("li",[e._v("Bundle default config and language in executable to avoid needing to deploy "),a("code",[e._v("$GOROOT/pkg/mod/github.com/!system-!glitch/goyave/")]),e._v(" with the application.")])]),e._v(" "),a("h2",{attrs:{id:"v2-4-0"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#v2-4-0"}},[e._v("#")]),e._v(" v2.4.0")]),e._v(" "),a("ul",[a("li",[e._v("Added "),a("router-link",{attrs:{to:"/guide/basics/responses.html#response-render"}},[e._v("template rendring")]),e._v(".")],1),e._v(" "),a("li",[e._v("Fixed PostgreSQL options not working.")]),e._v(" "),a("li",[a("code",[e._v("TestSuite.Middleware()")]),e._v(" now has a more realistic behavior: the finalization step of the request life-cycle is now also executed. This may require your tests to be updated if those check the status code in the response.")]),e._v(" "),a("li",[e._v("Added "),a("router-link",{attrs:{to:"/guide/advanced/status-handlers.html"}},[e._v("status handlers")]),e._v(".")],1)]),e._v(" "),a("h2",{attrs:{id:"v2-3-0"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#v2-3-0"}},[e._v("#")]),e._v(" v2.3.0")]),e._v(" "),a("ul",[a("li",[e._v("Added "),a("router-link",{attrs:{to:"/guide/advanced/cors.html"}},[e._v("CORS options")]),e._v(".")],1)]),e._v(" "),a("h2",{attrs:{id:"v2-2-1"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#v2-2-1"}},[e._v("#")]),e._v(" v2.2.1")]),e._v(" "),a("ul",[a("li",[e._v("Added "),a("code",[e._v("domain")]),e._v(" config entry. This entry is used for url generation, especially for the TLS redirect.")]),e._v(" "),a("li",[e._v("Don't show port in TLS redirect response if ports are standard (80 for HTTP, 443 for HTTPS).")])]),e._v(" "),a("h2",{attrs:{id:"v2-2-0"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#v2-2-0"}},[e._v("#")]),e._v(" v2.2.0")]),e._v(" "),a("ul",[a("li",[e._v("Added "),a("router-link",{attrs:{to:"/guide/advanced/testing.html"}},[e._v("testing API")]),e._v(".")],1),e._v(" "),a("li",[e._v("Fixed links in documentation.")]),e._v(" "),a("li",[e._v("Fixed "),a("code",[e._v("models")]),e._v(" package in template project. (Changed to "),a("code",[e._v("model")]),e._v(")")]),e._v(" "),a("li",[e._v("Added "),a("router-link",{attrs:{to:"/guide/basics/database.html#database-clearregisteredmodels"}},[a("code",[e._v("database.ClearRegisteredModels")])])],1)]),e._v(" "),a("h2",{attrs:{id:"v2-1-0"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#v2-1-0"}},[e._v("#")]),e._v(" v2.1.0")]),e._v(" "),a("ul",[a("li",[a("code",[e._v("filesystem.GetMIMEType")]),e._v(" now detects "),a("code",[e._v("css")]),e._v(", "),a("code",[e._v("js")]),e._v(", "),a("code",[e._v("json")]),e._v(" and "),a("code",[e._v("jsonld")]),e._v(" files based on their extension.")]),e._v(" "),a("li",[e._v("Added maintenance mode.\n"),a("ul",[a("li",[e._v("Can be "),a("router-link",{attrs:{to:"/guide/advanced/multi-services.html#maintenance-mode"}},[e._v("toggled at runtime")]),e._v(".")],1),e._v(" "),a("li",[e._v("The server can be started in maintenance mode using the "),a("code",[e._v("maintenance")]),e._v(" config option. (Defaults to "),a("code",[e._v("false")]),e._v(")")])])]),e._v(" "),a("li",[e._v("Added "),a("router-link",{attrs:{to:"/guide/basics/validation.html#validating-arrays"}},[e._v("advanced array validation")]),e._v(", with support for n-dimensional arrays."),a("Badge",{attrs:{text:"BETA",type:"warn"}})],1),e._v(" "),a("li",[e._v("Malformed request messages can now be localized. ("),a("code",[e._v("malformed-request")]),e._v(" and "),a("code",[e._v("malformed-json")]),e._v(" entries in "),a("code",[e._v("locale.json")]),e._v(")")]),e._v(" "),a("li",[e._v("Modified the validator to allow "),a("router-link",{attrs:{to:"/guide/basics/validation.html#manual-validation"}},[e._v("manual validation")]),e._v(".")],1)]),e._v(" "),a("h2",{attrs:{id:"v2-0-0"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#v2-0-0"}},[e._v("#")]),e._v(" v2.0.0")]),e._v(" "),a("ul",[a("li",[e._v("Documentation and README improvements.")]),e._v(" "),a("li",[e._v("In the configuration:\n"),a("ul",[a("li",[e._v("The default value of "),a("code",[e._v("dbConnection")]),e._v(" has been changed to "),a("code",[e._v("none")]),e._v(".")]),e._v(" "),a("li",[e._v("The default value of "),a("code",[e._v("dbAutoMigrate")]),e._v(" has been changed to "),a("code",[e._v("false")]),e._v(".")])])]),e._v(" "),a("li",[e._v("Added "),a("router-link",{attrs:{to:"/guide/basics/requests.html#accessors"}},[e._v("request data accessors")]),e._v(".")],1),e._v(" "),a("li",[e._v("Some refactoring and package renaming have been done to better respect the Go conventions.\n"),a("ul",[a("li",[e._v("The "),a("code",[e._v("helpers")]),e._v(" package have been renamed to "),a("code",[e._v("helper")])])])]),e._v(" "),a("li",[e._v("The server now shuts down when it encounters an error during startup.")]),e._v(" "),a("li",[e._v("New "),a("router-link",{attrs:{to:"/guide/basics/validation.html#validation-getfieldtype"}},[a("code",[e._v("validation.GetFieldType")])]),e._v(" function.")],1),e._v(" "),a("li",[e._v("Config and Lang are now protected with a "),a("code",[e._v("sync.RWMutex")]),e._v(" to avoid data races in multi-threaded environments.")]),e._v(" "),a("li",[e._v("Greatly improve concurrency.")]),e._v(" "),a("li",[e._v("Config can now be reloaded manually.")]),e._v(" "),a("li",[e._v("Added the "),a("router-link",{attrs:{to:"/guide/basics/middleware.html#trim"}},[a("code",[e._v("Trim")])]),e._v(" middleware.")],1),e._v(" "),a("li",[a("code",[e._v("goyave.Response")]),e._v(" now implements "),a("code",[e._v("http.ResponseWriter")]),e._v(".\n"),a("ul",[a("li",[e._v("All writing functions can now return an error.")])])]),e._v(" "),a("li",[e._v("Added the "),a("router-link",{attrs:{to:"/guide/basics/routing.html#native-handlers"}},[a("code",[e._v("NativeHandler")])]),e._v(" compatibility layer.")],1),e._v(" "),a("li",[e._v("Fixed a bug preventing the static resources handler to find "),a("code",[e._v("index.html")]),e._v(" if a directory with a depth of one was requested without a trailing slash.")]),e._v(" "),a("li",[e._v("Now panics when calling "),a("code",[e._v("Start()")]),e._v(" while the server is already running.")])])])}),[],!1,null,null,null);t.default=i.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/23.f52dc760.js b/docs/assets/js/23.f52dc760.js new file mode 100644 index 00000000..992dc5b4 --- /dev/null +++ b/docs/assets/js/23.f52dc760.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[23],{222:function(e,t,a){"use strict";a.r(t);var v=a(0),i=Object(v.a)({},(function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("h1",{attrs:{id:"changelog"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#changelog"}},[e._v("#")]),e._v(" Changelog")]),e._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#v2-4-2"}},[e._v("v2.4.2")])]),a("li",[a("a",{attrs:{href:"#v2-4-1"}},[e._v("v2.4.1")])]),a("li",[a("a",{attrs:{href:"#v2-4-0"}},[e._v("v2.4.0")])]),a("li",[a("a",{attrs:{href:"#v2-3-0"}},[e._v("v2.3.0")])]),a("li",[a("a",{attrs:{href:"#v2-2-1"}},[e._v("v2.2.1")])]),a("li",[a("a",{attrs:{href:"#v2-2-0"}},[e._v("v2.2.0")])]),a("li",[a("a",{attrs:{href:"#v2-1-0"}},[e._v("v2.1.0")])]),a("li",[a("a",{attrs:{href:"#v2-0-0"}},[e._v("v2.0.0")])])])]),a("p"),e._v(" "),a("h2",{attrs:{id:"v2-4-2"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#v2-4-2"}},[e._v("#")]),e._v(" v2.4.2")]),e._v(" "),a("ul",[a("li",[e._v("Don't override "),a("code",[e._v("Content-Type")]),e._v(" header when sending a file if already set.")]),e._v(" "),a("li",[e._v("Fixed a bug with validation message placeholder "),a("code",[e._v(":values")]),e._v(", which was mistakingly using the "),a("code",[e._v(":value")]),e._v(" placeholder.")])]),e._v(" "),a("h2",{attrs:{id:"v2-4-1"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#v2-4-1"}},[e._v("#")]),e._v(" v2.4.1")]),e._v(" "),a("ul",[a("li",[e._v("Bundle default config and language in executable to avoid needing to deploy "),a("code",[e._v("$GOROOT/pkg/mod/github.com/!system-!glitch/goyave/")]),e._v(" with the application.")])]),e._v(" "),a("h2",{attrs:{id:"v2-4-0"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#v2-4-0"}},[e._v("#")]),e._v(" v2.4.0")]),e._v(" "),a("ul",[a("li",[e._v("Added "),a("router-link",{attrs:{to:"/guide/basics/responses.html#response-render"}},[e._v("template rendring")]),e._v(".")],1),e._v(" "),a("li",[e._v("Fixed PostgreSQL options not working.")]),e._v(" "),a("li",[a("code",[e._v("TestSuite.Middleware()")]),e._v(" now has a more realistic behavior: the finalization step of the request life-cycle is now also executed. This may require your tests to be updated if those check the status code in the response.")]),e._v(" "),a("li",[e._v("Added "),a("router-link",{attrs:{to:"/guide/advanced/status-handlers.html"}},[e._v("status handlers")]),e._v(".")],1)]),e._v(" "),a("h2",{attrs:{id:"v2-3-0"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#v2-3-0"}},[e._v("#")]),e._v(" v2.3.0")]),e._v(" "),a("ul",[a("li",[e._v("Added "),a("router-link",{attrs:{to:"/guide/advanced/cors.html"}},[e._v("CORS options")]),e._v(".")],1)]),e._v(" "),a("h2",{attrs:{id:"v2-2-1"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#v2-2-1"}},[e._v("#")]),e._v(" v2.2.1")]),e._v(" "),a("ul",[a("li",[e._v("Added "),a("code",[e._v("domain")]),e._v(" config entry. This entry is used for url generation, especially for the TLS redirect.")]),e._v(" "),a("li",[e._v("Don't show port in TLS redirect response if ports are standard (80 for HTTP, 443 for HTTPS).")])]),e._v(" "),a("h2",{attrs:{id:"v2-2-0"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#v2-2-0"}},[e._v("#")]),e._v(" v2.2.0")]),e._v(" "),a("ul",[a("li",[e._v("Added "),a("router-link",{attrs:{to:"/guide/advanced/testing.html"}},[e._v("testing API")]),e._v(".")],1),e._v(" "),a("li",[e._v("Fixed links in documentation.")]),e._v(" "),a("li",[e._v("Fixed "),a("code",[e._v("models")]),e._v(" package in template project. (Changed to "),a("code",[e._v("model")]),e._v(")")]),e._v(" "),a("li",[e._v("Added "),a("router-link",{attrs:{to:"/guide/basics/database.html#database-clearregisteredmodels"}},[a("code",[e._v("database.ClearRegisteredModels")])])],1)]),e._v(" "),a("h2",{attrs:{id:"v2-1-0"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#v2-1-0"}},[e._v("#")]),e._v(" v2.1.0")]),e._v(" "),a("ul",[a("li",[a("code",[e._v("filesystem.GetMIMEType")]),e._v(" now detects "),a("code",[e._v("css")]),e._v(", "),a("code",[e._v("js")]),e._v(", "),a("code",[e._v("json")]),e._v(" and "),a("code",[e._v("jsonld")]),e._v(" files based on their extension.")]),e._v(" "),a("li",[e._v("Added maintenance mode.\n"),a("ul",[a("li",[e._v("Can be "),a("router-link",{attrs:{to:"/guide/advanced/multi-services.html#maintenance-mode"}},[e._v("toggled at runtime")]),e._v(".")],1),e._v(" "),a("li",[e._v("The server can be started in maintenance mode using the "),a("code",[e._v("maintenance")]),e._v(" config option. (Defaults to "),a("code",[e._v("false")]),e._v(")")])])]),e._v(" "),a("li",[e._v("Added "),a("router-link",{attrs:{to:"/guide/basics/validation.html#validating-arrays"}},[e._v("advanced array validation")]),e._v(", with support for n-dimensional arrays."),a("Badge",{attrs:{text:"BETA",type:"warn"}})],1),e._v(" "),a("li",[e._v("Malformed request messages can now be localized. ("),a("code",[e._v("malformed-request")]),e._v(" and "),a("code",[e._v("malformed-json")]),e._v(" entries in "),a("code",[e._v("locale.json")]),e._v(")")]),e._v(" "),a("li",[e._v("Modified the validator to allow "),a("router-link",{attrs:{to:"/guide/basics/validation.html#manual-validation"}},[e._v("manual validation")]),e._v(".")],1)]),e._v(" "),a("h2",{attrs:{id:"v2-0-0"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#v2-0-0"}},[e._v("#")]),e._v(" v2.0.0")]),e._v(" "),a("ul",[a("li",[e._v("Documentation and README improvements.")]),e._v(" "),a("li",[e._v("In the configuration:\n"),a("ul",[a("li",[e._v("The default value of "),a("code",[e._v("dbConnection")]),e._v(" has been changed to "),a("code",[e._v("none")]),e._v(".")]),e._v(" "),a("li",[e._v("The default value of "),a("code",[e._v("dbAutoMigrate")]),e._v(" has been changed to "),a("code",[e._v("false")]),e._v(".")])])]),e._v(" "),a("li",[e._v("Added "),a("router-link",{attrs:{to:"/guide/basics/requests.html#accessors"}},[e._v("request data accessors")]),e._v(".")],1),e._v(" "),a("li",[e._v("Some refactoring and package renaming have been done to better respect the Go conventions.\n"),a("ul",[a("li",[e._v("The "),a("code",[e._v("helpers")]),e._v(" package have been renamed to "),a("code",[e._v("helper")])])])]),e._v(" "),a("li",[e._v("The server now shuts down when it encounters an error during startup.")]),e._v(" "),a("li",[e._v("New "),a("router-link",{attrs:{to:"/guide/basics/validation.html#validation-getfieldtype"}},[a("code",[e._v("validation.GetFieldType")])]),e._v(" function.")],1),e._v(" "),a("li",[e._v("Config and Lang are now protected with a "),a("code",[e._v("sync.RWMutex")]),e._v(" to avoid data races in multi-threaded environments.")]),e._v(" "),a("li",[e._v("Greatly improve concurrency.")]),e._v(" "),a("li",[e._v("Config can now be reloaded manually.")]),e._v(" "),a("li",[e._v("Added the "),a("router-link",{attrs:{to:"/guide/basics/middleware.html#trim"}},[a("code",[e._v("Trim")])]),e._v(" middleware.")],1),e._v(" "),a("li",[a("code",[e._v("goyave.Response")]),e._v(" now implements "),a("code",[e._v("http.ResponseWriter")]),e._v(".\n"),a("ul",[a("li",[e._v("All writing functions can now return an error.")])])]),e._v(" "),a("li",[e._v("Added the "),a("router-link",{attrs:{to:"/guide/basics/routing.html#native-handlers"}},[a("code",[e._v("NativeHandler")])]),e._v(" compatibility layer.")],1),e._v(" "),a("li",[e._v("Fixed a bug preventing the static resources handler to find "),a("code",[e._v("index.html")]),e._v(" if a directory with a depth of one was requested without a trailing slash.")]),e._v(" "),a("li",[e._v("Now panics when calling "),a("code",[e._v("Start()")]),e._v(" while the server is already running.")])])])}),[],!1,null,null,null);t.default=i.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/app.82c28168.js b/docs/assets/js/app.c69a104d.js similarity index 98% rename from docs/assets/js/app.82c28168.js rename to docs/assets/js/app.c69a104d.js index 73290080..35819f28 100644 --- a/docs/assets/js/app.82c28168.js +++ b/docs/assets/js/app.c69a104d.js @@ -1,4 +1,4 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[0],[]]);!function(t){function e(e){for(var r,a,s=e[0],l=e[1],c=e[2],f=0,p=[];f
'};function o(t,e,n){return tn?n:t}function i(t){return 100*(-1+t)}n.configure=function(t){var e,n;for(e in t)void 0!==(n=t[e])&&t.hasOwnProperty(e)&&(r[e]=n);return this},n.status=null,n.set=function(t){var e=n.isStarted();t=o(t,r.minimum,1),n.status=1===t?null:t;var l=n.render(!e),c=l.querySelector(r.barSelector),u=r.speed,f=r.easing;return l.offsetWidth,a((function(e){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),s(c,function(t,e,n){var o;return(o="translate3d"===r.positionUsing?{transform:"translate3d("+i(t)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+i(t)+"%,0)"}:{"margin-left":i(t)+"%"}).transition="all "+e+"ms "+n,o}(t,u,f)),1===t?(s(l,{transition:"none",opacity:1}),l.offsetWidth,setTimeout((function(){s(l,{transition:"all "+u+"ms linear",opacity:0}),setTimeout((function(){n.remove(),e()}),u)}),u)):setTimeout(e,u)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var t=function(){setTimeout((function(){n.status&&(n.trickle(),t())}),r.trickleSpeed)};return r.trickle&&t(),this},n.done=function(t){return t||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(t){var e=n.status;return e?("number"!=typeof t&&(t=(1-e)*o(Math.random()*e,.1,.95)),e=o(e+t,0,.994),n.set(e)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},t=0,e=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===e&&n.start(),t++,e++,r.always((function(){0==--e?(t=0,n.done()):n.set((t-e)/t)})),this):this},n.render=function(t){if(n.isRendered())return document.getElementById("nprogress");c(document.documentElement,"nprogress-busy");var e=document.createElement("div");e.id="nprogress",e.innerHTML=r.template;var o,a=e.querySelector(r.barSelector),l=t?"-100":i(n.status||0),u=document.querySelector(r.parent);return s(a,{transition:"all 0 linear",transform:"translate3d("+l+"%,0,0)"}),r.showSpinner||(o=e.querySelector(r.spinnerSelector))&&p(o),u!=document.body&&c(u,"nprogress-custom-parent"),u.appendChild(e),e},n.remove=function(){u(document.documentElement,"nprogress-busy"),u(document.querySelector(r.parent),"nprogress-custom-parent");var t=document.getElementById("nprogress");t&&p(t)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var t=document.body.style,e="WebkitTransform"in t?"Webkit":"MozTransform"in t?"Moz":"msTransform"in t?"ms":"OTransform"in t?"O":"";return e+"Perspective"in t?"translate3d":e+"Transform"in t?"translate":"margin"};var a=function(){var t=[];function e(){var n=t.shift();n&&n(e)}return function(n){t.push(n),1==t.length&&e()}}(),s=function(){var t=["Webkit","O","Moz","ms"],e={};function n(n){return n=n.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(t,e){return e.toUpperCase()})),e[n]||(e[n]=function(e){var n=document.body.style;if(e in n)return e;for(var r,o=t.length,i=e.charAt(0).toUpperCase()+e.slice(1);o--;)if((r=t[o]+i)in n)return r;return e}(n))}function r(t,e,r){e=n(e),t.style[e]=r}return function(t,e){var n,o,i=arguments;if(2==i.length)for(n in e)void 0!==(o=e[n])&&e.hasOwnProperty(n)&&r(t,n,o);else r(t,i[1],i[2])}}();function l(t,e){return("string"==typeof t?t:f(t)).indexOf(" "+e+" ")>=0}function c(t,e){var n=f(t),r=n+e;l(n,e)||(t.className=r.substring(1))}function u(t,e){var n,r=f(t);l(t,e)&&(n=r.replace(" "+e+" "," "),t.className=n.substring(1,n.length-1))}function f(t){return(" "+(t.className||"")+" ").replace(/\s+/gi," ")}function p(t){t&&t.parentNode&&t.parentNode.removeChild(t)}return n})?r.call(e,n,e,t):r)||(t.exports=o)},function(t,e,n){var r=n(5),o=n(26),i=n(13),a=Object.defineProperty;e.f=n(2)?Object.defineProperty:function(t,e,n){if(r(t),e=i(e,!0),r(n),o)try{return a(t,e,n)}catch(t){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(t[e]=n.value),t}},function(t,e,n){var r=n(36),o=n(15);t.exports=function(t){return r(o(t))}},function(t,e){var n=t.exports={version:"2.6.11"};"number"==typeof __e&&(__e=n)},function(t,e,n){var r=n(3);t.exports=function(t,e){if(!r(t))return t;var n,o;if(e&&"function"==typeof(n=t.toString)&&!r(o=n.call(t)))return o;if("function"==typeof(n=t.valueOf)&&!r(o=n.call(t)))return o;if(!e&&"function"==typeof(n=t.toString)&&!r(o=n.call(t)))return o;throw TypeError("Can't convert object to primitive value")}},function(t,e){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(t,e){t.exports=function(t){if(null==t)throw TypeError("Can't call method on "+t);return t}},function(t,e,n){var r=n(10),o=n(21);t.exports=n(2)?function(t,e,n){return r.f(t,e,o(1,n))}:function(t,e,n){return t[e]=n,t}},function(t,e,n){var r=n(1),o=n(16),i=n(6),a=n(24)("src"),s=n(50),l=(""+s).split("toString");n(12).inspectSource=function(t){return s.call(t)},(t.exports=function(t,e,n,s){var c="function"==typeof n;c&&(i(n,"name")||o(n,"name",e)),t[e]!==n&&(c&&(i(n,a)||o(n,a,t[e]?""+t[e]:l.join(String(e)))),t===r?t[e]=n:s?t[e]?t[e]=n:o(t,e,n):(delete t[e],o(t,e,n)))})(Function.prototype,"toString",(function(){return"function"==typeof this&&this[a]||s.call(this)}))},function(t,e){var n={}.toString;t.exports=function(t){return n.call(t).slice(8,-1)}},function(t,e){var n=Math.ceil,r=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?r:n)(t)}},function(t,e,n){var r=n(47);t.exports=function(t,e,n){if(r(t),void 0===e)return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,r){return t.call(e,n,r)};case 3:return function(n,r,o){return t.call(e,n,r,o)}}return function(){return t.apply(e,arguments)}}},function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},function(t,e,n){var r=n(23)("keys"),o=n(24);t.exports=function(t){return r[t]||(r[t]=o(t))}},function(t,e,n){var r=n(12),o=n(1),i=o["__core-js_shared__"]||(o["__core-js_shared__"]={});(t.exports=function(t,e){return i[t]||(i[t]=void 0!==e?e:{})})("versions",[]).push({version:r.version,mode:n(38)?"pure":"global",copyright:"© 2019 Denis Pushkarev (zloirock.ru)"})},function(t,e){var n=0,r=Math.random();t.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++n+r).toString(36))}},function(t,e,n){var r=n(48),o=n(21),i=n(11),a=n(13),s=n(6),l=n(26),c=Object.getOwnPropertyDescriptor;e.f=n(2)?c:function(t,e){if(t=i(t),e=a(e,!0),l)try{return c(t,e)}catch(t){}if(s(t,e))return o(!r.f.call(t,e),t[e])}},function(t,e,n){t.exports=!n(2)&&!n(4)((function(){return 7!=Object.defineProperty(n(27)("div"),"a",{get:function(){return 7}}).a}))},function(t,e,n){var r=n(3),o=n(1).document,i=r(o)&&r(o.createElement);t.exports=function(t){return i?o.createElement(t):{}}},function(t,e,n){var r=n(6),o=n(11),i=n(33)(!1),a=n(22)("IE_PROTO");t.exports=function(t,e){var n,s=o(t),l=0,c=[];for(n in s)n!=a&&r(s,n)&&c.push(n);for(;e.length>l;)r(s,n=e[l++])&&(~i(c,n)||c.push(n));return c}},function(t,e,n){!function(){"use strict";t.exports={polyfill:function(){var t=window,e=document;if(!("scrollBehavior"in e.documentElement.style&&!0!==t.__forceSmoothScrollPolyfill__)){var n,r=t.HTMLElement||t.Element,o=468,i={scroll:t.scroll||t.scrollTo,scrollBy:t.scrollBy,elementScroll:r.prototype.scroll||l,scrollIntoView:r.prototype.scrollIntoView},a=t.performance&&t.performance.now?t.performance.now.bind(t.performance):Date.now,s=(n=t.navigator.userAgent,new RegExp(["MSIE ","Trident/","Edge/"].join("|")).test(n)?1:0);t.scroll=t.scrollTo=function(){void 0!==arguments[0]&&(!0!==c(arguments[0])?v.call(t,e.body,void 0!==arguments[0].left?~~arguments[0].left:t.scrollX||t.pageXOffset,void 0!==arguments[0].top?~~arguments[0].top:t.scrollY||t.pageYOffset):i.scroll.call(t,void 0!==arguments[0].left?arguments[0].left:"object"!=typeof arguments[0]?arguments[0]:t.scrollX||t.pageXOffset,void 0!==arguments[0].top?arguments[0].top:void 0!==arguments[1]?arguments[1]:t.scrollY||t.pageYOffset))},t.scrollBy=function(){void 0!==arguments[0]&&(c(arguments[0])?i.scrollBy.call(t,void 0!==arguments[0].left?arguments[0].left:"object"!=typeof arguments[0]?arguments[0]:0,void 0!==arguments[0].top?arguments[0].top:void 0!==arguments[1]?arguments[1]:0):v.call(t,e.body,~~arguments[0].left+(t.scrollX||t.pageXOffset),~~arguments[0].top+(t.scrollY||t.pageYOffset)))},r.prototype.scroll=r.prototype.scrollTo=function(){if(void 0!==arguments[0])if(!0!==c(arguments[0])){var t=arguments[0].left,e=arguments[0].top;v.call(this,this,void 0===t?this.scrollLeft:~~t,void 0===e?this.scrollTop:~~e)}else{if("number"==typeof arguments[0]&&void 0===arguments[1])throw new SyntaxError("Value could not be converted");i.elementScroll.call(this,void 0!==arguments[0].left?~~arguments[0].left:"object"!=typeof arguments[0]?~~arguments[0]:this.scrollLeft,void 0!==arguments[0].top?~~arguments[0].top:void 0!==arguments[1]?~~arguments[1]:this.scrollTop)}},r.prototype.scrollBy=function(){void 0!==arguments[0]&&(!0!==c(arguments[0])?this.scroll({left:~~arguments[0].left+this.scrollLeft,top:~~arguments[0].top+this.scrollTop,behavior:arguments[0].behavior}):i.elementScroll.call(this,void 0!==arguments[0].left?~~arguments[0].left+this.scrollLeft:~~arguments[0]+this.scrollLeft,void 0!==arguments[0].top?~~arguments[0].top+this.scrollTop:~~arguments[1]+this.scrollTop))},r.prototype.scrollIntoView=function(){if(!0!==c(arguments[0])){var n=d(this),r=n.getBoundingClientRect(),o=this.getBoundingClientRect();n!==e.body?(v.call(this,n,n.scrollLeft+o.left-r.left,n.scrollTop+o.top-r.top),"fixed"!==t.getComputedStyle(n).position&&t.scrollBy({left:r.left,top:r.top,behavior:"smooth"})):t.scrollBy({left:o.left,top:o.top,behavior:"smooth"})}else i.scrollIntoView.call(this,void 0===arguments[0]||arguments[0])}}function l(t,e){this.scrollLeft=t,this.scrollTop=e}function c(t){if(null===t||"object"!=typeof t||void 0===t.behavior||"auto"===t.behavior||"instant"===t.behavior)return!0;if("object"==typeof t&&"smooth"===t.behavior)return!1;throw new TypeError("behavior member of ScrollOptions "+t.behavior+" is not a valid value for enumeration ScrollBehavior.")}function u(t,e){return"Y"===e?t.clientHeight+s1?1:l,n=.5*(1-Math.cos(Math.PI*s)),r=e.startX+(e.x-e.startX)*n,i=e.startY+(e.y-e.startY)*n,e.method.call(e.scrollable,r,i),r===e.x&&i===e.y||t.requestAnimationFrame(h.bind(t,e))}function v(n,r,o){var s,c,u,f,p=a();n===e.body?(s=t,c=t.scrollX||t.pageXOffset,u=t.scrollY||t.pageYOffset,f=i.scroll):(s=n,c=n.scrollLeft,u=n.scrollTop,f=l),h({scrollable:s,method:f,startTime:p,startX:c,startY:u,x:r,y:o})}}}}()},function(t,e){var n="Expected a function",r=NaN,o="[object Symbol]",i=/^\s+|\s+$/g,a=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,l=/^0o[0-7]+$/i,c=parseInt,u="object"==typeof global&&global&&global.Object===Object&&global,f="object"==typeof self&&self&&self.Object===Object&&self,p=u||f||Function("return this")(),d=Object.prototype.toString,h=Math.max,v=Math.min,m=function(){return p.Date.now()};function g(t){var e=typeof t;return!!t&&("object"==e||"function"==e)}function y(t){if("number"==typeof t)return t;if(function(t){return"symbol"==typeof t||function(t){return!!t&&"object"==typeof t}(t)&&d.call(t)==o}(t))return r;if(g(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=g(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=t.replace(i,"");var n=s.test(t);return n||l.test(t)?c(t.slice(2),n?2:8):a.test(t)?r:+t}t.exports=function(t,e,r){var o,i,a,s,l,c,u=0,f=!1,p=!1,d=!0;if("function"!=typeof t)throw new TypeError(n);function b(e){var n=o,r=i;return o=i=void 0,u=e,s=t.apply(r,n)}function _(t){var n=t-c;return void 0===c||n>=e||n<0||p&&t-u>=a}function w(){var t=m();if(_(t))return x(t);l=setTimeout(w,function(t){var n=e-(t-c);return p?v(n,a-(t-u)):n}(t))}function x(t){return l=void 0,d&&o?b(t):(o=i=void 0,s)}function C(){var t=m(),n=_(t);if(o=arguments,i=this,c=t,n){if(void 0===l)return function(t){return u=t,l=setTimeout(w,e),f?b(t):s}(c);if(p)return l=setTimeout(w,e),b(c)}return void 0===l&&(l=setTimeout(w,e)),s}return e=y(e)||0,g(r)&&(f=!!r.leading,a=(p="maxWait"in r)?h(y(r.maxWait)||0,e):a,d="trailing"in r?!!r.trailing:d),C.cancel=function(){void 0!==l&&clearTimeout(l),u=0,o=c=i=l=void 0},C.flush=function(){return void 0===l?s:x(m())},C}},function(t,e,n){var r=n(1),o=n(12),i=n(16),a=n(17),s=n(20),l=function(t,e,n){var c,u,f,p,d=t&l.F,h=t&l.G,v=t&l.S,m=t&l.P,g=t&l.B,y=h?r:v?r[e]||(r[e]={}):(r[e]||{}).prototype,b=h?o:o[e]||(o[e]={}),_=b.prototype||(b.prototype={});for(c in h&&(n=e),n)f=((u=!d&&y&&void 0!==y[c])?y:n)[c],p=g&&u?s(f,r):m&&"function"==typeof f?s(Function.call,f):f,y&&a(y,c,f,t&l.U),b[c]!=f&&i(b,c,p),m&&_[c]!=f&&(_[c]=f)};r.core=o,l.F=1,l.G=2,l.S=4,l.P=8,l.B=16,l.W=32,l.U=64,l.R=128,t.exports=l},function(t,e,n){var r=n(19),o=Math.min;t.exports=function(t){return t>0?o(r(t),9007199254740991):0}},function(t,e,n){var r=n(11),o=n(32),i=n(49);t.exports=function(t){return function(e,n,a){var s,l=r(e),c=o(l.length),u=i(a,c);if(t&&n!=n){for(;c>u;)if((s=l[u++])!=s)return!0}else for(;c>u;u++)if((t||u in l)&&l[u]===n)return t||u||0;return!t&&-1}}},function(t,e,n){var r=n(28),o=n(14);t.exports=Object.keys||function(t){return r(t,o)}},function(t,e,n){var r=n(3),o=n(46).set;t.exports=function(t,e,n){var i,a=e.constructor;return a!==n&&"function"==typeof a&&(i=a.prototype)!==n.prototype&&r(i)&&o&&o(t,i),t}},function(t,e,n){var r=n(18);t.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==r(t)?t.split(""):Object(t)}},function(t,e,n){var r=n(28),o=n(14).concat("length","prototype");e.f=Object.getOwnPropertyNames||function(t){return r(t,o)}},function(t,e){t.exports=!1},function(t,e,n){var r=n(31),o=n(15),i=n(4),a=n(51),s="["+a+"]",l=RegExp("^"+s+s+"*"),c=RegExp(s+s+"*$"),u=function(t,e,n){var o={},s=i((function(){return!!a[t]()||"​…"!="​…"[t]()})),l=o[t]=s?e(f):a[t];n&&(o[n]=l),r(r.P+r.F*s,"String",o)},f=u.trim=function(t,e){return t=String(o(t)),1&e&&(t=t.replace(l,"")),2&e&&(t=t.replace(c,"")),t};t.exports=u},function(t,e,n){var r=n(5),o=n(52),i=n(14),a=n(22)("IE_PROTO"),s=function(){},l=function(){var t,e=n(27)("iframe"),r=i.length;for(e.style.display="none",n(53).appendChild(e),e.src="javascript:",(t=e.contentWindow.document).open(),t.write(" + diff --git a/docs/guide/advanced/cors.html b/docs/guide/advanced/cors.html index b50b9a81..b5dde9da 100644 --- a/docs/guide/advanced/cors.html +++ b/docs/guide/advanced/cors.html @@ -21,7 +21,7 @@ - + @@ -47,6 +47,6 @@ Status Handlers

- + diff --git a/docs/guide/advanced/helpers.html b/docs/guide/advanced/helpers.html index f03828ef..dc76bf39 100644 --- a/docs/guide/advanced/helpers.html +++ b/docs/guide/advanced/helpers.html @@ -21,7 +21,7 @@ - + @@ -78,6 +78,6 @@ Authentication

- + diff --git a/docs/guide/advanced/index.html b/docs/guide/advanced/index.html index cea1c1e2..155f6e88 100644 --- a/docs/guide/advanced/index.html +++ b/docs/guide/advanced/index.html @@ -21,7 +21,7 @@ - + @@ -30,6 +30,6 @@

# Advanced

- + diff --git a/docs/guide/advanced/localization.html b/docs/guide/advanced/localization.html index 97b76e0e..aee52920 100644 --- a/docs/guide/advanced/localization.html +++ b/docs/guide/advanced/localization.html @@ -21,7 +21,7 @@ - + @@ -85,6 +85,6 @@ Testing

- + diff --git a/docs/guide/advanced/multi-services.html b/docs/guide/advanced/multi-services.html index a5e798be..9aa415b1 100644 --- a/docs/guide/advanced/multi-services.html +++ b/docs/guide/advanced/multi-services.html @@ -21,7 +21,7 @@ - + @@ -52,6 +52,6 @@ CORS

- + diff --git a/docs/guide/advanced/status-handlers.html b/docs/guide/advanced/status-handlers.html index 3bc4957a..3ea7db5a 100644 --- a/docs/guide/advanced/status-handlers.html +++ b/docs/guide/advanced/status-handlers.html @@ -21,7 +21,7 @@ - + @@ -54,6 +54,6 @@
- + diff --git a/docs/guide/advanced/testing.html b/docs/guide/advanced/testing.html index 4f4fc17a..227f6c9c 100644 --- a/docs/guide/advanced/testing.html +++ b/docs/guide/advanced/testing.html @@ -21,7 +21,7 @@ - + @@ -178,6 +178,6 @@ Multi-services

- + diff --git a/docs/guide/architecture-concepts.html b/docs/guide/architecture-concepts.html index 7fc76da6..b32f92a2 100644 --- a/docs/guide/architecture-concepts.html +++ b/docs/guide/architecture-concepts.html @@ -21,7 +21,7 @@ - + @@ -72,6 +72,6 @@ Deployment

- + diff --git a/docs/guide/basics/controllers.html b/docs/guide/basics/controllers.html index 0b50125e..cd63828b 100644 --- a/docs/guide/basics/controllers.html +++ b/docs/guide/basics/controllers.html @@ -21,7 +21,7 @@ - + @@ -80,6 +80,6 @@ Responses

- + diff --git a/docs/guide/basics/database.html b/docs/guide/basics/database.html index d2d6a66f..b1194934 100644 --- a/docs/guide/basics/database.html +++ b/docs/guide/basics/database.html @@ -21,7 +21,7 @@ - + @@ -62,6 +62,6 @@ Validation

- + diff --git a/docs/guide/basics/middleware.html b/docs/guide/basics/middleware.html index ac70f65f..c4ffa8fd 100644 --- a/docs/guide/basics/middleware.html +++ b/docs/guide/basics/middleware.html @@ -21,7 +21,7 @@ - + @@ -56,6 +56,6 @@ Requests

- + diff --git a/docs/guide/basics/requests.html b/docs/guide/basics/requests.html index ecd59afa..ecf595a7 100644 --- a/docs/guide/basics/requests.html +++ b/docs/guide/basics/requests.html @@ -21,7 +21,7 @@ - + @@ -83,6 +83,6 @@ Controllers

- + diff --git a/docs/guide/basics/responses.html b/docs/guide/basics/responses.html index 57266349..d6a3bb1b 100644 --- a/docs/guide/basics/responses.html +++ b/docs/guide/basics/responses.html @@ -21,7 +21,7 @@ - + @@ -77,6 +77,6 @@ Database

- + diff --git a/docs/guide/basics/routing.html b/docs/guide/basics/routing.html index 956b84ed..5da012f6 100644 --- a/docs/guide/basics/routing.html +++ b/docs/guide/basics/routing.html @@ -21,7 +21,7 @@ - + @@ -102,6 +102,6 @@ Middleware

- + diff --git a/docs/guide/basics/validation.html b/docs/guide/basics/validation.html index f2bd6b00..243cba85 100644 --- a/docs/guide/basics/validation.html +++ b/docs/guide/basics/validation.html @@ -21,7 +21,7 @@ - + @@ -128,6 +128,6 @@ Helpers

- + diff --git a/docs/guide/changelog.html b/docs/guide/changelog.html index b46f87df..1a4ee429 100644 --- a/docs/guide/changelog.html +++ b/docs/guide/changelog.html @@ -21,7 +21,7 @@ - + @@ -29,7 +29,7 @@ GitHub

# Changelog

# v2.4.2

  • Don't override Content-Type header when sending a file if already set.

# v2.4.1

  • Bundle default config and language in executable to avoid needing to deploy $GOROOT/pkg/mod/github.com/!system-!glitch/goyave/ with the application.

# v2.4.0

  • Added template rendring.
  • Fixed PostgreSQL options not working.
  • TestSuite.Middleware() now has a more realistic behavior: the finalization step of the request life-cycle is now also executed. This may require your tests to be updated if those check the status code in the response.
  • Added status handlers.

# v2.3.0

# v2.2.1

  • Added domain config entry. This entry is used for url generation, especially for the TLS redirect.
  • Don't show port in TLS redirect response if ports are standard (80 for HTTP, 443 for HTTPS).

# v2.2.0

# v2.1.0

  • filesystem.GetMIMEType now detects css, js, json and jsonld files based on their extension.
  • Added maintenance mode. +

    # Changelog

    # v2.4.2

    • Don't override Content-Type header when sending a file if already set.
    • Fixed a bug with validation message placeholder :values, which was mistakingly using the :value placeholder.

    # v2.4.1

    • Bundle default config and language in executable to avoid needing to deploy $GOROOT/pkg/mod/github.com/!system-!glitch/goyave/ with the application.

    # v2.4.0

    • Added template rendring.
    • Fixed PostgreSQL options not working.
    • TestSuite.Middleware() now has a more realistic behavior: the finalization step of the request life-cycle is now also executed. This may require your tests to be updated if those check the status code in the response.
    • Added status handlers.

    # v2.3.0

    # v2.2.1

    • Added domain config entry. This entry is used for url generation, especially for the TLS redirect.
    • Don't show port in TLS redirect response if ports are standard (80 for HTTP, 443 for HTTPS).

    # v2.2.0

    # v2.1.0

    • filesystem.GetMIMEType now detects css, js, json and jsonld files based on their extension.
    • Added maintenance mode.
      • Can be toggled at runtime.
      • The server can be started in maintenance mode using the maintenance config option. (Defaults to false)
    • Added advanced array validation, with support for n-dimensional arrays.BETA
    • Malformed request messages can now be localized. (malformed-request and malformed-json entries in locale.json)
    • Modified the validator to allow manual validation.

    # v2.0.0

    • Documentation and README improvements.
    • In the configuration:
      • The default value of dbConnection has been changed to none.
      • The default value of dbAutoMigrate has been changed to false.
    • Added request data accessors.
    • Some refactoring and package renaming have been done to better respect the Go conventions.
      • The helpers package have been renamed to helper
    • The server now shuts down when it encounters an error during startup.
    • New validation.GetFieldType function.
    • Config and Lang are now protected with a sync.RWMutex to avoid data races in multi-threaded environments.
    • Greatly improve concurrency.
    • Config can now be reloaded manually.
    • Added the Trim middleware.
    • goyave.Response now implements http.ResponseWriter. @@ -38,6 +38,6 @@ Installation

- + diff --git a/docs/guide/configuration.html b/docs/guide/configuration.html index c1e1a258..c0576f69 100644 --- a/docs/guide/configuration.html +++ b/docs/guide/configuration.html @@ -21,7 +21,7 @@ - + @@ -49,6 +49,6 @@ Architecture Concepts

- + diff --git a/docs/guide/contribution-guide.html b/docs/guide/contribution-guide.html index 417dbc22..4843e6f8 100644 --- a/docs/guide/contribution-guide.html +++ b/docs/guide/contribution-guide.html @@ -21,7 +21,7 @@ - + @@ -35,6 +35,6 @@ Routing

- + diff --git a/docs/guide/deployment.html b/docs/guide/deployment.html index 292b8f3c..be5683fe 100644 --- a/docs/guide/deployment.html +++ b/docs/guide/deployment.html @@ -21,7 +21,7 @@ - + @@ -112,6 +112,6 @@ Contributing to Goyave

- + diff --git a/docs/guide/index.html b/docs/guide/index.html index c15f2bca..70787ef9 100644 --- a/docs/guide/index.html +++ b/docs/guide/index.html @@ -21,7 +21,7 @@ - + @@ -32,6 +32,6 @@

# Introduction

Welcome to the Goyave documentation!

This documentation is both a guide and a reference for Goyave application building. You will find instructions covering the basics as well as more advanced topics, from project setup to deployment. But first, let's talk about the framework itself.

Goyave is a framework aiming at cleanliness, fast development and power. Goyave applications stay clean and concise thanks to minimalist function calls and route handlers. The framework gives you all the tools to create an easily readable and maintainable web application, which let you concentrate on the business logic. Although Goyave handles many things for you, such as headers or marshaling, this characteristic doesn't compromise on your freedom of code.

Most golang frameworks for web development don't have a strong directory structure nor conventions to make applications have a uniform architecture and limit redundancy. This makes it difficult to work with them on different projects. In companies, having a well-defined and documented architecture helps new developers integrate projects faster, and reduces the time needed for maintaining them. For open source projects, it helps newcomers understanding the project and makes it easier to contribute.

Note

Please feel free to sudgest changes, ask for more details, report grammar errors, or notice of uncovered scenarios by creating an issue with the proposal template.

# Roadmap

Roadmap

# Next release

  • Direct support for authentication

# Ideas for future releases

  • CLI utility to help creating controllers, middlewares, etc
  • Email helpers
  • Queues/Scheduler system
  • Logging
  • Custom router implementation
  • Named routes
  • Placeholders in language lines and pluralization
  • Support for gzip compression
  • Direct support for the HEAD method
  • And more!

# Contributors

A big "Thank you" to the Goyave contributors:

- + diff --git a/docs/guide/installation.html b/docs/guide/installation.html index 785b0eb9..70a8e749 100644 --- a/docs/guide/installation.html +++ b/docs/guide/installation.html @@ -21,7 +21,7 @@ - + @@ -73,6 +73,6 @@ Upgrade Guide

- + diff --git a/docs/guide/upgrade-guide.html b/docs/guide/upgrade-guide.html index da3c18a1..8f4cd3cc 100644 --- a/docs/guide/upgrade-guide.html +++ b/docs/guide/upgrade-guide.html @@ -21,7 +21,7 @@ - + @@ -36,6 +36,6 @@ Configuration

- + diff --git a/docs/index.html b/docs/index.html index 750857b6..76bfdb20 100644 --- a/docs/index.html +++ b/docs/index.html @@ -21,7 +21,7 @@ - + @@ -36,6 +36,6 @@

Clean

Clean Code

Goyave has an expressive, elegant syntax, a robust structure and conventions. Minimalist calls and reduced redundancy are among the Goyave's core principles.

Fast

Fast Development

Develop faster and concentrate on the business logic of your application thanks to the many helpers and built-in functions.

Powerful

Powerful functionalities

Goyave is accessible, yet powerful. The framework includes routing, request parsing, validation, localization, testing, and more!

- +