Skip to content

Commit

Permalink
Cookies: Ability to set custom cookie encoders to encode the cookie's…
Browse files Browse the repository at this point in the history
… value before sent by `ctx.SetCookie` and `ctx.SetCookieKV` and cookie decoders to decode the cookie's value when retrieving from `ctx.GetCookie`. That was the second and final part relative to a community's question at: #1018
  • Loading branch information
kataras committed Jun 2, 2018
1 parent 574414a commit f708c60
Show file tree
Hide file tree
Showing 7 changed files with 496 additions and 68 deletions.
1 change: 1 addition & 0 deletions _examples/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -398,6 +398,7 @@ iris cache library lives on its own [package](https://github.com/kataras/iris/tr
### Cookies

- [Basic](cookies/basic/main.go)
- [Encode/Decode (securecookie)](cookies/securecookie/main.go)

### Sessions

Expand Down
1 change: 1 addition & 0 deletions _examples/README_ZH.md
Original file line number Diff line number Diff line change
Expand Up @@ -397,6 +397,7 @@ Iris 独立缓存包 [package](https://github.com/kataras/iris/tree/master/cache
### Cookies

- [Basic](cookies/basic/main.go)
- [Encode/Decode (securecookie)](cookies/securecookie/main.go)

### Sessions

Expand Down
59 changes: 59 additions & 0 deletions _examples/cookies/securecookie/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package main

// developers can use any library to add a custom cookie encoder/decoder.
// At this example we use the gorilla's securecookie package:
// $ go get github.com/gorilla/securecookie
// $ go run main.go

import (
"github.com/kataras/iris"

"github.com/gorilla/securecookie"
)

var (
// AES only supports key sizes of 16, 24 or 32 bytes.
// You either need to provide exactly that amount or you derive the key from what you type in.
hashKey = []byte("the-big-and-secret-fash-key-here")
blockKey = []byte("lot-secret-of-characters-big-too")
sc = securecookie.New(hashKey, blockKey)
)

func newApp() *iris.Application {
app := iris.New()

// Set A Cookie.
app.Get("/cookies/{name}/{value}", func(ctx iris.Context) {
name := ctx.Params().Get("name")
value := ctx.Params().Get("value")

ctx.SetCookieKV(name, value, iris.CookieEncode(sc.Encode)) // <--

ctx.Writef("cookie added: %s = %s", name, value)
})

// Retrieve A Cookie.
app.Get("/cookies/{name}", func(ctx iris.Context) {
name := ctx.Params().Get("name")

value := ctx.GetCookie(name, iris.CookieDecode(sc.Decode)) // <--

ctx.WriteString(value)
})

// Delete A Cookie.
app.Delete("/cookies/{name}", func(ctx iris.Context) {
name := ctx.Params().Get("name")

ctx.RemoveCookie(name) // <--

ctx.Writef("cookie %s removed", name)
})

return app
}

func main() {
app := newApp()
app.Run(iris.Addr(":8080"))
}
34 changes: 34 additions & 0 deletions _examples/cookies/securecookie/main_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package main

import (
"fmt"
"testing"

"github.com/kataras/iris/httptest"
)

func TestCookiesBasic(t *testing.T) {
app := newApp()
e := httptest.New(t, app, httptest.URL("http://example.com"))

cookieName, cookieValue := "my_cookie_name", "my_cookie_value"

// Test Set A Cookie.
t1 := e.GET(fmt.Sprintf("/cookies/%s/%s", cookieName, cookieValue)).Expect().Status(httptest.StatusOK)
// note that this will not work because it doesn't always returns the same value:
// cookieValueEncoded, _ := sc.Encode(cookieName, cookieValue)
t1.Cookie(cookieName).Value().NotEqual(cookieValue) // validate cookie's existence and value is not on its raw form.
t1.Body().Contains(cookieValue)

// Test Retrieve A Cookie.
t2 := e.GET(fmt.Sprintf("/cookies/%s", cookieName)).Expect().Status(httptest.StatusOK)
t2.Body().Equal(cookieValue)

// Test Remove A Cookie.
t3 := e.DELETE(fmt.Sprintf("/cookies/%s", cookieName)).Expect().Status(httptest.StatusOK)
t3.Body().Contains(cookieName)

t4 := e.GET(fmt.Sprintf("/cookies/%s", cookieName)).Expect().Status(httptest.StatusOK)
t4.Cookies().Empty()
t4.Body().Empty()
}
Loading

0 comments on commit f708c60

Please sign in to comment.