github.com/wangyougui/gf/v2@v2.6.5/net/ghttp/ghttp_z_unit_feature_session_test.go (about) 1 // Copyright GoFrame Author(https://goframe.org). All Rights Reserved. 2 // 3 // This Source Code Form is subject to the terms of the MIT License. 4 // If a copy of the MIT was not distributed with this file, 5 // You can obtain one at https://github.com/wangyougui/gf. 6 7 package ghttp_test 8 9 import ( 10 "fmt" 11 "testing" 12 "time" 13 14 "github.com/wangyougui/gf/v2/frame/g" 15 "github.com/wangyougui/gf/v2/net/ghttp" 16 "github.com/wangyougui/gf/v2/test/gtest" 17 "github.com/wangyougui/gf/v2/util/guid" 18 ) 19 20 func Test_Session_Cookie(t *testing.T) { 21 s := g.Server(guid.S()) 22 s.BindHandler("/set", func(r *ghttp.Request) { 23 r.Session.Set(r.Get("k").String(), r.Get("v").String()) 24 }) 25 s.BindHandler("/get", func(r *ghttp.Request) { 26 r.Response.Write(r.Session.Get(r.Get("k").String())) 27 }) 28 s.BindHandler("/remove", func(r *ghttp.Request) { 29 r.Session.Remove(r.Get("k").String()) 30 }) 31 s.BindHandler("/clear", func(r *ghttp.Request) { 32 r.Session.RemoveAll() 33 }) 34 s.SetDumpRouterMap(false) 35 s.Start() 36 defer s.Shutdown() 37 38 time.Sleep(100 * time.Millisecond) 39 gtest.C(t, func(t *gtest.T) { 40 client := g.Client() 41 client.SetBrowserMode(true) 42 client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort())) 43 r1, e1 := client.Get(ctx, "/set?k=key1&v=100") 44 if r1 != nil { 45 defer r1.Close() 46 } 47 t.Assert(e1, nil) 48 t.Assert(r1.ReadAllString(), "") 49 50 t.Assert(client.GetContent(ctx, "/set?k=key2&v=200"), "") 51 52 t.Assert(client.GetContent(ctx, "/get?k=key1"), "100") 53 t.Assert(client.GetContent(ctx, "/get?k=key2"), "200") 54 t.Assert(client.GetContent(ctx, "/get?k=key3"), "") 55 t.Assert(client.GetContent(ctx, "/remove?k=key1"), "") 56 t.Assert(client.GetContent(ctx, "/remove?k=key3"), "") 57 t.Assert(client.GetContent(ctx, "/remove?k=key4"), "") 58 t.Assert(client.GetContent(ctx, "/get?k=key1"), "") 59 t.Assert(client.GetContent(ctx, "/get?k=key2"), "200") 60 t.Assert(client.GetContent(ctx, "/clear"), "") 61 t.Assert(client.GetContent(ctx, "/get?k=key2"), "") 62 }) 63 } 64 65 func Test_Session_Header(t *testing.T) { 66 s := g.Server(guid.S()) 67 s.BindHandler("/set", func(r *ghttp.Request) { 68 r.Session.Set(r.Get("k").String(), r.Get("v").String()) 69 }) 70 s.BindHandler("/get", func(r *ghttp.Request) { 71 r.Response.Write(r.Session.Get(r.Get("k").String())) 72 }) 73 s.BindHandler("/remove", func(r *ghttp.Request) { 74 r.Session.Remove(r.Get("k").String()) 75 }) 76 s.BindHandler("/clear", func(r *ghttp.Request) { 77 r.Session.RemoveAll() 78 }) 79 s.SetDumpRouterMap(false) 80 s.Start() 81 defer s.Shutdown() 82 83 time.Sleep(100 * time.Millisecond) 84 gtest.C(t, func(t *gtest.T) { 85 client := g.Client() 86 client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort())) 87 response, e1 := client.Get(ctx, "/set?k=key1&v=100") 88 if response != nil { 89 defer response.Close() 90 } 91 sessionId := response.GetCookie(s.GetSessionIdName()) 92 t.Assert(e1, nil) 93 t.AssertNE(sessionId, nil) 94 t.Assert(response.ReadAllString(), "") 95 96 client.SetHeader(s.GetSessionIdName(), sessionId) 97 98 t.Assert(client.GetContent(ctx, "/set?k=key2&v=200"), "") 99 100 t.Assert(client.GetContent(ctx, "/get?k=key1"), "100") 101 t.Assert(client.GetContent(ctx, "/get?k=key2"), "200") 102 t.Assert(client.GetContent(ctx, "/get?k=key3"), "") 103 t.Assert(client.GetContent(ctx, "/remove?k=key1"), "") 104 t.Assert(client.GetContent(ctx, "/remove?k=key3"), "") 105 t.Assert(client.GetContent(ctx, "/remove?k=key4"), "") 106 t.Assert(client.GetContent(ctx, "/get?k=key1"), "") 107 t.Assert(client.GetContent(ctx, "/get?k=key2"), "200") 108 t.Assert(client.GetContent(ctx, "/clear"), "") 109 t.Assert(client.GetContent(ctx, "/get?k=key2"), "") 110 }) 111 } 112 113 func Test_Session_StorageFile(t *testing.T) { 114 sessionId := "" 115 s := g.Server(guid.S()) 116 s.BindHandler("/set", func(r *ghttp.Request) { 117 r.Session.Set(r.Get("k").String(), r.Get("v").String()) 118 r.Response.Write(r.Get("k").String(), "=", r.Get("v").String()) 119 }) 120 s.BindHandler("/get", func(r *ghttp.Request) { 121 r.Response.Write(r.Session.Get(r.Get("k").String())) 122 }) 123 s.SetDumpRouterMap(false) 124 s.Start() 125 defer s.Shutdown() 126 127 time.Sleep(100 * time.Millisecond) 128 129 gtest.C(t, func(t *gtest.T) { 130 client := g.Client() 131 client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort())) 132 response, e1 := client.Get(ctx, "/set?k=key&v=100") 133 if response != nil { 134 defer response.Close() 135 } 136 sessionId = response.GetCookie(s.GetSessionIdName()) 137 t.Assert(e1, nil) 138 t.AssertNE(sessionId, nil) 139 t.Assert(response.ReadAllString(), "key=100") 140 }) 141 time.Sleep(time.Second) 142 gtest.C(t, func(t *gtest.T) { 143 client := g.Client() 144 client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort())) 145 client.SetHeader(s.GetSessionIdName(), sessionId) 146 t.Assert(client.GetContent(ctx, "/get?k=key"), "100") 147 t.Assert(client.GetContent(ctx, "/get?k=key1"), "") 148 }) 149 } 150 151 func Test_Session_Custom_Id(t *testing.T) { 152 var ( 153 sessionId = "1234567890" 154 key = "key" 155 value = "value" 156 s = g.Server(guid.S()) 157 ) 158 s.BindHandler("/id", func(r *ghttp.Request) { 159 if err := r.Session.SetId(sessionId); err != nil { 160 r.Response.WriteExit(err.Error()) 161 } 162 if err := r.Session.Set(key, value); err != nil { 163 r.Response.WriteExit(err.Error()) 164 } 165 r.Response.WriteExit(r.Session.Id()) 166 }) 167 s.BindHandler("/value", func(r *ghttp.Request) { 168 r.Response.WriteExit(r.Session.Get(key)) 169 }) 170 s.SetDumpRouterMap(false) 171 s.Start() 172 defer s.Shutdown() 173 174 time.Sleep(100 * time.Millisecond) 175 176 gtest.C(t, func(t *gtest.T) { 177 client := g.Client() 178 client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort())) 179 r, err := client.Get(ctx, "/id") 180 t.AssertNil(err) 181 defer r.Close() 182 t.Assert(r.ReadAllString(), sessionId) 183 t.Assert(r.GetCookie(s.GetSessionIdName()), sessionId) 184 }) 185 gtest.C(t, func(t *gtest.T) { 186 client := g.Client() 187 client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort())) 188 client.SetHeader(s.GetSessionIdName(), sessionId) 189 t.Assert(client.GetContent(ctx, "/value"), value) 190 }) 191 } 192 193 func Test_Session_New_Id(t *testing.T) { 194 var ( 195 sessionId = "1234567890" 196 newSessionId = "0987654321" 197 newSessionId2 = "abcdefghij" 198 key = "key" 199 value = "value" 200 s = g.Server(guid.S()) 201 ) 202 s.BindHandler("/id", func(r *ghttp.Request) { 203 if err := r.Session.SetId(sessionId); err != nil { 204 r.Response.WriteExit(err.Error()) 205 } 206 if err := r.Session.Set(key, value); err != nil { 207 r.Response.WriteExit(err.Error()) 208 } 209 r.Response.WriteExit(r.Session.Id()) 210 }) 211 212 s.BindHandler("/newIdBySession", func(r *ghttp.Request) { 213 // Use before session init 214 if err := r.Session.SetId(newSessionId); err != nil { 215 r.Response.WriteExit(err.Error()) 216 } 217 if err := r.Session.Set(key, value); err != nil { 218 r.Response.WriteExit(err.Error()) 219 } 220 r.Response.WriteExit(r.Session.Id()) 221 }) 222 223 s.BindHandler("/newIdByCookie", func(r *ghttp.Request) { 224 if err := r.Session.Remove("someKey"); err != nil { 225 r.Response.WriteExit(err.Error()) 226 } 227 228 r.Cookie.SetSessionId(newSessionId2) 229 //r.Response.WriteExit(r.Session.Id()) // only change in cookie 230 231 r.Response.WriteExit(newSessionId2) 232 }) 233 234 s.BindHandler("/value", func(r *ghttp.Request) { 235 r.Response.WriteExit(r.Session.Get(key)) 236 }) 237 s.SetDumpRouterMap(false) 238 s.Start() 239 defer s.Shutdown() 240 241 time.Sleep(100 * time.Millisecond) 242 243 gtest.C(t, func(t *gtest.T) { 244 client := g.Client() 245 client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort())) 246 r, err := client.Get(ctx, "/id") 247 t.AssertNil(err) 248 defer r.Close() 249 t.Assert(r.ReadAllString(), sessionId) 250 t.Assert(r.GetCookie(s.GetSessionIdName()), sessionId) 251 }) 252 gtest.C(t, func(t *gtest.T) { 253 client := g.Client() 254 client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort())) 255 client.SetHeader(s.GetSessionIdName(), sessionId) 256 t.Assert(client.GetContent(ctx, "/value"), value) 257 }) 258 259 gtest.C(t, func(t *gtest.T) { 260 client := g.Client() 261 client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort())) 262 client.SetHeader(s.GetSessionIdName(), sessionId) 263 r, err := client.Get(ctx, "/newIdBySession") 264 t.AssertNil(err) 265 defer r.Close() 266 t.Assert(r.ReadAllString(), newSessionId) 267 t.Assert(r.GetCookie(s.GetSessionIdName()), newSessionId) 268 }) 269 270 gtest.C(t, func(t *gtest.T) { 271 client := g.Client() 272 client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort())) 273 r, err := client.Get(ctx, "/newIdByCookie") 274 client.SetHeader(s.GetSessionIdName(), sessionId) 275 t.AssertNil(err) 276 defer r.Close() 277 t.Assert(r.ReadAllString(), newSessionId2) 278 t.Assert(r.GetCookie(s.GetSessionIdName()), newSessionId2) 279 }) 280 }